Skip to content

Commit 3c44391

Browse files
committed
multi value IN expression introduced (a,b,c) in ...
fixes #30
1 parent fc5e605 commit 3c44391

File tree

5 files changed

+36
-16
lines changed

5 files changed

+36
-16
lines changed

src/main/java/net/sf/jsqlparser/expression/operators/relational/InExpression.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,27 +27,28 @@
2727
public class InExpression implements Expression {
2828

2929
private Expression leftExpression;
30-
private ItemsList itemsList;
30+
private ItemsList leftItemsList;
31+
private ItemsList rightItemsList;
3132
private boolean not = false;
3233

3334
public InExpression() {
3435
}
3536

3637
public InExpression(Expression leftExpression, ItemsList itemsList) {
3738
setLeftExpression(leftExpression);
38-
setItemsList(itemsList);
39+
setRightItemsList(itemsList);
3940
}
4041

41-
public ItemsList getItemsList() {
42-
return itemsList;
42+
public ItemsList getRightItemsList() {
43+
return rightItemsList;
4344
}
4445

4546
public Expression getLeftExpression() {
4647
return leftExpression;
4748
}
4849

49-
public void setItemsList(ItemsList list) {
50-
itemsList = list;
50+
public void setRightItemsList(ItemsList list) {
51+
rightItemsList = list;
5152
}
5253

5354
public void setLeftExpression(Expression expression) {
@@ -62,13 +63,21 @@ public void setNot(boolean b) {
6263
not = b;
6364
}
6465

66+
public ItemsList getLeftItemsList() {
67+
return leftItemsList;
68+
}
69+
70+
public void setLeftItemsList(ItemsList leftItemsList) {
71+
this.leftItemsList = leftItemsList;
72+
}
73+
6574
@Override
6675
public void accept(ExpressionVisitor expressionVisitor) {
6776
expressionVisitor.visit(this);
6877
}
6978

7079
@Override
7180
public String toString() {
72-
return leftExpression + " " + ((not) ? "NOT " : "") + "IN " + itemsList + "";
81+
return (leftExpression == null ? leftItemsList : leftExpression) + " " + ((not) ? "NOT " : "") + "IN " + rightItemsList + "";
7382
}
7483
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ public void visit(GreaterThanEquals greaterThanEquals) {
292292
@Override
293293
public void visit(InExpression inExpression) {
294294
inExpression.getLeftExpression().accept(this);
295-
inExpression.getItemsList().accept(this);
295+
inExpression.getRightItemsList().accept(this);
296296
}
297297

298298
@Override

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

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -180,14 +180,17 @@ public void visit(GreaterThanEquals greaterThanEquals) {
180180

181181
@Override
182182
public void visit(InExpression inExpression) {
183-
184-
inExpression.getLeftExpression().accept(this);
183+
if (inExpression.getLeftExpression() == null) {
184+
inExpression.getLeftItemsList().accept(this);
185+
} else {
186+
inExpression.getLeftExpression().accept(this);
187+
}
185188
if (inExpression.isNot()) {
186189
buffer.append(" NOT");
187190
}
188191
buffer.append(" IN ");
189192

190-
inExpression.getItemsList().accept(this);
193+
inExpression.getRightItemsList().accept(this);
191194
}
192195

193196
@Override

src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,15 +1185,18 @@ Expression SQLCondition():
11851185
Expression InExpression() :
11861186
{
11871187
InExpression result = new InExpression();
1188-
ItemsList itemsList = null;
1188+
ItemsList leftItemsList = null;
1189+
ItemsList rightItemsList = null;
11891190
Expression leftExpression = null;
1191+
11901192
}
11911193
{
1192-
leftExpression=SimpleExpression()
1193-
[<K_NOT> { result.setNot(true); } ] <K_IN> "(" (LOOKAHEAD(SubSelect()) itemsList=SubSelect() | itemsList=SimpleExpressionList() ) ")"
1194+
( LOOKAHEAD(3) leftExpression=SimpleExpression() { result.setLeftExpression(leftExpression); }
1195+
| "(" leftItemsList = SimpleExpressionList() { result.setLeftItemsList(leftItemsList); } ")"
1196+
)
1197+
[<K_NOT> { result.setNot(true); } ] <K_IN> "(" (LOOKAHEAD(SubSelect()) rightItemsList=SubSelect() | rightItemsList=SimpleExpressionList() ) ")"
11941198
{
1195-
result.setLeftExpression(leftExpression);
1196-
result.setItemsList(itemsList);
1199+
result.setRightItemsList(rightItemsList);
11971200
return result;
11981201
}
11991202
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -984,4 +984,9 @@ public void testInterval2() throws JSQLParserException {
984984

985985
assertEquals("'45 MINUTE'", iexpr.getParameter());
986986
}
987+
988+
public void testMultiValueIn() throws JSQLParserException {
989+
String stmt = "SELECT * FROM mytable WHERE (a, b, c) IN (SELECT a, b, c FROM mytable2)";
990+
assertSqlCanBeParsedAndDeparsed(stmt);
991+
}
987992
}

0 commit comments

Comments
 (0)