Skip to content

Commit 18cf905

Browse files
committed
Merge pull request #192 from packageOk/master
support on duplicate key update and update replaceDeParser
2 parents 44091c6 + 3c6057b commit 18cf905

File tree

5 files changed

+85
-6
lines changed

5 files changed

+85
-6
lines changed

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

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323

2424
import java.util.List;
2525

26+
import net.sf.jsqlparser.expression.Expression;
2627
import net.sf.jsqlparser.expression.operators.relational.ItemsList;
2728
import net.sf.jsqlparser.schema.Column;
2829
import net.sf.jsqlparser.schema.Table;
@@ -44,6 +45,9 @@ public class Insert implements Statement {
4445
private boolean useValues = true;
4546
private Select select;
4647
private boolean useSelectBrackets = true;
48+
private boolean useDuplicate = false;
49+
private List<Column> duplicateUpdateColumns;
50+
private List<Expression> duplicateUpdateExpressionList;
4751

4852
private boolean returningAllColumns = false;
4953

@@ -128,6 +132,30 @@ public void setUseSelectBrackets(boolean useSelectBrackets) {
128132
this.useSelectBrackets = useSelectBrackets;
129133
}
130134

135+
public boolean isUseDuplicate() {
136+
return useDuplicate;
137+
}
138+
139+
public void setUseDuplicate(boolean useDuplicate) {
140+
this.useDuplicate = useDuplicate;
141+
}
142+
143+
public List<Column> getDuplicateUpdateColumns() {
144+
return duplicateUpdateColumns;
145+
}
146+
147+
public void setDuplicateUpdateColumns(List<Column> duplicateUpdateColumns) {
148+
this.duplicateUpdateColumns = duplicateUpdateColumns;
149+
}
150+
151+
public List<Expression> getDuplicateUpdateExpressionList() {
152+
return duplicateUpdateExpressionList;
153+
}
154+
155+
public void setDuplicateUpdateExpressionList(List<Expression> duplicateUpdateExpressionList) {
156+
this.duplicateUpdateExpressionList = duplicateUpdateExpressionList;
157+
}
158+
131159
@Override
132160
public String toString() {
133161
StringBuilder sql = new StringBuilder();
@@ -156,6 +184,17 @@ public String toString() {
156184
sql.append(")");
157185
}
158186

187+
if (useDuplicate){
188+
sql.append(" ON DUPLICATE KEY UPDATE ");
189+
for (int i = 0; i < getDuplicateUpdateColumns().size(); i++) {
190+
if (i != 0) {
191+
sql.append(", ");
192+
}
193+
sql.append(duplicateUpdateColumns.get(i)).append(" = ");
194+
sql.append(duplicateUpdateExpressionList.get(i));
195+
}
196+
}
197+
159198
if (isReturningAllColumns()) {
160199
sql.append(" RETURNING *");
161200
} else if (getReturningExpressionList() != null) {

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,20 @@ public void deParse(Insert insert) {
110110
}
111111
}
112112

113+
if(insert.isUseDuplicate()){
114+
buffer.append(" ON DUPLICATE KEY UPDATE ");
115+
for (int i = 0; i < insert.getDuplicateUpdateColumns().size(); i++) {
116+
Column column = insert.getDuplicateUpdateColumns().get(i);
117+
buffer.append(column.getFullyQualifiedName()).append(" = ");
118+
119+
Expression expression = insert.getDuplicateUpdateExpressionList().get(i);
120+
expression.accept(expressionVisitor);
121+
if (i < insert.getDuplicateUpdateColumns().size() - 1) {
122+
buffer.append(", ");
123+
}
124+
}
125+
}
126+
113127
if (insert.isReturningAllColumns()) {
114128
buffer.append(" RETURNING *");
115129
} else if (insert.getReturningExpressionList() != null) {

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

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -106,11 +106,12 @@ public void deParse(Replace replace) {
106106
// REPLACE mytab SELECT * FROM mytab2
107107
// or VALUES ('as', ?, 565)
108108

109-
if (replace.isUseValues()) {
110-
buffer.append(" VALUES");
111-
}
112-
113-
buffer.append(replace.getItemsList());
109+
// if (replace.isUseValues()) {
110+
// buffer.append(" VALUES");
111+
// }
112+
//
113+
// buffer.append(replace.getItemsList());
114+
replace.getItemsList().accept(this);
114115
}
115116
}
116117

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

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,9 @@ Insert Insert():
458458
List<SelectExpressionItem> returning = null;
459459
Select select = null;
460460
boolean useSelectBrackets = false;
461+
boolean useDuplicate = false;
462+
List<Column> duplicateUpdateColumns = null;
463+
List<Expression> duplicateUpdateExpressionList = null;
461464
}
462465
{
463466
<K_INSERT> [<K_INTO>] table=Table()
@@ -490,6 +493,20 @@ Insert Insert():
490493
)
491494
)
492495

496+
[ "ON DUPLICATE KEY UPDATE"
497+
{ useDuplicate = true;}
498+
tableColumn=Column() "=" exp=SimpleExpression()
499+
{
500+
duplicateUpdateColumns = new ArrayList<Column>();
501+
duplicateUpdateExpressionList = new ArrayList<Expression>();
502+
duplicateUpdateColumns.add(tableColumn);
503+
duplicateUpdateExpressionList.add(exp);
504+
}
505+
("," tableColumn=Column() "=" exp=SimpleExpression()
506+
{ duplicateUpdateColumns.add(tableColumn);
507+
duplicateUpdateExpressionList.add(exp); } )*]
508+
509+
493510
[ <K_RETURNING> (
494511
"*" { insert.setReturningAllColumns(true); }
495512
| returning=ListExpressionItem()
@@ -503,6 +520,9 @@ Insert Insert():
503520
insert.setTable(table);
504521
if (columns.size() > 0)
505522
insert.setColumns(columns);
523+
insert.setUseDuplicate(useDuplicate);
524+
insert.setDuplicateUpdateColumns(duplicateUpdateColumns);
525+
insert.setDuplicateUpdateExpressionList(duplicateUpdateExpressionList);
506526
insert.setReturningExpressionList(returning);
507527
return insert;
508528
}

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
import net.sf.jsqlparser.schema.Table;
1414
import net.sf.jsqlparser.statement.insert.Insert;
1515
import net.sf.jsqlparser.statement.select.PlainSelect;
16-
import static net.sf.jsqlparser.test.TestUtils.*;
16+
import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;
1717
import static org.junit.Assert.*;
1818

1919
import org.junit.Test;
@@ -147,4 +147,9 @@ public void testHexValues2() throws JSQLParserException {
147147
public void testHexValues3() throws JSQLParserException {
148148
assertSqlCanBeParsedAndDeparsed("INSERT INTO TABLE2 VALUES ('1', \"DSDD\", 0xabcde)");
149149
}
150+
151+
@Test
152+
public void testDuplicateKey() throws JSQLParserException {
153+
assertSqlCanBeParsedAndDeparsed("INSERT INTO Users0 (UserId, Key, Value) VALUES (51311, 'T_211', 18) ON DUPLICATE KEY UPDATE Value = 18");
154+
}
150155
}

0 commit comments

Comments
 (0)