Skip to content

Commit ce1d627

Browse files
committed
Merge origin/master
2 parents f1d2136 + f1c9835 commit ce1d627

File tree

14 files changed

+256
-29
lines changed

14 files changed

+256
-29
lines changed

README.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ Also I would like to know about needed examples or documentation stuff.
3838

3939
## Extensions in the latest SNAPSHOT version 0.9.5
4040

41+
* support for **insert ... on duplicate key update**
42+
* improved support for **alter table** statements
4143
* first Oracle hint support for **select** statements
4244
* first **alter table foreign key** support
4345
* first **merge** support

src/main/java/net/sf/jsqlparser/statement/alter/Alter.java

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ public class Alter implements Statement {
4242
private List<String> ukColumns;
4343
private String ukName;
4444
private ForeignKeyIndex fkIndex = null;
45+
private String operation;
46+
private String constraintName;
4547

4648
private boolean onDeleteCascade;
4749

@@ -93,6 +95,14 @@ public void setFkSourceTable(String fkSourceTable) {
9395
this.fkSourceTable = fkSourceTable;
9496
}
9597

98+
public String getOperation() {
99+
return operation;
100+
}
101+
102+
public void setOperation(String operation) {
103+
this.operation = operation;
104+
}
105+
96106
private List<String> fkSourceColumns;
97107

98108
public List<String> getFkSourceColumns() {
@@ -119,6 +129,14 @@ public void setColumnName(String columnName) {
119129
this.columnName = columnName;
120130
}
121131

132+
public String getConstraintName() {
133+
return this.constraintName;
134+
}
135+
136+
public void setConstraintName(final String constraintName) {
137+
this.constraintName = constraintName;
138+
}
139+
122140
public ColDataType getDataType() {
123141
return dataType;
124142
}
@@ -167,9 +185,14 @@ public void setFkIndex(ForeignKeyIndex fkIndex) {
167185
@Override
168186
public String toString() {
169187
StringBuilder b = new StringBuilder();
170-
b.append("ALTER TABLE ").append(table.getFullyQualifiedName()).append(" ADD ");
188+
b.append("ALTER TABLE ").append(table.getFullyQualifiedName()).append(" ").append(operation).append(" ");
171189
if (columnName != null) {
172-
b.append("COLUMN ").append(columnName).append(" ").append(dataType.toString());
190+
b.append("COLUMN ").append(columnName);
191+
if (dataType != null) {
192+
b.append(" ").append(dataType.toString());
193+
}
194+
} else if (constraintName != null) {
195+
b.append("CONSTRAINT ").append(constraintName);
173196
} else if (pkColumns != null) {
174197
b.append("PRIMARY KEY (").append(PlainSelect.getStringList(pkColumns)).append(")");
175198
} else if (ukColumns != null) {

src/main/java/net/sf/jsqlparser/statement/drop/Drop.java

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public class Drop implements Statement {
3333
private String type;
3434
private Table name;
3535
private List<String> parameters;
36+
private boolean ifExists = false;
3637

3738
@Override
3839
public void accept(StatementVisitor statementVisitor) {
@@ -63,9 +64,18 @@ public void setType(String string) {
6364
type = string;
6465
}
6566

67+
public boolean isIfExists() {
68+
return ifExists;
69+
}
70+
71+
public void setIfExists(boolean ifExists) {
72+
this.ifExists = ifExists;
73+
}
74+
6675
@Override
6776
public String toString() {
68-
String sql = "DROP " + type + " " + name.toString();
77+
String sql = "DROP " + type + " "
78+
+ (ifExists?"IF EXISTS ":"") + name.toString();
6979

7080
if (parameters != null && parameters.size() > 0) {
7181
sql += " " + PlainSelect.getStringList(parameters);

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/TablesNamesFinder.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
/**
5252
* Find all used tables within an select statement.
5353
*/
54-
public class TablesNamesFinder implements SelectVisitor, FromItemVisitor, ExpressionVisitor, ItemsListVisitor, SelectItemVisitor, StatementVisitor {
54+
public class TablesNamesFinder implements SelectVisitor, FromItemVisitor, ExpressionVisitor, ItemsListVisitor, SelectItemVisitor, StatementVisitor {
5555

5656
private List<String> tables;
5757
/**
@@ -136,7 +136,7 @@ public List<String> getTableList(CreateTable create) {
136136
create.accept(this);
137137
return tables;
138138
}
139-
139+
140140
public List<String> getTableList(Expression expr) {
141141
init();
142142
expr.accept(this);
@@ -157,7 +157,9 @@ public void visit(PlainSelect plainSelect) {
157157
}
158158
}
159159

160-
plainSelect.getFromItem().accept(this);
160+
if (plainSelect.getFromItem() != null) {
161+
plainSelect.getFromItem().accept(this);
162+
}
161163

162164
if (plainSelect.getJoins() != null) {
163165
for (Join join : plainSelect.getJoins()) {
@@ -624,18 +626,18 @@ public void visit(RowConstructor rowConstructor) {
624626
}
625627
}
626628

627-
@Override
628-
public void visit(HexValue hexValue) {
629-
630-
}
629+
@Override
630+
public void visit(HexValue hexValue) {
631+
632+
}
631633

632634
@Override
633635
public void visit(Merge merge) {
634636
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
635637
}
636-
638+
637639
@Override
638640
public void visit(OracleHint hint) {
639641
}
640-
642+
641643
}
Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
/*
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2015 JSQLParser
6+
* %%
7+
* This program is free software: you can redistribute it and/or modify
8+
* it under the terms of the GNU Lesser General Public License as
9+
* published by the Free Software Foundation, either version 2.1 of the
10+
* License, or (at your option) any later version.
11+
*
12+
* This program is distributed in the hope that it will be useful,
13+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15+
* GNU General Lesser Public License for more details.
16+
*
17+
* You should have received a copy of the GNU General Lesser Public
18+
* License along with this program. If not, see
19+
* <http://www.gnu.org/licenses/lgpl-2.1.html>.
20+
* #L%
21+
*/
22+
package net.sf.jsqlparser.util.deparser;
23+
24+
25+
import net.sf.jsqlparser.statement.drop.Drop;
26+
import net.sf.jsqlparser.statement.select.PlainSelect;
27+
28+
/**
29+
* @author tw
30+
*/
31+
public class DropDeParser {
32+
33+
private StringBuilder buffer;
34+
35+
public DropDeParser(StringBuilder buffer) {
36+
this.buffer = buffer;
37+
}
38+
39+
public void deParse(Drop drop) {
40+
buffer.append("DROP ");
41+
buffer.append(drop.getType());
42+
if (drop.isIfExists())
43+
buffer.append(" IF EXISTS");
44+
45+
buffer.append(" ").append(drop.getName());
46+
47+
if (drop.getParameters() != null && drop.getParameters().size() > 0) {
48+
buffer.append(" ").append(PlainSelect.getStringList(drop.getParameters()));
49+
}
50+
}
51+
52+
public StringBuilder getBuffer() {
53+
return buffer;
54+
}
55+
56+
public void setBuffer(StringBuilder buffer) {
57+
this.buffer = buffer;
58+
}
59+
60+
}

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/java/net/sf/jsqlparser/util/deparser/StatementDeParser.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,8 @@ public void visit(Delete delete) {
7979

8080
@Override
8181
public void visit(Drop drop) {
82-
// TODO Auto-generated method stub
82+
DropDeParser dropDeParser = new DropDeParser(buffer);
83+
dropDeParser.deParse(drop);
8384
}
8485

8586
@Override
@@ -90,7 +91,6 @@ public void visit(Insert insert) {
9091
selectDeParser.setExpressionVisitor(expressionDeParser);
9192
InsertDeParser insertDeParser = new InsertDeParser(expressionDeParser, selectDeParser, buffer);
9293
insertDeParser.deParse(insert);
93-
9494
}
9595

9696
@Override

0 commit comments

Comments
 (0)