From 78cfa6a3e2f36b62b563ab9591abb8bbe2a2c8fa Mon Sep 17 00:00:00 2001 From: Felipe Zorzo Date: Wed, 24 Jul 2024 21:11:57 -0300 Subject: [PATCH] fix(grammar): Fix parsing of "in (subquery)" --- .../org/sonar/plugins/plsqlopen/api/PlSqlGrammar.kt | 8 +++++++- .../plsqlopen/api/expressions/OtherExpressionTest.kt | 6 ++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/zpa-core/src/main/kotlin/org/sonar/plugins/plsqlopen/api/PlSqlGrammar.kt b/zpa-core/src/main/kotlin/org/sonar/plugins/plsqlopen/api/PlSqlGrammar.kt index 23cdfc29..331340e1 100644 --- a/zpa-core/src/main/kotlin/org/sonar/plugins/plsqlopen/api/PlSqlGrammar.kt +++ b/zpa-core/src/main/kotlin/org/sonar/plugins/plsqlopen/api/PlSqlGrammar.kt @@ -792,7 +792,13 @@ enum class PlSqlGrammar : GrammarRuleKey { b.optional(b.sequence( b.optional(NOT), IN, b.firstOf( - b.sequence(LPARENTHESIS, EXPRESSION, b.zeroOrMore(COMMA, EXPRESSION), RPARENTHESIS), + b.sequence( + LPARENTHESIS, + b.firstOf( + SELECT_EXPRESSION, + b.sequence(EXPRESSION, b.zeroOrMore(COMMA, EXPRESSION)), + ), + RPARENTHESIS), EXPRESSION)))).skipIfOneChild() b.rule(EXISTS_EXPRESSION).define(EXISTS, LPARENTHESIS, SELECT_EXPRESSION, RPARENTHESIS).skipIfOneChild() diff --git a/zpa-core/src/test/kotlin/org/sonar/plugins/plsqlopen/api/expressions/OtherExpressionTest.kt b/zpa-core/src/test/kotlin/org/sonar/plugins/plsqlopen/api/expressions/OtherExpressionTest.kt index 5c6f750e..d2c95505 100644 --- a/zpa-core/src/test/kotlin/org/sonar/plugins/plsqlopen/api/expressions/OtherExpressionTest.kt +++ b/zpa-core/src/test/kotlin/org/sonar/plugins/plsqlopen/api/expressions/OtherExpressionTest.kt @@ -88,4 +88,10 @@ class OtherExpressionTest : RuleTest() { assertThat(p).matches("foo(1)(1)") } + @Test + fun InExpressionShouldNotMatchAdditionalExpressions() { + setRootRule(PlSqlGrammar.IN_EXPRESSION) + assertThat(p).notMatches("var in (select 1 from dual) and x = y") + } + }