From 5570e65bafc8e424869dde753e890da991b09c97 Mon Sep 17 00:00:00 2001 From: Hugo Araya Nash Date: Sun, 23 Jun 2019 16:55:45 -0400 Subject: [PATCH 1/3] [plsql] Correct case expression --- pmd-plsql/etc/grammar/PldocAST.jjt | 24 ++++++------------- .../pmd/lang/plsql/ast/SelectExpressions.pls | 23 ++++++++++++++++++ 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/pmd-plsql/etc/grammar/PldocAST.jjt b/pmd-plsql/etc/grammar/PldocAST.jjt index 62f94d4028..4f6a57314d 100644 --- a/pmd-plsql/etc/grammar/PldocAST.jjt +++ b/pmd-plsql/etc/grammar/PldocAST.jjt @@ -2870,24 +2870,14 @@ ASTAssignment Assignment() : } ASTCaseExpression CaseExpression() : -{ Token thisToken; PLSQLNode simpleNode = null; StringBuilder sb = new StringBuilder() ; } +{} { - ( - thisToken = { sb.append(thisToken.image);} - ( simpleNode = Expression() { sb.append(" "); sb.append(simpleNode.getImage()); } )? - ( thisToken = { sb.append(" "); sb.append(thisToken.image); } - simpleNode = Expression() { sb.append(" "); sb.append(simpleNode.getImage()); } - thisToken = { sb.append(" "); sb.append(thisToken.image); } - Expression() { sb.append(" "); sb.append(simpleNode.getImage()); } - )+ - [ thisToken = { sb.append(" "); sb.append(thisToken.image);} - Expression() { sb.append(" "); sb.append(simpleNode.getImage()); } - ] - thisToken = { sb.append(" "); sb.append(thisToken.image);} - ) - { - jjtThis.setImage(sb.toString()); return jjtThis; - } + + ( Expression() ( Expression() Expression() )+ + | ( Condition() Expression() )+ ) + [ Expression() ] + + { return jjtThis; } } /* 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 2c2609b391..764c82d919 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 @@ -80,5 +80,28 @@ SELECT CASE INTO my_result FROM DUAL; +SELECT CASE WHEN EXISTS(SELECT * + FROM DUAL + WHERE 1 = 1) + THEN 1 + ELSE 0 + END isExists + INTO VAL + FROM dual; + +SELECT CASE WHEN EXISTS(SELECT * + FROM DUAL) + THEN 1 + ELSE 0 + END isExists + INTO VAL + FROM dual; + +SELECT CASE + WHEN f1(x) IS NULL THEN 1 + ELSE 0 + END isExists + INTO VAL + FROM dual; END; / \ No newline at end of file From f05cde6f2484cf70c263ac344a428b9c03178ace Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Fri, 28 Jun 2019 21:52:45 +0200 Subject: [PATCH 2/3] [plsql] Fix lookahead for CaseExpression --- pmd-plsql/etc/grammar/PldocAST.jjt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pmd-plsql/etc/grammar/PldocAST.jjt b/pmd-plsql/etc/grammar/PldocAST.jjt index 4f6a57314d..6254b382d3 100644 --- a/pmd-plsql/etc/grammar/PldocAST.jjt +++ b/pmd-plsql/etc/grammar/PldocAST.jjt @@ -3250,7 +3250,7 @@ ASTPrimaryPrefix PrimaryPrefix() : // Note: AnalyticClause and WithinClause are only allowed for specific functions, but this grammar allows it for all functions. LOOKAHEAD(FunctionName() "(") ( simpleNode = FunctionCall() [ AnalyticClause() ] [ WithinClause() ] ) { sb.append(simpleNode.getImage()); } | LOOKAHEAD(MultiSetCondition()) simpleNode = MultiSetCondition() -| LOOKAHEAD(CaseExpression()) ( simpleNode =CaseExpression() ) { sb.append(simpleNode.getImage()) ; } //SRT 20110520 +| LOOKAHEAD() ( simpleNode =CaseExpression() ) { sb.append(simpleNode.getImage()) ; } //SRT 20110520 | LOOKAHEAD(ObjectExpression() ) ( simpleNode = ObjectExpression() ) { sb.append(simpleNode.getImage()) ; } //SRT 20110604 //| LOOKAHEAD(LikeExpression()) ( simpleNode = LikeExpression() ) { sb.append(simpleNode.getImage()) ; } //SRT 20110604 | LOOKAHEAD(SimpleExpression()) ( simpleNode = SimpleExpression() ) { sb.append(simpleNode.getImage()); } From f6f4512a9264c2db0e64e5d9ef85ae90a7948ace Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Fri, 28 Jun 2019 21:59:34 +0200 Subject: [PATCH 3/3] Update release notes, refs #1885 --- docs/pages/release_notes.md | 5 ++++- pmd-plsql/etc/grammar/PldocAST.jjt | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index 1b72777f84..52c3dbef86 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -16,7 +16,7 @@ This is a {{ site.pmd.release_type }} release. #### PLSQL Grammar Updates -The grammar has been updated to support Inline Constraints in CREATE TABLE statements. Additionally, the +The grammar has been updated to support inline constraints in CREATE TABLE statements. Additionally, the CREATE TABLE statement may now be followed by physical properties and table properties. However, these properties are skipped over during parsing. @@ -25,6 +25,8 @@ The CREATE VIEW statement now supports subquery views. The EXTRACT function can now be parsed correctly. It is used to extract values from a specified datetime field. +The CASE expression can now be properly used within SELECT statements. + #### New Rules * The Java rule {% rule "java/bestpractices/DoubleBraceInitialization" %} (`java-bestpractices`) @@ -116,6 +118,7 @@ of deprecations. * [#1874](https://github.com/pmd/pmd/pull/1874): \[plsql] Add parenthesis equation support for Update - [Hugo Araya Nash](https://github.com/kabroxiko) * [#1883](https://github.com/pmd/pmd/pull/1883): \[plsql] Fix #1873 Expression list not working - [Hugo Araya Nash](https://github.com/kabroxiko) * [#1884](https://github.com/pmd/pmd/pull/1884): \[plsql] fix #1878 Support explicit INNER word for INNER JOIN - [Hugo Araya Nash](https://github.com/kabroxiko) +* [#1885](https://github.com/pmd/pmd/pull/1885): \[plsql] Correct case expression - [Hugo Araya Nash](https://github.com/kabroxiko) {% endtocmaker %} diff --git a/pmd-plsql/etc/grammar/PldocAST.jjt b/pmd-plsql/etc/grammar/PldocAST.jjt index 6254b382d3..b7a918a04d 100644 --- a/pmd-plsql/etc/grammar/PldocAST.jjt +++ b/pmd-plsql/etc/grammar/PldocAST.jjt @@ -27,7 +27,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. /** - * Various fixes for expression lists, join clauses + * Various fixes for expression lists, join clauses, case expression * * Hugo Araya Nash 06/2019 *====================================================================