Skip to content

Commit c032744

Browse files
committed
integrated values statement
1 parent de8ad10 commit c032744

File tree

8 files changed

+172
-0
lines changed

8 files changed

+172
-0
lines changed

src/main/java/net/sf/jsqlparser/statement/StatementVisitor.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import net.sf.jsqlparser.statement.truncate.Truncate;
3737
import net.sf.jsqlparser.statement.update.Update;
3838
import net.sf.jsqlparser.statement.upsert.Upsert;
39+
import net.sf.jsqlparser.statement.values.ValuesStatement;
3940

4041
public interface StatementVisitor {
4142

@@ -79,4 +80,5 @@ public interface StatementVisitor {
7980

8081
void visit(Block block);
8182

83+
void visit(ValuesStatement values);
8284
}

src/main/java/net/sf/jsqlparser/statement/StatementVisitorAdapter.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import net.sf.jsqlparser.statement.truncate.Truncate;
3737
import net.sf.jsqlparser.statement.update.Update;
3838
import net.sf.jsqlparser.statement.upsert.Upsert;
39+
import net.sf.jsqlparser.statement.values.ValuesStatement;
3940

4041
public class StatementVisitorAdapter implements StatementVisitor {
4142

@@ -136,4 +137,8 @@ public void visit(UseStatement use) {
136137
@Override
137138
public void visit(Block block) {
138139
}
140+
141+
@Override
142+
public void visit(ValuesStatement values) {
143+
}
139144
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/*
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2013 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.statement.values;
23+
24+
import java.util.List;
25+
import net.sf.jsqlparser.expression.Expression;
26+
import net.sf.jsqlparser.statement.Statement;
27+
import net.sf.jsqlparser.statement.StatementVisitor;
28+
import net.sf.jsqlparser.statement.select.PlainSelect;
29+
30+
/**
31+
* The replace statement.
32+
*/
33+
public class ValuesStatement implements Statement {
34+
35+
private List<Expression> expressions;
36+
37+
public ValuesStatement(List<Expression> expressions) {
38+
this.expressions = expressions;
39+
}
40+
41+
@Override
42+
public void accept(StatementVisitor statementVisitor) {
43+
statementVisitor.visit(this);
44+
}
45+
46+
public List<Expression> getExpressions() {
47+
return expressions;
48+
}
49+
50+
public void setExpressions(List<Expression> list) {
51+
expressions = list;
52+
}
53+
54+
@Override
55+
public String toString() {
56+
StringBuilder sql = new StringBuilder();
57+
sql.append("VALUES ");
58+
sql.append(PlainSelect.getStringList(expressions, true, true));
59+
return sql.toString();
60+
}
61+
}

src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@
132132
import net.sf.jsqlparser.statement.truncate.Truncate;
133133
import net.sf.jsqlparser.statement.update.Update;
134134
import net.sf.jsqlparser.statement.upsert.Upsert;
135+
import net.sf.jsqlparser.statement.values.ValuesStatement;
135136

136137
/**
137138
* Find all used tables within an select statement.
@@ -811,4 +812,11 @@ public void visit(Block block) {
811812
visit(block.getStatements());
812813
}
813814
}
815+
816+
@Override
817+
public void visit(ValuesStatement values) {
818+
for (Expression expr : values.getExpressions()) {
819+
expr.accept(this);
820+
}
821+
}
814822
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
import net.sf.jsqlparser.statement.truncate.Truncate;
4646
import net.sf.jsqlparser.statement.update.Update;
4747
import net.sf.jsqlparser.statement.upsert.Upsert;
48+
import net.sf.jsqlparser.statement.values.ValuesStatement;
4849

4950
public class StatementDeParser implements StatementVisitor {
5051

@@ -240,4 +241,10 @@ public void visit(Block block) {
240241
}
241242
buffer.append("END");
242243
}
244+
245+
@Override
246+
public void visit(ValuesStatement values) {
247+
expressionDeParser.setBuffer(buffer);
248+
new ValuesStatementDeParser(expressionDeParser, buffer).deParse(values);
249+
}
243250
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/*
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2017 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+
import net.sf.jsqlparser.expression.Expression;
25+
import net.sf.jsqlparser.expression.ExpressionVisitor;
26+
import net.sf.jsqlparser.statement.values.ValuesStatement;
27+
28+
public class ValuesStatementDeParser {
29+
30+
private StringBuilder buffer;
31+
private final ExpressionVisitor expressionVisitor;
32+
33+
public ValuesStatementDeParser(ExpressionVisitor expressionVisitor, StringBuilder buffer) {
34+
this.buffer = buffer;
35+
this.expressionVisitor = expressionVisitor;
36+
}
37+
38+
public StringBuilder getBuffer() {
39+
return buffer;
40+
}
41+
42+
public void setBuffer(StringBuilder buffer) {
43+
this.buffer = buffer;
44+
}
45+
46+
public void deParse(ValuesStatement values) {
47+
boolean first = true;
48+
buffer.append("VALUES (");
49+
for (Expression expr : values.getExpressions()) {
50+
if (first) {
51+
first = false;
52+
} else {
53+
buffer.append(", ");
54+
}
55+
expr.accept(expressionVisitor);
56+
}
57+
buffer.append(")");
58+
}
59+
}

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

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@ import net.sf.jsqlparser.statement.truncate.*;
8383
import net.sf.jsqlparser.statement.update.*;
8484
import net.sf.jsqlparser.statement.upsert.*;
8585
import net.sf.jsqlparser.statement.merge.*;
86+
import net.sf.jsqlparser.statement.values.*;
8687
import java.util.*;
8788

8889
/**
@@ -379,6 +380,8 @@ Statement SingleStatement() :
379380
LOOKAHEAD(3)
380381
stm = Select()
381382
|
383+
stm = Values()
384+
|
382385
stm = Update()
383386
|
384387
stm = Insert()
@@ -515,6 +518,20 @@ UseStatement Use(): {
515518
}
516519
}
517520

521+
ValuesStatement Values(): {
522+
List<Expression> expList = new ArrayList<Expression>();
523+
Expression exp;
524+
} {
525+
<K_VALUES>
526+
"("
527+
exp=PrimaryExpression() { expList.add(exp); }
528+
("," exp=PrimaryExpression() { expList.add(exp); } )*
529+
")"
530+
{
531+
return new ValuesStatement(expList);
532+
}
533+
}
534+
518535
Update Update():
519536
{
520537
Update update = new Update();
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package net.sf.jsqlparser.statement.values;
2+
3+
import net.sf.jsqlparser.JSQLParserException;
4+
import static net.sf.jsqlparser.test.TestUtils.assertSqlCanBeParsedAndDeparsed;
5+
import org.junit.Test;
6+
7+
public class ValuesTest {
8+
9+
@Test
10+
public void testDuplicateKey() throws JSQLParserException {
11+
assertSqlCanBeParsedAndDeparsed("VALUES (1, 2, 'test')");
12+
}
13+
}

0 commit comments

Comments
 (0)