From 7a8ef70e95e03a4dc4f05b3c7c66ed157fec9ddb Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Wed, 12 Dec 2018 09:44:35 +0100 Subject: [PATCH] [plsql] Parse Exception when using SELECT COUNT(*) Fixes #1508 --- docs/pages/release_notes.md | 2 ++ pmd-plsql/etc/grammar/PldocAST.jjt | 11 ++++----- .../lang/plsql/ast/SelectExpressionsTest.java | 10 +++++++- .../pmd/lang/plsql/ast/SelectCount.pls | 23 +++++++++++++++++++ .../pmd/lang/plsql/ast/SelectExpressions.pls | 11 --------- 5 files changed, 39 insertions(+), 18 deletions(-) create mode 100644 pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SelectCount.pls diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index 5325ba714a..cc7f40153e 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -18,6 +18,8 @@ This is a {{ site.pmd.release_type }} release. * java-bestpractices * [#658](https://github.com/pmd/pmd/issues/658): \[java] OneDeclarationPerLine: False positive for loops +* plsql + * [#1508](https://github.com/pmd/pmd/issues/1508): \[plsql] Parse Exception when using SELECT COUNT(*) ### API Changes diff --git a/pmd-plsql/etc/grammar/PldocAST.jjt b/pmd-plsql/etc/grammar/PldocAST.jjt index d6d82ae949..12a426bb39 100644 --- a/pmd-plsql/etc/grammar/PldocAST.jjt +++ b/pmd-plsql/etc/grammar/PldocAST.jjt @@ -1486,7 +1486,7 @@ void SelectListEntry() #void : ASTColumnAlias ColumnAlias() : {} { - { jjtThis.setImage(token.image); } + ( | ) { jjtThis.setImage(token.image); } { return jjtThis; } } @@ -1549,7 +1549,7 @@ ASTTableReference TableReference() : "(" Subquery() ")" ) - [ TableAlias() ] + [ LOOKAHEAD(2) TableAlias() ] { return jjtThis; } } @@ -2983,9 +2983,8 @@ ASTArguments Arguments() : } { //"(" [ ArgumentList() ] ")" - ("(") - [ (ArgumentList()) ] - (")") + + "(" [ [ | | ] ("*" | ArgumentList()) ] ")" { return jjtThis ; } @@ -3362,7 +3361,7 @@ ASTTypeSpecification TypeSpecification() : ( ObjectNameDeclaration() //SUBTYPE | LOOKAHEAD(2) ( | ) // OBJECT TYPE - | LOOKAHEAD(2) ( | ) "(*)" // OPAQUE TYPE + | LOOKAHEAD(2) ( | ) "(" "*" ")" // OPAQUE TYPE ( | | StringLiteral() ) [ "." ( | | StringLiteral() ) ] | LOOKAHEAD(2) ( | ) CollectionTypeName() Datatype() diff --git a/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/SelectExpressionsTest.java b/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/SelectExpressionsTest.java index 7bd3b43c38..b6264dfe94 100644 --- a/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/SelectExpressionsTest.java +++ b/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/SelectExpressionsTest.java @@ -17,10 +17,18 @@ public class SelectExpressionsTest extends AbstractPLSQLParserTst { @Test @Ignore - public void parseSelectCount() throws Exception { + public void parseSelectExpression() throws Exception { String code = IOUtils.toString(this.getClass().getResourceAsStream("SelectExpressions.pls"), StandardCharsets.UTF_8); ASTInput input = parsePLSQL(code); Assert.assertNotNull(input); } + + @Test + public void parseSelectCount() throws Exception { + String code = IOUtils.toString(this.getClass().getResourceAsStream("SelectCount.pls"), + StandardCharsets.UTF_8); + ASTInput input = parsePLSQL(code); + Assert.assertNotNull(input); + } } diff --git a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SelectCount.pls b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SelectCount.pls new file mode 100644 index 0000000000..23748a1c9a --- /dev/null +++ b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SelectCount.pls @@ -0,0 +1,23 @@ +DECLARE + bonus NUMBER(8,2); +BEGIN + +SELECT COUNT(*) INTO x FROM y1; +SELECT COUNT (*) INTO x FROM y2; +SELECT COUNT ( * ) INTO x FROM y2; +SELECT COUNT(DISTINCT other_id) INTO x FROM y3; +SELECT COUNT(ALL other_id) INTO x FROM y3; +SELECT COUNT(UNIQUE other_id) INTO x FROM y3; + +SELECT + some_col "alias in quotes" + INTO some_record + FROM some_table; + +SELECT + COUNT(*) "Total Empl" + INTO some_record + FROM some_table; + +END; +/ diff --git a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SelectExpressions.pls b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SelectExpressions.pls index 9270c1c1f1..06641367bd 100644 --- a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SelectExpressions.pls +++ b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/SelectExpressions.pls @@ -4,17 +4,6 @@ BEGIN -SELECT - some_col "alias in quotes" - INTO some_record - FROM some_table; - - -SELECT - COUNT(*) "Total Empl" - INTO some_record - FROM some_table; - SELECT AVG(salary) * 12 "Average Sal" INTO some_record