[plsql] Parse Exception when using SELECT COUNT(*)

Fixes #1508
This commit is contained in:
Andreas Dangel
2018-12-12 09:44:35 +01:00
parent 2bb8571a29
commit 7a8ef70e95
5 changed files with 39 additions and 18 deletions

View File

@ -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

View File

@ -1486,7 +1486,7 @@ void SelectListEntry() #void :
ASTColumnAlias ColumnAlias() :
{}
{
<IDENTIFIER> { jjtThis.setImage(token.image); }
( <IDENTIFIER> | <QUOTED_LITERAL> ) { 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()) ]
(")")
"(" [ [<ALL> | <DISTINCT> | <UNIQUE>] ("*" | ArgumentList()) ] ")"
{
return jjtThis ;
}
@ -3362,7 +3361,7 @@ ASTTypeSpecification TypeSpecification() :
(
<UNDER> ObjectNameDeclaration() //SUBTYPE
| LOOKAHEAD(2) (<IS> | <AS> ) <OBJECT> // OBJECT TYPE
| LOOKAHEAD(2) (<IS> | <AS> ) <OPAQUE> <VARYING> "(*)" // OPAQUE TYPE
| LOOKAHEAD(2) (<IS> | <AS> ) <OPAQUE> <VARYING> "(" "*" ")" // OPAQUE TYPE
<USING> <LIBRARY> (<IDENTIFIER> | <QUOTED_LITERAL> | StringLiteral() )
[ "." (<IDENTIFIER> | <QUOTED_LITERAL> | StringLiteral() ) ]
| LOOKAHEAD(2) (<IS> | <AS> ) CollectionTypeName() <OF> Datatype()

View File

@ -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);
}
}

View File

@ -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;
/

View File

@ -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