Skip to content

Commit cdd0fa2

Browse files
committed
variable assignment implemented
1 parent 29ed2cb commit cdd0fa2

File tree

9 files changed

+106
-2
lines changed

9 files changed

+106
-2
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ Also I would like to know about needed examples or documentation stuff.
6868
## Extensions in the latest SNAPSHOT version 3.3
6969

7070
* allowed Jdbc named parameters within interval expressions
71+
* allow variable assignments in select statements in different positions
7172

7273
## Extensions of JSqlParser releases
7374

src/main/java/net/sf/jsqlparser/expression/ExpressionVisitor.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -158,4 +158,6 @@ public interface ExpressionVisitor {
158158

159159
public void visit(ArrayExpression aThis);
160160

161+
public void visit(VariableAssignment aThis);
162+
161163
}

src/main/java/net/sf/jsqlparser/expression/ExpressionVisitorAdapter.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -541,4 +541,10 @@ public void visit(ArrayExpression array) {
541541
array.getObjExpression().accept(this);
542542
array.getIndexExpression().accept(this);
543543
}
544+
545+
@Override
546+
public void visit(VariableAssignment var) {
547+
var.getVariable().accept(this);
548+
var.getExpression().accept(this);
549+
}
544550
}
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2019 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.expression;
11+
12+
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
13+
14+
/**
15+
* Assignment to a user variable like in select @a = 5.
16+
*/
17+
public class VariableAssignment extends ASTNodeAccessImpl implements Expression {
18+
19+
private UserVariable variable;
20+
private String operation;
21+
private Expression expression;
22+
23+
public UserVariable getVariable() {
24+
return variable;
25+
}
26+
27+
public void setVariable(UserVariable variable) {
28+
this.variable = variable;
29+
}
30+
31+
public String getOperation() {
32+
return operation;
33+
}
34+
35+
public void setOperation(String operation) {
36+
this.operation = operation;
37+
}
38+
39+
public Expression getExpression() {
40+
return expression;
41+
}
42+
43+
public void setExpression(Expression expression) {
44+
this.expression = expression;
45+
}
46+
47+
@Override
48+
public String toString() {
49+
return variable.toString() + " " + operation + " " + expression.toString();
50+
}
51+
52+
@Override
53+
public void accept(ExpressionVisitor expressionVisitor) {
54+
expressionVisitor.visit(this);
55+
}
56+
57+
58+
}

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import net.sf.jsqlparser.expression.TimestampValue;
5050
import net.sf.jsqlparser.expression.UserVariable;
5151
import net.sf.jsqlparser.expression.ValueListExpression;
52+
import net.sf.jsqlparser.expression.VariableAssignment;
5253
import net.sf.jsqlparser.expression.WhenClause;
5354
import net.sf.jsqlparser.expression.operators.arithmetic.*;
5455
import net.sf.jsqlparser.expression.operators.conditional.AndExpression;
@@ -891,4 +892,10 @@ public void visit(CreateFunctionalStatement createFunctionalStatement) {
891892
public void visit(ShowTablesStatement showTables) {
892893
throw new UnsupportedOperationException("Finding tables from ShowTablesStatement is not supported");
893894
}
895+
896+
@Override
897+
public void visit(VariableAssignment var) {
898+
var.getVariable().accept(this);
899+
var.getExpression().accept(this);
900+
}
894901
}

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
import net.sf.jsqlparser.expression.TimestampValue;
5151
import net.sf.jsqlparser.expression.UserVariable;
5252
import net.sf.jsqlparser.expression.ValueListExpression;
53+
import net.sf.jsqlparser.expression.VariableAssignment;
5354
import net.sf.jsqlparser.expression.WhenClause;
5455
import net.sf.jsqlparser.expression.WindowElement;
5556
import net.sf.jsqlparser.expression.operators.arithmetic.Addition;
@@ -893,4 +894,11 @@ public void visit(ArrayExpression array) {
893894
void deParse(Expression statement) {
894895
statement.accept(this);
895896
}
897+
898+
@Override
899+
public void visit(VariableAssignment var) {
900+
var.getVariable().accept(this);
901+
buffer.append(" ").append(var.getOperation()).append(" ");
902+
var.getExpression().accept(this);
903+
}
896904
}

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

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3030,12 +3030,24 @@ Expression AnyComparisonExpression() :
30303030
Expression SimpleExpression():
30313031
{
30323032
Expression retval = null;
3033+
UserVariable user = null;
3034+
Token operation = null;
30333035
}
30343036
{
3035-
[ LOOKAHEAD(UserVariable() "=") UserVariable() "=" ]
3037+
[ LOOKAHEAD(UserVariable() ("=" | ":=") )
3038+
user = UserVariable()
3039+
( operation = "=" | operation = ":=" )
3040+
]
30363041
retval=ConcatExpression()
30373042
{
3038-
return retval;
3043+
if (user != null) {
3044+
VariableAssignment assignment = new VariableAssignment();
3045+
assignment.setVariable(user);
3046+
assignment.setOperation(operation.image);
3047+
assignment.setExpression(retval);
3048+
return assignment;
3049+
} else
3050+
return retval;
30393051
}
30403052
}
30413053

src/test/java/net/sf/jsqlparser/statement/select/SelectTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4185,4 +4185,9 @@ public void testCheckDateFunctionIssue_3() throws JSQLParserException {
41854185
public void testCheckColonVariable() throws JSQLParserException {
41864186
assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE (col1, col2) IN ((:qp0, :qp1), (:qp2, :qp3))");
41874187
}
4188+
4189+
@Test
4190+
public void testVariableAssignment() throws JSQLParserException {
4191+
assertSqlCanBeParsedAndDeparsed("SELECT @SELECTVariable = 2");
4192+
}
41884193
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,4 +160,9 @@ public void testUpdateIssue750() throws JSQLParserException {
160160
public void testUpdateIssue962Validate() throws JSQLParserException {
161161
assertSqlCanBeParsedAndDeparsed("UPDATE tbl_user_card SET validate = '1', identityCodeFlag = 1 WHERE id = 9150000293816");
162162
}
163+
164+
@Test
165+
public void testUpdateVariableAssignment() throws JSQLParserException {
166+
assertSqlCanBeParsedAndDeparsed("UPDATE transaction_id SET latest_id_wallet = (@cur_id_wallet := latest_id_wallet) + 1");
167+
}
163168
}

0 commit comments

Comments
 (0)