diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index aeb0ae341..f514ed8a1 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -2228,10 +2228,17 @@ SelectExpressionItem SelectExpressionItem(): Alias alias = null; } { - expression=Expression() { selectExpressionItem = new SelectExpressionItem(); selectExpressionItem.setExpression(expression); } + ( + LOOKAHEAD( Condition() ) expression = Condition() + | + LOOKAHEAD( 3 ) expression = ConcatExpression() + | + expression=Expression() + ) { selectExpressionItem = new SelectExpressionItem(); selectExpressionItem.setExpression(expression); } [ LOOKAHEAD(2) alias=Alias() { selectExpressionItem.setAlias(alias); }] { return selectExpressionItem; } } + SelectItem SelectItem() #SelectItem: { SelectItem selectItem = null; diff --git a/src/test/java/net/sf/jsqlparser/expression/CaseExpressionTest.java b/src/test/java/net/sf/jsqlparser/expression/CaseExpressionTest.java index db9ec7d2a..84ab898db 100644 --- a/src/test/java/net/sf/jsqlparser/expression/CaseExpressionTest.java +++ b/src/test/java/net/sf/jsqlparser/expression/CaseExpressionTest.java @@ -81,4 +81,29 @@ public void testCaseAndSwitch() throws JSQLParserException { public void testCaseOrSwitch() throws JSQLParserException { TestUtils.assertExpressionCanBeParsedAndDeparsed("CASE true OR false WHEN true THEN 1 ELSE 2 END", true); } + + @Test + public void testCaseInsideBrackets() throws JSQLParserException { + String sqlStr = "SELECT ( CASE\n" + + " WHEN something\n" + + " THEN CASE\n" + + " WHEN something2\n" + + " THEN 1\n" + + " ELSE 0\n" + + " END + 1\n" + + " ELSE 0\n" + + " END ) + 1 \n" + + "FROM test"; + + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true); + + sqlStr = "SELECT\n" + + "(CASE WHEN FIELD_A=0 THEN FIELD_B\n" + + "WHEN FIELD_C >FIELD_D THEN (CASE WHEN FIELD_A>0 THEN\n" + + "(FIELD_B)/(FIELD_A/(DATEDIFF(DAY,:started,:end)+1))\n" + + "ELSE 0 END)-FIELD_D ELSE 0 END)*FIELD_A/(DATEDIFF(DAY,:started,:end)+1) AS UNNECESSARY_COMPLEX_EXPRESSION\n" + + "FROM TEST"; + + TestUtils.assertSqlCanBeParsedAndDeparsed(sqlStr, true); + } }