Skip to content

Commit 0f78dfd

Browse files
committed
started fixing #923
1 parent 3490e61 commit 0f78dfd

File tree

8 files changed

+2250
-5
lines changed

8 files changed

+2250
-5
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,7 @@ Also I would like to know about needed examples or documentation stuff.
7272
* allow datatype **binary** for column definitions
7373
* support for **ALTER TABLE COLUMN DROP NOT NULL**
7474
* allow **order** as column name
75+
* support for table function in **IN** expression
7576

7677
## Extensions of JSqlParser releases
7778

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,11 @@ public void visit(InExpression expr) {
170170
} else if (expr.getLeftItemsList() != null) {
171171
expr.getLeftItemsList().accept(this);
172172
}
173-
expr.getRightItemsList().accept(this);
173+
if (expr.getRightExpression() != null) {
174+
expr.getRightExpression().accept(this);
175+
} else {
176+
expr.getRightItemsList().accept(this);
177+
}
174178
}
175179

176180
@Override

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public class InExpression extends ASTNodeAccessImpl implements Expression, Suppo
1919
private ItemsList leftItemsList;
2020
private ItemsList rightItemsList;
2121
private boolean not = false;
22+
private Expression rightExpression;
2223

2324
private int oldOracleJoinSyntax = NO_ORACLE_JOIN;
2425

@@ -75,6 +76,14 @@ public void setLeftItemsList(ItemsList leftItemsList) {
7576
this.leftItemsList = leftItemsList;
7677
}
7778

79+
public Expression getRightExpression() {
80+
return rightExpression;
81+
}
82+
83+
public void setRightExpression(Expression rightExpression) {
84+
this.rightExpression = rightExpression;
85+
}
86+
7887
@Override
7988
public void accept(ExpressionVisitor expressionVisitor) {
8089
expressionVisitor.visit(this);
@@ -86,7 +95,8 @@ private String getLeftExpressionString() {
8695

8796
@Override
8897
public String toString() {
89-
return (leftExpression == null ? leftItemsList : getLeftExpressionString()) + " " + (not ? "NOT " : "") + "IN " + rightItemsList + "";
98+
return (leftExpression == null ? leftItemsList : getLeftExpressionString()) + " "
99+
+ (not ? "NOT " : "") + "IN " + (rightExpression == null ? rightItemsList : rightExpression) + "";
90100
}
91101

92102
@Override

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,7 +201,11 @@ public void visit(InExpression inExpression) {
201201
}
202202
buffer.append(" IN ");
203203

204-
inExpression.getRightItemsList().accept(this);
204+
if (inExpression.getRightExpression() != null) {
205+
inExpression.getRightExpression().accept(this);
206+
} else {
207+
inExpression.getRightItemsList().accept(this);
208+
}
205209
}
206210

207211
@Override

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2478,6 +2478,7 @@ Expression InExpression() #InExpression :
24782478
ItemsList leftItemsList = null;
24792479
ItemsList rightItemsList = null;
24802480
Expression leftExpression = null;
2481+
Expression rightExpression = null;
24812482
}
24822483
{
24832484
( LOOKAHEAD(3) "(" (
@@ -2491,9 +2492,12 @@ Expression InExpression() #InExpression :
24912492
leftExpression=SimpleExpression() { result.setLeftExpression(leftExpression); }
24922493
[ "(" "+" ")" { result.setOldOracleJoinSyntax(EqualsTo.ORACLE_JOIN_RIGHT); } ]
24932494
)
2494-
[<K_NOT> { result.setNot(true); } ] <K_IN> "(" (LOOKAHEAD(3) rightItemsList=SubSelect() | rightItemsList=SimpleExpressionList() ) ")"
2495+
[<K_NOT> { result.setNot(true); } ] <K_IN>
2496+
( rightExpression = Function()
2497+
| "(" (LOOKAHEAD(3) rightItemsList=SubSelect() | rightItemsList=SimpleExpressionList() ) ")")
24952498
{
24962499
result.setRightItemsList(rightItemsList);
2500+
result.setRightExpression(rightExpression);
24972501
linkAST(result,jjtThis);
24982502
return result;
24992503
}

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

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3998,8 +3998,44 @@ public void testCaseWithComplexWhenExpression() throws JSQLParserException {
39983998
}
39993999

40004000
@Test
4001-
public void testSessionKeywordIssue932() throws JSQLParserException {
4001+
public void testOrderKeywordIssue932() throws JSQLParserException {
40024002
assertSqlCanBeParsedAndDeparsed("SELECT order FROM tmp3");
40034003
assertSqlCanBeParsedAndDeparsed("SELECT tmp3.order FROM tmp3");
40044004
}
4005+
4006+
@Test
4007+
public void testTableFunctionInExprIssue923() throws JSQLParserException {
4008+
assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE func(a) IN func(b)");
4009+
}
4010+
4011+
@Test
4012+
public void testTableFunctionInExprIssue923_2() throws JSQLParserException, IOException {
4013+
String stmt = IOUtils.toString(
4014+
SelectTest.class.getResourceAsStream("large-sql-issue-923.txt"), "UTF-8");
4015+
assertSqlCanBeParsedAndDeparsed(stmt, true);
4016+
}
4017+
4018+
@Test
4019+
public void testTableFunctionInExprIssue923_3() throws JSQLParserException, IOException {
4020+
String stmt = IOUtils.toString(
4021+
SelectTest.class.getResourceAsStream("large-sql-issue-923-2.txt"), "UTF-8");
4022+
assertSqlCanBeParsedAndDeparsed(stmt, true);
4023+
}
4024+
4025+
@Test
4026+
public void testTableFunctionInExprIssue923_4() throws JSQLParserException {
4027+
assertSqlCanBeParsedAndDeparsed("SELECT MAX(CASE WHEN DUPLICATE_CLAIM_NUMBER IN '1' THEN COALESCE(CLAIM_STATUS2,CLAIM_STATUS1) ELSE NULL END) AS DUPE_1_KINAL_CLAIM_STATUS");
4028+
}
4029+
4030+
@Test
4031+
public void testTableFunctionInExprIssue923_5() throws JSQLParserException {
4032+
assertSqlCanBeParsedAndDeparsed("SELECT CASE WHEN DUPLICATE_CLAIM_NUMBER IN '1' THEN COALESCE(CLAIM_STATUS2,CLAIM_STATUS1) ELSE NULL END");
4033+
}
4034+
4035+
@Test
4036+
public void testTableFunctionInExprIssue923_6() throws JSQLParserException {
4037+
assertSqlCanBeParsedAndDeparsed("SELECT * FROM mytable WHERE func(a) IN '1'");
4038+
}
4039+
4040+
40054041
}

0 commit comments

Comments
 (0)