diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index 51de4955c2..1ccb0875a8 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -39,6 +39,7 @@ This is a {{ site.pmd.release_type }} release. * [#1632](https://github.com/pmd/pmd/issues/1632): \[java] ConsecutiveLiteralAppends false positive over catch * plsql * [#1587](https://github.com/pmd/pmd/issues/1587): \[plsql] Parse Exception with EXISTS + * [#1589](https://github.com/pmd/pmd/issues/1589): \[plsql] ParseException with subqueries in WHERE clause ### API Changes diff --git a/pmd-plsql/etc/grammar/PldocAST.jjt b/pmd-plsql/etc/grammar/PldocAST.jjt index 9d7327454c..87fd861cfa 100644 --- a/pmd-plsql/etc/grammar/PldocAST.jjt +++ b/pmd-plsql/etc/grammar/PldocAST.jjt @@ -1481,6 +1481,8 @@ ASTSqlExpression SqlExpression() : LOOKAHEAD(2) Column() | LOOKAHEAD(2) + | + LOOKAHEAD(2) "(" SelectStatement() ")" // see "Scalar Subquery Expressions" | AdditiveExpression() // this can be a literal or a simple expression, but no conditional ) diff --git a/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/TableCollectionExpression.java b/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/TableCollectionExpressionTest.java similarity index 92% rename from pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/TableCollectionExpression.java rename to pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/TableCollectionExpressionTest.java index e5ddb26302..1daad5882a 100644 --- a/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/TableCollectionExpression.java +++ b/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/TableCollectionExpressionTest.java @@ -12,7 +12,7 @@ import org.junit.Test; import net.sourceforge.pmd.lang.plsql.AbstractPLSQLParserTst; -public class TableCollectionExpression extends AbstractPLSQLParserTst { +public class TableCollectionExpressionTest extends AbstractPLSQLParserTst { @Test public void testExamples() throws Exception { diff --git a/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/WhereClauseTest.java b/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/WhereClauseTest.java index 98ef0c72ff..38ef2de44a 100644 --- a/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/WhereClauseTest.java +++ b/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/WhereClauseTest.java @@ -94,4 +94,11 @@ public class WhereClauseTest extends AbstractPLSQLParserTst { Assert.assertEquals("'([aeiou])\\1'", regexps.get(1).getPattern().getImage()); Assert.assertEquals("'i'", regexps.get(1).getMatchParam()); } + + @Test + public void testSubqueries() throws Exception { + String code = IOUtils.toString(this.getClass().getResourceAsStream("WhereClauseSubqueries.pls"), + StandardCharsets.UTF_8); + ASTInput input = parsePLSQL(code); + } } diff --git a/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/WhereClauseSubqueries.pls b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/WhereClauseSubqueries.pls new file mode 100644 index 0000000000..a6c25d36d5 --- /dev/null +++ b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/WhereClauseSubqueries.pls @@ -0,0 +1,14 @@ +-- +-- Where Clause with Subqueries +-- + +BEGIN + +SELECT id INTO v_id FROM my_table + WHERE id = (SELECT id FROM other_table); + +UPDATE my_table SET name = 'a' + WHERE id = (SELECT id FROM other_table); + +END; +/