diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index cf0b330b6c..38874df3eb 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -28,6 +28,8 @@ This is a {{ site.pmd.release_type }} release. * [#1513](https://github.com/pmd/pmd/issues/1513): \[java] LocalVariableCouldBeFinal: allow excluding the variable in a for-each loop * java-errorprone * [#1035](https://github.com/pmd/pmd/issues/1035): \[java] ReturnFromFinallyBlock: False positive on lambda expression in finally block +* 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