Skip to content

Commit f452638

Browse files
committed
Implemented:
1. UPDATE .. RETURNING col, col as Alias 2. UPDATE .. RETURNING * Tested: 3. UPDATE .. ORDER BY .. LIMIT .. RETURNING 4. UPDATE .. RETURNING Item 4 represents the PostgreSQL UPDATE .. RETURNING Syntax without ORDER BY and LIMIT. See: https://www.postgresql.org/docs/9.5/static/sql-update.html
1 parent 40aba73 commit f452638

File tree

4 files changed

+64
-1
lines changed

4 files changed

+64
-1
lines changed

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
import net.sf.jsqlparser.statement.select.Select;
3535
import net.sf.jsqlparser.statement.select.OrderByElement;
3636
import net.sf.jsqlparser.statement.select.Limit;
37+
import net.sf.jsqlparser.statement.select.SelectExpressionItem;
3738

3839
/**
3940
* The update statement.
@@ -51,6 +52,8 @@ public class Update implements Statement {
5152
private boolean useSelect = false;
5253
private List<OrderByElement> orderByElements;
5354
private Limit limit;
55+
private boolean returningAllColumns = false;
56+
private List<SelectExpressionItem> returningExpressionList = null;
5457

5558
@Override
5659
public void accept(StatementVisitor statementVisitor) {
@@ -157,6 +160,22 @@ public Limit getLimit() {
157160
return limit;
158161
}
159162

163+
public boolean isReturningAllColumns() {
164+
return returningAllColumns;
165+
}
166+
167+
public void setReturningAllColumns(boolean returningAllColumns) {
168+
this.returningAllColumns = returningAllColumns;
169+
}
170+
171+
public List<SelectExpressionItem> getReturningExpressionList() {
172+
return returningExpressionList;
173+
}
174+
175+
public void setReturningExpressionList(List<SelectExpressionItem> returningExpressionList) {
176+
this.returningExpressionList = returningExpressionList;
177+
}
178+
160179
@Override
161180
public String toString() {
162181
StringBuilder b = new StringBuilder("UPDATE ");
@@ -210,6 +229,13 @@ public String toString() {
210229
if (limit != null) {
211230
b.append(limit);
212231
}
232+
233+
if (isReturningAllColumns()) {
234+
b.append(" RETURNING *");
235+
} else if (getReturningExpressionList() != null) {
236+
b.append(" RETURNING ").append(PlainSelect.getStringList(getReturningExpressionList(), true, false));
237+
}
238+
213239
return b.toString();
214240
}
215241
}

src/main/java/net/sf/jsqlparser/util/deparser/UpdateDeParser.java

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
*/
2222
package net.sf.jsqlparser.util.deparser;
2323

24+
import java.util.Iterator;
25+
2426
import net.sf.jsqlparser.expression.Expression;
2527
import net.sf.jsqlparser.expression.ExpressionVisitor;
2628
import net.sf.jsqlparser.schema.Column;
@@ -31,7 +33,7 @@
3133
import net.sf.jsqlparser.statement.select.SelectVisitor;
3234
import net.sf.jsqlparser.statement.select.OrderByVisitor;
3335
import net.sf.jsqlparser.statement.select.OrderByElement;
34-
36+
import net.sf.jsqlparser.statement.select.SelectExpressionItem;
3537
/**
3638
* A class to de-parse (that is, tranform from JSqlParser hierarchy into a
3739
* string) an {@link net.sf.jsqlparser.statement.update.Update}
@@ -125,6 +127,17 @@ public void deParse(Update update) {
125127
new LimitDeparser(buffer).deParse(update.getLimit());
126128
}
127129

130+
if (update.isReturningAllColumns()) {
131+
buffer.append(" RETURNING *");
132+
} else if (update.getReturningExpressionList() != null) {
133+
buffer.append(" RETURNING ");
134+
for (Iterator<SelectExpressionItem> iter = update.getReturningExpressionList().iterator(); iter.hasNext();) {
135+
buffer.append(iter.next().toString());
136+
if (iter.hasNext()) {
137+
buffer.append(", ");
138+
}
139+
}
140+
}
128141
}
129142

130143
public ExpressionVisitor getExpressionVisitor() {

src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,6 +370,7 @@ Update Update():
370370
Limit limit = null;
371371
List<OrderByElement> orderByElements;
372372
boolean useColumnsBrackets = false;
373+
List<SelectExpressionItem> returning = null;
373374
}
374375
{
375376
<K_UPDATE> table=TableWithAlias() { tables.add(table); }
@@ -398,6 +399,12 @@ Update Update():
398399

399400
[ orderByElements = OrderByElements() { update.setOrderByElements(orderByElements); } ]
400401
[ limit = PlainLimit() { update.setLimit(limit); } ]
402+
[ <K_RETURNING> (
403+
"*" { update.setReturningAllColumns(true); }
404+
| returning=ListExpressionItem()
405+
)
406+
]
407+
401408
{
402409
update.setColumns(columns);
403410
update.setExpressions(expList);
@@ -406,6 +413,7 @@ Update Update():
406413
update.setJoins(joins);
407414
update.setSelect(select);
408415
update.setUseColumnsBrackets(useColumnsBrackets);
416+
update.setReturningExpressionList(returning);
409417
return update;
410418
}
411419
}

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

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,22 @@ public void testUpdateWithOrderByAndLimit() throws JSQLParserException {
8686
assertSqlCanBeParsedAndDeparsed("UPDATE tablename SET col = 'thing' WHERE id = 1 ORDER BY col LIMIT 10");
8787
}
8888

89+
@Test
90+
public void testUpdateWithReturningAll() throws JSQLParserException {
91+
assertSqlCanBeParsedAndDeparsed("UPDATE tablename SET col = 'thing' WHERE id = 1 ORDER BY col LIMIT 10 RETURNING *");
92+
assertSqlCanBeParsedAndDeparsed("UPDATE tablename SET col = 'thing' WHERE id = 1 RETURNING *");
93+
}
94+
95+
@Test
96+
public void testUpdateWithReturningList() throws JSQLParserException {
97+
assertSqlCanBeParsedAndDeparsed("UPDATE tablename SET col = 'thing' WHERE id = 1 ORDER BY col LIMIT 10 RETURNING col_1, col_2, col_3");
98+
assertSqlCanBeParsedAndDeparsed("UPDATE tablename SET col = 'thing' WHERE id = 1 RETURNING col_1, col_2, col_3");
99+
assertSqlCanBeParsedAndDeparsed("UPDATE tablename SET col = 'thing' WHERE id = 1 ORDER BY col LIMIT 10 RETURNING col_1 AS Bar, col_2 AS Baz, col_3 AS Foo");
100+
assertSqlCanBeParsedAndDeparsed("UPDATE tablename SET col = 'thing' WHERE id = 1 RETURNING col_1 AS Bar, col_2 AS Baz, col_3 AS Foo");
101+
assertSqlCanBeParsedAndDeparsed("UPDATE tablename SET col = 'thing' WHERE id = 1 RETURNING ABS(col_1) AS Bar, ABS(col_2), col_3 AS Foo");
102+
}
103+
104+
89105
@Test(expected = JSQLParserException.class)
90106
public void testUpdateDoesNotAllowLimitOffset() throws JSQLParserException {
91107
String statement = "UPDATE table1 A SET A.columna = 'XXX' WHERE A.cod_table = 'YYY' LIMIT 3,4";

0 commit comments

Comments
 (0)