From d36980518a4f8b1e5507f19a7db9a3794863fa4f Mon Sep 17 00:00:00 2001 From: amigalev Date: Tue, 25 Jul 2023 23:22:37 +0300 Subject: [PATCH 1/3] fix: Concatenation in inner ELSE statement (Second level of Case Expression) --- .../net/sf/jsqlparser/parser/JSqlParserCC.jjt | 3 ++- .../expression/CaseExpressionTest.java | 27 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 60a3473c4..bc9aa6868 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -4796,7 +4796,8 @@ Expression CaseWhenExpression() #CaseWhenExpression: [ ( - LOOKAHEAD(3, {!interrupted}) "(" elseExp=CaseWhenExpression() ")" { elseExp = new Parenthesis( elseExp ); } + LOOKAHEAD(ConcatExpression()) elseExp = ConcatExpression() + | LOOKAHEAD(3, {!interrupted}) "(" elseExp=CaseWhenExpression() ")" { elseExp = new Parenthesis( elseExp ); } | LOOKAHEAD(3, {!interrupted}) elseExp=CaseWhenExpression() | LOOKAHEAD(3, {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" From 3c15f6e9b33c03922a5d505f3526d7309c75a5ce Mon Sep 17 00:00:00 2001 From: amigalev Date: Fri, 28 Jul 2023 14:12:40 +0300 Subject: [PATCH 2/3] fix: broken tests --- src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index bc9aa6868..7ee70ffde 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -4796,10 +4796,7 @@ Expression CaseWhenExpression() #CaseWhenExpression: [ ( - LOOKAHEAD(ConcatExpression()) elseExp = ConcatExpression() - | LOOKAHEAD(3, {!interrupted}) "(" elseExp=CaseWhenExpression() ")" { elseExp = new Parenthesis( elseExp ); } - | LOOKAHEAD(3, {!interrupted}) elseExp=CaseWhenExpression() - | LOOKAHEAD(3, {getAsBoolean(Feature.allowComplexParsing) && !interrupted}) elseExp=Expression() + LOOKAHEAD(3, {getAsBoolean(Feature.allowComplexParsing) && !interrupted}) elseExp=Expression() | elseExp=SimpleExpression() ) ] From b185370e50658ddec3b792434c2f5d87cf180a41 Mon Sep 17 00:00:00 2001 From: amigalev Date: Mon, 31 Jul 2023 15:58:27 +0300 Subject: [PATCH 3/3] fix: Delete lookahead(3) --- src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt index 7ee70ffde..ef177291d 100644 --- a/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt +++ b/src/main/jjtree/net/sf/jsqlparser/parser/JSqlParserCC.jjt @@ -4796,7 +4796,7 @@ Expression CaseWhenExpression() #CaseWhenExpression: [ ( - LOOKAHEAD(3, {getAsBoolean(Feature.allowComplexParsing) && !interrupted}) elseExp=Expression() + LOOKAHEAD({getAsBoolean(Feature.allowComplexParsing) && !interrupted}) elseExp=Expression() | elseExp=SimpleExpression() ) ]