From 182ba549ba357693f9fa7eec737397ba9761c6e1 Mon Sep 17 00:00:00 2001 From: Piotr Szymanski Date: Wed, 14 Aug 2019 10:31:59 +0200 Subject: [PATCH 1/2] fixes for referencing record type variables --- pmd-plsql/etc/grammar/PldocAST.jjt | 7 +-- .../pmd/lang/plsql/ast/RecordTypeTest.java | 24 ++++++++++ .../pmd/lang/plsql/ast/RecordType.pls | 47 +++++++++++++++++++ 3 files changed, 75 insertions(+), 3 deletions(-) create mode 100644 pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/RecordTypeTest.java create mode 100644 pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/RecordType.pls diff --git a/pmd-plsql/etc/grammar/PldocAST.jjt b/pmd-plsql/etc/grammar/PldocAST.jjt index 6f3477722a..768f4e7a12 100644 --- a/pmd-plsql/etc/grammar/PldocAST.jjt +++ b/pmd-plsql/etc/grammar/PldocAST.jjt @@ -1885,6 +1885,7 @@ ASTVariableName VariableName() : { id = ID() { name.append(id.getImage()); } [ "." id = ID() { name.append('.').append(id.getImage()); } ] + [ "." id = ID() { name.append('.').append(id.getImage()); } ] { jjtThis.setImage(name.toString()); return jjtThis; @@ -2325,7 +2326,7 @@ ASTValuesClause ValuesClause() : ( "(" ( Expression() | <_DEFAULT> ) ( "," ( Expression() | <_DEFAULT> ) )* ")" | - ID() // that's a record variable name + Name() // that's a record variable name ) { return jjtThis; } } @@ -2409,7 +2410,7 @@ ASTUpdateSetClause UpdateSetClause() : { ( - LOOKAHEAD(1) "=" ID() + LOOKAHEAD(1) "=" Name() | "VALUE" "(" TableAlias() ")" "=" ( LOOKAHEAD(1) "(" Subquery() ")" | Expression() ) | @@ -2431,7 +2432,7 @@ ASTUpdateSetClause UpdateSetClause() : ASTReturningClause ReturningClause() : {} { - ( | ) ( Expression() (",")? )+ ( ID() (",")? )+ + ( | ) ( Expression() (",")? )+ ( Name() (",")? )+ { return jjtThis; } } diff --git a/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/RecordTypeTest.java b/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/RecordTypeTest.java new file mode 100644 index 0000000000..1b0a3f4e06 --- /dev/null +++ b/pmd-plsql/src/test/java/net/sourceforge/pmd/lang/plsql/ast/RecordTypeTest.java @@ -0,0 +1,24 @@ +/** + * BSD-style license; for more info see http://pmd.sourceforge.net/license.html + */ + +package net.sourceforge.pmd.lang.plsql.ast; + +import java.nio.charset.StandardCharsets; + +import org.apache.commons.io.IOUtils; +import org.junit.Assert; +import org.junit.Test; + +import net.sourceforge.pmd.lang.plsql.AbstractPLSQLParserTst; + +public class RecordTypeTest extends AbstractPLSQLParserTst { + + @Test + public void parseRecordType() throws Exception { + String code = IOUtils.toString(this.getClass().getResourceAsStream("RecordType.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/RecordType.pls b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/RecordType.pls new file mode 100644 index 0000000000..c9d62a1226 --- /dev/null +++ b/pmd-plsql/src/test/resources/net/sourceforge/pmd/lang/plsql/ast/RecordType.pls @@ -0,0 +1,47 @@ +create or replace package body solt9001 is + + procedure upd is + + begin + + update solt90_web_service_log + set row = solt9001.rec + returning record_version into solt9001.rec.record_version; + + end upd; + +end; +/ + +create or replace package body solt9001 is + + procedure upd is + + begin + + update solt90_web_service_log + set row = solt9001.rec + returning record_version into solt9001.rec.record_version; + + end upd; + +end; +/ + +create or replace function test return varchar2 is + begin + + insert into sol_individual_commission_rate + values solt4601.rec + returning record_version, rowid into solt4601.rec.record_version, solt4601.current_rowid; + + return null; + end test; +/ + +begin + +select id_no into t4666.rec.agent_no from name where company_reg_no = '66666111'; + +end; +/ \ No newline at end of file From 8124a0498bd0084cb44abf3a926bf51716950fd9 Mon Sep 17 00:00:00 2001 From: Andreas Dangel Date: Sun, 8 Sep 2019 11:46:44 +0200 Subject: [PATCH 2/2] Update release notes, refs #1974 Fixes #1935 Fixes #1948 Fixes #1950 --- docs/pages/release_notes.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/docs/pages/release_notes.md b/docs/pages/release_notes.md index 2c69800aaa..a55f72936b 100644 --- a/docs/pages/release_notes.md +++ b/docs/pages/release_notes.md @@ -24,6 +24,10 @@ about the usage and features of the rule designer. * java-codestyle * [#1951](https://github.com/pmd/pmd/issues/1951): \[java] UnnecessaryFullyQualifiedName rule triggered when variable name clashes with package name +* plsql + * [#1935](https://github.com/pmd/pmd/issues/1935): \[plsql] ParseException with SELECT INTO record defined as global variable + * [#1948](https://github.com/pmd/pmd/issues/1948): \[plsql] ParseException with INSERT INTO using package global variables + * [#1950](https://github.com/pmd/pmd/issues/1950): \[plsql] ParseException with UPDATE and package record variable ### API Changes @@ -37,5 +41,7 @@ about the usage and features of the rule designer. ### External Contributions +* [#1974](https://github.com/pmd/pmd/pull/1974): \[plsql] Fixes for referencing record type variables - [Piotr Szymanski](https://github.com/szyman23) + {% endtocmaker %}