Skip to content

Commit

Permalink
Merge pull request #5134 from adangel/issue-5133-plsql-parse-error
Browse files Browse the repository at this point in the history
[plsql] Fix ScalarDataTypeName and CollectionTypeName parsing
  • Loading branch information
jsotuyod authored Jul 25, 2024
2 parents 3ffb3ec + 6a242f0 commit 7272799
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 8 deletions.
1 change: 1 addition & 0 deletions docs/pages/release_notes.md
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@ This is a {{ site.pmd.release_type }} release.
* [#5086](https://github.com/pmd/pmd/pull/5086): \[plsql] Fixed issue with missing optional table alias in MERGE usage
* [#5087](https://github.com/pmd/pmd/pull/5087): \[plsql] Add support for SQL_MACRO
* [#5088](https://github.com/pmd/pmd/pull/5088): \[plsql] Add support for 'DEFAULT' clause on the arguments of some oracle functions
* [#5133](https://github.com/pmd/pmd/issues/5133): \[plsql] AssertionError: Root of the tree should implement RootNode for a PL/SQL type declaration
* cli
* [#5120](https://github.com/pmd/pmd/issues/5120): \[cli] Can't start designer under Windows
* core
Expand Down
15 changes: 7 additions & 8 deletions pmd-plsql/etc/grammar/PLSQL.jjt
Original file line number Diff line number Diff line change
Expand Up @@ -871,6 +871,9 @@ ASTCompilationDataType CompilationDataType() :
}
}

/**
* https://docs.oracle.com/en/database/oracle/oracle-database/23/lnpls/CREATE-TYPE-statement.html#GUID-389D603D-FBD0-452A-8414-240BBBC57034__OBJECT_BASE_TYPE_DEF-DE2DD0FF
*/
ASTCollectionTypeName CollectionTypeName() :
{ PLSQLNode size=null, precision=null;
StringBuilder sb = new StringBuilder();
Expand All @@ -886,8 +889,8 @@ ASTCollectionTypeName CollectionTypeName() :
sb.append(token.getImage());
}
}
(LOOKAHEAD(2) "(" size=NumericLiteral() {sb.append( "(" + size);}
["," precision=NumericLiteral() {sb.append( "," + precision);}]
(LOOKAHEAD(2) "(" size = NumericLiteral() { sb.append("(").append(size.getImage()); }
["," precision = NumericLiteral() { sb.append(",").append(precision.getImage()); }]
[ <CHAR> {sb.append( " CHAR") ;}]
[ <BYTE> {sb.append( " BYTE") ;}]
")" {sb.append( ")");})?
Expand Down Expand Up @@ -993,12 +996,8 @@ ASTScalarDataTypeName ScalarDataTypeName() :
LOOKAHEAD(4) (<WITH><LOCAL><TIME><ZONE> {name.append(" WITH LOCAL TIME ZONE");}) |
LOOKAHEAD(3) (<WITH><TIME><ZONE> {name.append( " WITH TIME ZONE");}) |
LOOKAHEAD(2) (<TO><MONTH> {name.append( " TO MONTH");}) |
LOOKAHEAD(2) (<TO><SECOND> {name.append( " TO SECOND");}
(
LOOKAHEAD(2) "(" precision=NumericLiteral() {name.append( "(" + precision) ;}
")" {name.append( ")");}
)?
)
LOOKAHEAD(2) <TO><SECOND> { name.append(" TO SECOND"); }
[ LOOKAHEAD(2) "(" precision = NumericLiteral() { name.append("(").append(precision.getImage()).append(")"); } ")" ]
]

{ jjtThis.setImage(name.toString()) ; return jjtThis; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,4 +71,9 @@ void sqlMacroClause() {
void parseSelectExpression() {
doTest("SelectExpressions");
}

@Test
void issue5133SubTypeDefinition() {
doTest("Issue5133SubTypeDefinition");
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
--
-- from https://github.com/pmd/pmd/issues/5133
--

CREATE or REPLACE PACKAGE x as
type last_run_duration is interval day(9) to second(6);
end x;
/

CREATE TYPE phone_list_typ_demo AS VARRAY(5) OF VARCHAR2(25);
/
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
+- Input[@CanonicalImage = null, @ExcludedLinesCount = 0, @ExcludedRangesCount = 0]
+- PackageSpecification[@CanonicalImage = "X", @Image = "x", @ObjectName = "x"]
| +- ObjectNameDeclaration[@CanonicalImage = "X", @Image = "x"]
| | +- ID[@CanonicalImage = "X", @Image = "x"]
| +- DeclarativeSection[@CanonicalImage = null]
| | +- DeclarativeUnit[@CanonicalImage = null]
| | +- SubTypeDefinition[@CanonicalImage = "LAST_RUN_DURATION", @Image = "last_run_duration"]
| | +- QualifiedID[@CanonicalImage = "LAST_RUN_DURATION", @Image = "last_run_duration"]
| | +- Datatype[@CanonicalImage = "INTERVAL DAY(9) TO SECOND(6)", @Image = "INTERVAL DAY(9) TO SECOND(6)", @TypeImage = "INTERVAL DAY(9) TO SECOND(6)"]
| | +- ScalarDataTypeName[@CanonicalImage = "INTERVAL DAY(9) TO SECOND(6)", @Image = "INTERVAL DAY(9) TO SECOND(6)"]
| | +- NumericLiteral[@CanonicalImage = "9", @Image = "9"]
| | +- NumericLiteral[@CanonicalImage = "6", @Image = "6"]
| +- ID[@CanonicalImage = "X", @Image = "x"]
+- TypeSpecification[@CanonicalImage = "PHONE_LIST_TYP_DEMO", @Image = "phone_list_typ_demo", @ObjectName = "phone_list_typ_demo"]
+- ObjectNameDeclaration[@CanonicalImage = "PHONE_LIST_TYP_DEMO", @Image = "phone_list_typ_demo"]
| +- ID[@CanonicalImage = "PHONE_LIST_TYP_DEMO", @Image = "phone_list_typ_demo"]
+- CollectionTypeName[@CanonicalImage = "VARRAY(5)", @Image = "VARRAY(5)"]
| +- NumericLiteral[@CanonicalImage = "5", @Image = "5"]
+- Datatype[@CanonicalImage = "VARCHAR2(25)", @Image = "VARCHAR2(25)", @TypeImage = "VARCHAR2(25)"]
+- ScalarDataTypeName[@CanonicalImage = "VARCHAR2(25)", @Image = "VARCHAR2(25)"]
+- NumericLiteral[@CanonicalImage = "25", @Image = "25"]

0 comments on commit 7272799

Please sign in to comment.