Skip to content

Commit 4e3d7a5

Browse files
authored
Add support for insert as row_alias (#2383)
* Add support for insert as row_alias * format code
1 parent 7c52e7f commit 4e3d7a5

File tree

4 files changed

+54
-16
lines changed

4 files changed

+54
-16
lines changed

src/main/java/net/sf/jsqlparser/statement/insert/Insert.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
*/
1010
package net.sf.jsqlparser.statement.insert;
1111

12+
import net.sf.jsqlparser.expression.Alias;
1213
import net.sf.jsqlparser.expression.OracleHint;
1314
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
1415
import net.sf.jsqlparser.schema.Column;
@@ -53,6 +54,7 @@ public class Insert implements Statement {
5354
private InsertConflictTarget conflictTarget;
5455
private InsertConflictAction conflictAction;
5556
private InsertDuplicateAction duplicateAction;
57+
private Alias rowAlias;
5658

5759
public List<UpdateSet> getDuplicateUpdateSets() {
5860
if (duplicateAction != null) {
@@ -340,6 +342,9 @@ public String toString() {
340342
if (setUpdateSets != null && !setUpdateSets.isEmpty()) {
341343
sql.append("SET ");
342344
sql = UpdateSet.appendUpdateSetsTo(sql, setUpdateSets);
345+
if (rowAlias != null) {
346+
sql.append(" ").append(rowAlias);
347+
}
343348
}
344349

345350
if (duplicateAction != null) {
@@ -411,4 +416,12 @@ public InsertDuplicateAction getDuplicateAction() {
411416
public void setDuplicateAction(InsertDuplicateAction duplicateAction) {
412417
this.duplicateAction = duplicateAction;
413418
}
419+
420+
public Alias getRowAlias() {
421+
return rowAlias;
422+
}
423+
424+
public void setRowAlias(Alias rowAlias) {
425+
this.rowAlias = rowAlias;
426+
}
414427
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,9 @@ public void deParse(Insert insert) {
113113
if (insert.getSetUpdateSets() != null) {
114114
builder.append(" SET ");
115115
deparseUpdateSets(insert.getSetUpdateSets(), builder, expressionVisitor);
116+
if (insert.getRowAlias() != null) {
117+
builder.append(" ").append(insert.getRowAlias());
118+
}
116119
}
117120

118121
if (insert.getDuplicateAction() != null) {

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2811,6 +2811,8 @@ Insert Insert():
28112811

28122812
String name = null;
28132813
boolean useAs = false;
2814+
boolean useSet = false;
2815+
Alias rowAlias = null;
28142816
OutputClause outputClause = null;
28152817

28162818
InsertConflictTarget conflictTarget = null;
@@ -2848,12 +2850,20 @@ Insert Insert():
28482850
<K_DEFAULT> <K_VALUES> { insert.setOnlyDefaultValues(true); }
28492851
|
28502852
(
2851-
<K_SET> updateSets = UpdateSets() { insert.withSetUpdateSets(updateSets); }
2853+
<K_SET> updateSets = UpdateSets() { insert.withSetUpdateSets(updateSets); useSet = true; }
28522854
)
28532855
|
28542856
select = Select()
28552857
)
28562858

2859+
[ LOOKAHEAD(2, { select instanceof Values || useSet }) rowAlias = Alias() {
2860+
if (select instanceof Values) {
2861+
select.setAlias(rowAlias);
2862+
} else {
2863+
insert.setRowAlias(rowAlias);
2864+
}
2865+
} ]
2866+
28572867
[ LOOKAHEAD(2) <K_ON> <K_DUPLICATE> <K_KEY> <K_UPDATE>
28582868
duplicateAction = InsertDuplicateAction() { insert.setDuplicateAction(duplicateAction); }
28592869
]

src/test/java/net/sf/jsqlparser/statement/insert/InsertTest.java

Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,20 @@
99
*/
1010
package net.sf.jsqlparser.statement.insert;
1111

12+
import static net.sf.jsqlparser.test.TestUtils.assertDeparse;
13+
import static net.sf.jsqlparser.test.TestUtils.assertOracleHintExists;
14+
import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;
15+
import static net.sf.jsqlparser.test.TestUtils.assertStatementCanBeDeparsedAs;
16+
import static org.junit.jupiter.api.Assertions.assertEquals;
17+
import static org.junit.jupiter.api.Assertions.assertFalse;
18+
import static org.junit.jupiter.api.Assertions.assertNotNull;
19+
import static org.junit.jupiter.api.Assertions.assertNull;
20+
import static org.junit.jupiter.api.Assertions.assertThrows;
21+
import static org.junit.jupiter.api.Assertions.assertThrowsExactly;
22+
import static org.junit.jupiter.api.Assertions.assertTrue;
23+
24+
import java.io.StringReader;
25+
import java.util.List;
1226
import net.sf.jsqlparser.JSQLParserException;
1327
import net.sf.jsqlparser.expression.Alias;
1428
import net.sf.jsqlparser.expression.DoubleValue;
@@ -34,21 +48,6 @@
3448
import org.junit.jupiter.params.ParameterizedTest;
3549
import org.junit.jupiter.params.provider.ValueSource;
3650

37-
import java.io.StringReader;
38-
import java.util.List;
39-
40-
import static net.sf.jsqlparser.test.TestUtils.assertDeparse;
41-
import static net.sf.jsqlparser.test.TestUtils.assertOracleHintExists;
42-
import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;
43-
import static net.sf.jsqlparser.test.TestUtils.assertStatementCanBeDeparsedAs;
44-
import static org.junit.jupiter.api.Assertions.assertEquals;
45-
import static org.junit.jupiter.api.Assertions.assertFalse;
46-
import static org.junit.jupiter.api.Assertions.assertNotNull;
47-
import static org.junit.jupiter.api.Assertions.assertNull;
48-
import static org.junit.jupiter.api.Assertions.assertThrows;
49-
import static org.junit.jupiter.api.Assertions.assertThrowsExactly;
50-
import static org.junit.jupiter.api.Assertions.assertTrue;
51-
5251
public class InsertTest {
5352

5453
private final CCJSqlParserManager parserManager = new CCJSqlParserManager();
@@ -395,10 +394,23 @@ public void testInsertValuesWithDuplicateEliminationInDeparsing() throws JSQLPar
395394
+ "ON DUPLICATE KEY UPDATE COUNTER = COUNTER + 1");
396395
}
397396

397+
@Test
398+
public void testInsertValuesAliasWithDuplicateEliminationIssue() throws JSQLParserException {
399+
assertSqlCanBeParsedAndDeparsed("INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new"
400+
+ " ON DUPLICATE KEY UPDATE c = new.a+new.b;");
401+
402+
assertSqlCanBeParsedAndDeparsed(
403+
"INSERT INTO t1 (a,b,c) VALUES (1,2,3),(4,5,6) AS new(m,n,p) "
404+
+ " ON DUPLICATE KEY UPDATE c = m+n;");
405+
}
406+
398407
@Test
399408
public void testInsertSetWithDuplicateEliminationInDeparsing() throws JSQLParserException {
400409
assertSqlCanBeParsedAndDeparsed("INSERT INTO mytable SET col1 = 122 "
401410
+ "ON DUPLICATE KEY UPDATE col2 = col2 + 1, col3 = 'saint'");
411+
412+
assertSqlCanBeParsedAndDeparsed("INSERT INTO t1 SET a=1,b=2,c=3 AS new"
413+
+ " ON DUPLICATE KEY UPDATE c = new.a+new.b;");
402414
}
403415

404416
@Test

0 commit comments

Comments
 (0)