Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 11 additions & 9 deletions src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt
Original file line number Diff line number Diff line change
Expand Up @@ -1698,12 +1698,11 @@ Expression Condition():
Token token;
}
{
(LOOKAHEAD(SQLCondition()) result=SQLCondition()
| LOOKAHEAD(RegularCondition()) result=RegularCondition()
(LOOKAHEAD(RegularCondition()) result=RegularCondition()
| LOOKAHEAD(SQLCondition()) result=SQLCondition()
| LOOKAHEAD(Function()) result=Function()
| <K_NOT> result=Column() { result = new NotExpression(result); }
| result=Column()
| LOOKAHEAD({ "0".equals(getToken(1).image) || "1".equals(getToken(1).image) }) token=<S_LONG> { result = new LongValue(token.image); }
| <K_NOT> result=SimpleExpression() { result = new NotExpression(result); }
| result=SimpleExpression()
)

{ return result; }
Expand Down Expand Up @@ -1783,6 +1782,7 @@ Expression SQLCondition():
| LOOKAHEAD(Between()) result=Between()
| LOOKAHEAD(IsNullExpression()) result=IsNullExpression()
| LOOKAHEAD(ExistsExpression()) result=ExistsExpression()
| LOOKAHEAD(CaseWhenExpression()) result = CaseWhenExpression()
| result=LikeExpression()
)
{ return result; }
Expand Down Expand Up @@ -2178,6 +2178,8 @@ Expression PrimaryExpression():

| "{ts" token=<S_CHAR_LITERAL> "}" { retval = new TimestampValue(token.image); }

| retval = Column()

| retval = IntervalExpression()
)

Expand Down Expand Up @@ -2442,11 +2444,11 @@ Expression CaseWhenExpression() #CaseWhenExpression:
<K_CASE>
(
( clause=WhenThenSearchCondition() { whenClauses.add(clause); } )+
[<K_ELSE> elseExp=SimpleExpression()]
[<K_ELSE> elseExp=Expression()]
|
(LOOKAHEAD(RegularCondition()) switchExp=RegularCondition() | switchExp=BitwiseAndOr())
( clause=WhenThenValue() { whenClauses.add(clause); } )+
[<K_ELSE> elseExp=SimpleExpression()]
[<K_ELSE> elseExp=Expression()]
)
<K_END>
{
Expand All @@ -2464,7 +2466,7 @@ WhenClause WhenThenSearchCondition():
Expression thenExp = null;
}
{
<K_WHEN> whenExp=Expression() <K_THEN> thenExp=SimpleExpression()
<K_WHEN> whenExp=Expression() <K_THEN> thenExp=Expression()
{
whenThen.setWhenExpression(whenExp);
whenThen.setThenExpression(thenExp);
Expand All @@ -2479,7 +2481,7 @@ WhenClause WhenThenValue():
Expression thenExp = null;
}
{
<K_WHEN> whenExp=PrimaryExpression() <K_THEN> thenExp=SimpleExpression()
<K_WHEN> whenExp=PrimaryExpression() <K_THEN> thenExp=Expression()
{
whenThen.setWhenExpression(whenExp);
whenThen.setThenExpression(thenExp);
Expand Down
25 changes: 16 additions & 9 deletions src/test/java/net/sf/jsqlparser/test/select/SelectTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -2318,15 +2318,6 @@ public void testWhereIssue240_0() throws JSQLParserException {
assertSqlCanBeParsedAndDeparsed("SELECT count(*) FROM mytable WHERE 0");
}

public void testWhereIssue240_notBoolean() {
try {
CCJSqlParserUtil.parse("SELECT count(*) FROM mytable WHERE 5");
fail("should not be parsed");
} catch (JSQLParserException ex) {

}
}

public void testWhereIssue240_true() throws JSQLParserException {
assertSqlCanBeParsedAndDeparsed("SELECT count(*) FROM mytable WHERE true");
}
Expand Down Expand Up @@ -2451,4 +2442,20 @@ public void testKeyWorkInsertIssue393() throws JSQLParserException {
public void testKeyWorkReplaceIssue393() throws JSQLParserException {
assertSqlCanBeParsedAndDeparsed("SELECT replace(\"aaaabbb\", 4, 4, \"****\")");
}

public void testCaseExpressionAsConditionIssue200() throws JSQLParserException {
assertSqlCanBeParsedAndDeparsed("SELECT * FROM t1 WHERE CASE WHEN t1.a = 1 THEN t1.b = 2 ELSE t1.b = 3 END");
}

public void testCaseExpressionNestedConditionIssue200() throws JSQLParserException {
assertSqlCanBeParsedAndDeparsed("SELECT * FROM t1 WHERE CASE WHEN t1.a = 1 THEN CASE WHEN t1.b = 2 THEN t1.c = 3 ELSE t1.c = 5 END ELSE t1.b = 3 END");
}

public void testCaseExpressionHoldsAndIssue200() throws JSQLParserException {
assertSqlCanBeParsedAndDeparsed("SELECT * FROM t1 WHERE CASE WHEN t1.a = 1 THEN '2017-02-27' NOT IN ('2017-02-19', '2017-02-26', '2017-02-12', '2017-02-05') AND '2017-02-27' BETWEEN to_date AND from_date END");
}

public void testCaseExpressionWithMoreCondsIssue200() throws JSQLParserException {
assertSqlCanBeParsedAndDeparsed("SELECT * FROM t1 WHERE t2.name = t1.leave_type AND t2.is_lwp = 1 AND t1.docstatus = 1 AND t1.employee = 'EMP-0001' AND CASE WHEN t1.a = 1 THEN '2017-02-27' NOT IN ('2017-02-19', '2017-02-26', '2017-02-12', '2017-02-05') AND '2017-02-27' BETWEEN to_date AND from_date WHEN t2.include_holiday THEN '2017-02-27' BETWEEN from_date AND to_date END");
}
}