Skip to content

Commit 79ce9f2

Browse files
committed
Merge pull request #78 from CeeKayGit/master
Add support for DB2 specials: Updates with Select clause & "$" as standard #LETTER.
2 parents 232795f + aec8251 commit 79ce9f2

File tree

3 files changed

+77
-9
lines changed

3 files changed

+77
-9
lines changed

src/main/java/net/sf/jsqlparser/statement/update/Update.java

Lines changed: 51 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import net.sf.jsqlparser.statement.select.FromItem;
3232
import net.sf.jsqlparser.statement.select.Join;
3333
import net.sf.jsqlparser.statement.select.PlainSelect;
34+
import net.sf.jsqlparser.statement.select.Select;
3435

3536
/**
3637
* The update statement.
@@ -43,6 +44,9 @@ public class Update implements Statement {
4344
private List<Expression> expressions;
4445
private FromItem fromItem;
4546
private List<Join> joins;
47+
private Select select;
48+
private boolean useColumnsBrackets = true;
49+
private boolean useSelect = false;
4650

4751
@Override
4852
public void accept(StatementVisitor statementVisitor) {
@@ -109,16 +113,58 @@ public void setJoins(List<Join> joins) {
109113
this.joins = joins;
110114
}
111115

116+
public Select getSelect() {
117+
return select;
118+
}
119+
120+
public void setSelect(Select select) {
121+
this.select = select;
122+
}
123+
124+
public boolean isUseColumnsBrackets() {
125+
return useColumnsBrackets;
126+
}
127+
128+
public void setUseColumnsBrackets(boolean useColumnsBrackets) {
129+
this.useColumnsBrackets = useColumnsBrackets;
130+
}
131+
132+
public boolean isUseSelect() {
133+
return useSelect;
134+
}
135+
136+
public void setUseSelect(boolean useSelect) {
137+
this.useSelect = useSelect;
138+
}
139+
112140
@Override
113141
public String toString() {
114142
StringBuilder b = new StringBuilder("UPDATE ");
115143
b.append(PlainSelect.getStringList(getTables(), true, false)).append(" SET ");
116-
for (int i = 0; i < getColumns().size(); i++) {
117-
if (i != 0) {
118-
b.append(", ");
144+
145+
if (!useSelect) {
146+
for (int i = 0; i < getColumns().size(); i++) {
147+
if (i != 0) {
148+
b.append(", ");
149+
}
150+
b.append(columns.get(i)).append(" = ");
151+
b.append(expressions.get(i));
152+
}
153+
} else {
154+
if (useColumnsBrackets) {
155+
b.append("(");
156+
}
157+
for (int i = 0; i < getColumns().size(); i++) {
158+
if (i != 0) {
159+
b.append(", ");
160+
}
161+
b.append(columns.get(i));
162+
}
163+
if (useColumnsBrackets) {
164+
b.append(")");
119165
}
120-
b.append(columns.get(i)).append(" = ");
121-
b.append(expressions.get(i));
166+
b.append(" = ");
167+
b.append("(").append(select).append(")");
122168
}
123169

124170
if (fromItem != null) {

src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ SPECIAL_TOKEN:
224224
TOKEN:
225225
{
226226
< S_IDENTIFIER: ( <LETTER> | <ADDITIONAL_LETTERS> )+ ( <DIGIT> | <LETTER> | <ADDITIONAL_LETTERS> | <SPECIAL_CHARS>)* >
227-
| < #LETTER: ["a"-"z", "A"-"Z", "_"] >
227+
| < #LETTER: ["a"-"z", "A"-"Z", "_", "$"] >
228228
| < #SPECIAL_CHARS: "$" | "_" | "#" | "@">
229229
| < S_CHAR_LITERAL: "'" (~["'"])* "'" ("'" (~["'"])* "'")*>
230230
| < S_QUOTED_IDENTIFIER: "\"" (~["\n","\r","\""])* "\"" | ("`" (~["\n","\r","`"])* "`") | ("[" (~["\n","\r","]"])* "]") >
@@ -311,12 +311,27 @@ Update Update():
311311
Expression value = null;
312312
FromItem fromItem = null;
313313
List<Join> joins = null;
314+
Select select = null;
315+
boolean useColumnsBrackets = false;
314316
}
315317
{
316318
<K_UPDATE> table=TableWithAlias() { tables.add(table); }
317319
("," table=TableWithAlias() { tables.add(table); } )*
318-
<K_SET> tableColumn=Column() "=" value=SimpleExpression() { columns.add(tableColumn); expList.add(value); }
319-
("," tableColumn=Column() "=" value=SimpleExpression() { columns.add(tableColumn); expList.add(value); } )*
320+
<K_SET>
321+
(
322+
tableColumn=Column() "=" value=SimpleExpression() { columns.add(tableColumn); expList.add(value); }
323+
("," tableColumn=Column() "=" value=SimpleExpression() { columns.add(tableColumn); expList.add(value); } )*
324+
325+
|
326+
327+
[LOOKAHEAD(2) "(" { useColumnsBrackets = true; }] tableColumn=Column() { columns.add(tableColumn); } ("," tableColumn=Column() { columns.add(tableColumn); } )* [ ")" ] "="
328+
"("
329+
(
330+
{ update.setUseSelect(true); }
331+
select = Select()
332+
)
333+
")"
334+
)
320335

321336
[ <K_FROM>
322337
fromItem=FromItem()
@@ -329,6 +344,8 @@ Update Update():
329344
update.setTables(tables);
330345
update.setFromItem(fromItem);
331346
update.setJoins(joins);
347+
update.setSelect(select);
348+
update.setUseColumnsBrackets(useColumnsBrackets);
332349
return update;
333350
}
334351
}
@@ -2369,4 +2386,4 @@ Alter Alter():
23692386
alter.setDataType(dataType);
23702387
return alter;
23712388
}
2372-
}
2389+
}

src/test/java/net/sf/jsqlparser/test/update/UpdateTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,4 +55,9 @@ public void testUpdateWithFrom() throws JSQLParserException {
5555
public void testUpdateMultiTable() throws JSQLParserException {
5656
assertSqlCanBeParsedAndDeparsed("UPDATE T1, T2 SET T1.C2 = T2.C2, T2.C3 = 'UPDATED' WHERE T1.C1 = T2.C1 AND T1.C2 < 10");
5757
}
58+
59+
@Test
60+
public void testUpdateWithSelect() throws JSQLParserException {
61+
assertSqlCanBeParsedAndDeparsed("UPDATE NATION SET (N_NATIONKEY) = (SELECT ? FROM SYSIBM.SYSDUMMY1)");
62+
}
5863
}

0 commit comments

Comments
 (0)