From fcdded6d5d5a92526d578457eaf549e6a2bb4352 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Wed, 23 Jan 2019 21:11:46 +0100 Subject: [PATCH] [plsql] ParseException with subqueries in WHERE clause Fixes #1589 --- docs/pages/release_notes.md | 2 ++ pmd-plsql/etc/grammar/PldocAST.jjt | 2 ++ .../pmd/lang/plsql/ast/WhereClauseTest.java | 7 +++++++ .../pmd/lang/plsql/ast/WhereClauseSubqueries.pls | 14 ++++++++++++++ 4 files changed, 25 insertions(+) create mode 100644 pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/WhereClauseSubqueries.pls diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index ee410dcd04..859fa26b03 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -37,6 +37,8 @@ This is a {{ site.pmd.release_type }} release. * [#1633](https://github.com/pmd/pmd/issues/1633): \[java] UnsynchronizedStaticFormatter reports commons lang FastDateFormat * java-performance * [#1632](https://github.com/pmd/pmd/issues/1632): \[java] ConsecutiveLiteralAppends false positive over catch +* plsql + * [#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 f08f27c0cc..017e786489 100644 --- a/pmd-plsql/etc/grammar/PldocAST.jjt +++ b/pmd-plsql/etc/grammar/PldocAST.jjt @@ -1414,6 +1414,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/WhereClauseTest.java b/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/WhereClauseTest.java index 18d549472a..59141160fd 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 @@ -68,4 +68,11 @@ public class WhereClauseTest extends AbstractPLSQLParserTst { StandardCharsets.UTF_8); ASTInput input = parsePLSQL(code); } + + @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..6c67d24e65 --- /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 table + WHERE id = (SELECT id FROM other_table); + +UPDATE table SET name = 'a' + WHERE id = (SELECT id FROM other_table); + +END; +/