From 2f729152168f6d8f209142e8836b1f24a38adaba Mon Sep 17 00:00:00 2001 From: Felipe Zorzo Date: Wed, 19 Jun 2024 20:21:47 -0300 Subject: [PATCH] feat(grammar): Accept "?" as a binding expression --- .../IdenticalExpressionCheck.json | 4 ++++ .../antlr-grammars-v4/ParsingErrorCheck.json | 3 --- .../antlr-grammars-v4/SelectAllColumnsCheck.json | 6 ++++++ .../UnnecessaryAliasInQueryCheck.json | 4 ++++ .../sonar/plugins/plsqlopen/api/PlSqlGrammar.kt | 14 +++++++++++--- .../sonar/plugins/plsqlopen/api/PlSqlPunctuator.kt | 3 ++- .../plsqlopen/api/HostAndIndicatorVariableTest.kt | 5 +++++ 7 files changed, 32 insertions(+), 7 deletions(-) diff --git a/zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/IdenticalExpressionCheck.json b/zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/IdenticalExpressionCheck.json index 43d159e3..030fc5b6 100644 --- a/zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/IdenticalExpressionCheck.json +++ b/zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/IdenticalExpressionCheck.json @@ -15,6 +15,10 @@ 2, 3 ], + "examples/union07.sql" : [ + 23, + 37 + ], "examples/union09.sql" : [ 13, 19 diff --git a/zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/ParsingErrorCheck.json b/zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/ParsingErrorCheck.json index 836a7ca5..903b05e9 100644 --- a/zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/ParsingErrorCheck.json +++ b/zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/ParsingErrorCheck.json @@ -452,9 +452,6 @@ "examples/unified.sql" : [ 1 ], - "examples/union07.sql" : [ - 24 - ], "examples/validate_conversion.sql" : [ 3 ], diff --git a/zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/SelectAllColumnsCheck.json b/zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/SelectAllColumnsCheck.json index e27e6723..a10c98c1 100644 --- a/zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/SelectAllColumnsCheck.json +++ b/zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/SelectAllColumnsCheck.json @@ -194,6 +194,12 @@ 24, 28 ], + "examples/union07.sql" : [ + 5, + 6, + 8, + 11 + ], "examples/union08.sql" : [ 1 ], diff --git a/zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/UnnecessaryAliasInQueryCheck.json b/zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/UnnecessaryAliasInQueryCheck.json index f35722b6..ecfb0b93 100644 --- a/zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/UnnecessaryAliasInQueryCheck.json +++ b/zpa-checks/src/integrationTest/resources/expected/antlr-grammars-v4/UnnecessaryAliasInQueryCheck.json @@ -98,6 +98,10 @@ "examples/select_all_some_any.sql" : [ 6 ], + "examples/union07.sql" : [ + 36, + 21 + ], "examples/xmltable03.sql" : [ 6 ], 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 2c4dd944..60bc7752 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 @@ -451,9 +451,17 @@ enum class PlSqlGrammar : GrammarRuleKey { } private fun createStatements(b: PlSqlGrammarBuilder) { - b.rule(HOST_AND_INDICATOR_VARIABLE).define(COLON, b.firstOf( - b.sequence(IDENTIFIER_NAME, b.optional(INDICATOR), b.optional(COLON, IDENTIFIER_NAME)), - INTEGER_LITERAL)) + b.rule(HOST_AND_INDICATOR_VARIABLE).define( + b.firstOf( + b.sequence( + COLON, b.firstOf( + b.sequence(IDENTIFIER_NAME, b.optional(INDICATOR), b.optional(COLON, IDENTIFIER_NAME)), + INTEGER_LITERAL + ) + ), + QUESTION_MARK + ) + ) b.rule(NULL_STATEMENT, NullStatement::class).define(NULL, SEMICOLON) diff --git a/zpa-core/src/main/kotlin/org/sonar/plugins/plsqlopen/api/PlSqlPunctuator.kt b/zpa-core/src/main/kotlin/org/sonar/plugins/plsqlopen/api/PlSqlPunctuator.kt index b432c8ca..e34fb525 100644 --- a/zpa-core/src/main/kotlin/org/sonar/plugins/plsqlopen/api/PlSqlPunctuator.kt +++ b/zpa-core/src/main/kotlin/org/sonar/plugins/plsqlopen/api/PlSqlPunctuator.kt @@ -52,7 +52,8 @@ enum class PlSqlPunctuator(override val value: String) : TokenType { TILDE("~"), CARET("^"), LBRACKET("["), - RBRACKET("]"),; + RBRACKET("]"), + QUESTION_MARK("?"); override fun hasToBeSkippedFromAst(node: AstNode?) = false } diff --git a/zpa-core/src/test/kotlin/org/sonar/plugins/plsqlopen/api/HostAndIndicatorVariableTest.kt b/zpa-core/src/test/kotlin/org/sonar/plugins/plsqlopen/api/HostAndIndicatorVariableTest.kt index 08e8c78d..c3067637 100644 --- a/zpa-core/src/test/kotlin/org/sonar/plugins/plsqlopen/api/HostAndIndicatorVariableTest.kt +++ b/zpa-core/src/test/kotlin/org/sonar/plugins/plsqlopen/api/HostAndIndicatorVariableTest.kt @@ -50,4 +50,9 @@ class HostAndIndicatorVariableTest : RuleTest() { assertThat(p).matches(":var indicator :ind") } + @Test + fun matchesQuestionMarkBinding() { + assertThat(p).matches("?") + } + }