diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 5cbf1b367..f30fd1ed7 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -4796,9 +4796,7 @@ Expression CaseWhenExpression() #CaseWhenExpression: [ ( - LOOKAHEAD(3, {!interrupted}) "(" elseExp=CaseWhenExpression() ")" { elseExp = new Parenthesis( elseExp ); } - | LOOKAHEAD(3, {!interrupted}) elseExp=CaseWhenExpression() - | LOOKAHEAD(3, {getAsBoolean(Feature.allowComplexParsing) && !interrupted}) elseExp=Expression() + LOOKAHEAD({getAsBoolean(Feature.allowComplexParsing) && !interrupted}) elseExp=Expression() | elseExp=SimpleExpression() ) ] diff --git a/src/test/java/net/sf/jsqlparser/expression/CaseExpressionTest.java b/src/test/java/net/sf/jsqlparser/expression/CaseExpressionTest.java index 84ab898db..0e7d3a6d8 100644 --- a/src/test/java/net/sf/jsqlparser/expression/CaseExpressionTest.java +++ b/src/test/java/net/sf/jsqlparser/expression/CaseExpressionTest.java @@ -82,6 +82,33 @@ public void testCaseOrSwitch() throws JSQLParserException { TestUtils.assertExpressionCanBeParsedAndDeparsed("CASE true OR false WHEN true THEN 1 ELSE 2 END", true); } + @Test + public void testInnerCaseWithConcatInElsePart() throws JSQLParserException { + String query = "SELECT \n" + + "CASE \n" + + " WHEN 1 = 1 \n" + + " THEN \n" + + " CASE \n" + + " WHEN 2 = 2 \n" + + " THEN '2a' \n" + + " ELSE \n" + + " CASE \n" + + " WHEN 1 = 1 \n" + + " THEN \n" + + " CASE \n" + + " WHEN 2 = 2 \n" + + " THEN '2a' \n" + + " ELSE '' \n" + + " END \n" + + " ELSE 'b' \n" + + " END || 'z'\n" + + " END \n" + + " ELSE 'b' \n" + + "END AS tmp\n" + + "FROM test_table"; + TestUtils.assertSqlCanBeParsedAndDeparsed(query, true); + } + @Test public void testCaseInsideBrackets() throws JSQLParserException { String sqlStr = "SELECT ( CASE\n"