Skip to content

[plsql] Parsing exception CURSOR statement with parenthesis groupings #3706

Closed
@hgodinez89

Description

Affects PMD Version:

This error was testing in the following versions:

  • 6.41.0
  • 6.40.0
  • 6.39.0

Description:

Trying to analyze pl/sql code that has CURSOR statement with parenthesis groupings, PMD raises an exception error that indicates "Error while parsing".

Note: The purpose of parenthesis groupings is only for the purpose of making the code more readable.

Exception Stacktrace:

net.sourceforge.pmd.PMDException: Error while parsing C:\testfolder\example_procedure.prc
	at net.sourceforge.pmd.SourceCodeProcessor.processSourceCodeWithoutCache(SourceCodeProcessor.java:124)
	at net.sourceforge.pmd.SourceCodeProcessor.processSourceCode(SourceCodeProcessor.java:100)
	at net.sourceforge.pmd.SourceCodeProcessor.processSourceCode(SourceCodeProcessor.java:62)
	at net.sourceforge.pmd.processor.PmdRunnable.call(PmdRunnable.java:85)
	at net.sourceforge.pmd.processor.PmdRunnable.call(PmdRunnable.java:29)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
	at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
	at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
	at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
	at java.base/java.lang.Thread.run(Thread.java:834)
Caused by: net.sourceforge.pmd.lang.plsql.ast.ParseException: Encountered "  "USER_OBJECTS "" at line 5, column 16.
Was expecting one of:
    "(" ...
    "SELECT" ...
    "WITH" ...
    "WITH" ...
    "SELECT" ...
    "(" ...
	at net.sourceforge.pmd.lang.plsql.ast.PLSQLParser.generateParseException(PLSQLParser.java)
	at net.sourceforge.pmd.lang.plsql.ast.PLSQLParser.jj_consume_token(PLSQLParser.java)
	at net.sourceforge.pmd.lang.plsql.ast.PLSQLParser.Subquery(PLSQLParser.java:10774)
	at net.sourceforge.pmd.lang.plsql.ast.PLSQLParser.QueryTableExpression(PLSQLParser.java:22715)
	at net.sourceforge.pmd.lang.plsql.ast.PLSQLParser.TableReferenceInJoin(PLSQLParser.java:23219)
	at net.sourceforge.pmd.lang.plsql.ast.PLSQLParser.JoinClause(PLSQLParser.java:23341)
	at net.sourceforge.pmd.lang.plsql.ast.PLSQLParser.FromClauseEntry(PLSQLParser.java:21545)
	at net.sourceforge.pmd.lang.plsql.ast.PLSQLParser.FromClause(PLSQLParser.java:21447)
	at net.sourceforge.pmd.lang.plsql.ast.PLSQLParser.RestOfStatement(PLSQLParser.java:10603)
	at net.sourceforge.pmd.lang.plsql.ast.PLSQLParser.SelectStatement(PLSQLParser.java:28448)
	at net.sourceforge.pmd.lang.plsql.ast.PLSQLParser.CursorUnit(PLSQLParser.java:38877)
	at net.sourceforge.pmd.lang.plsql.ast.PLSQLParser.CursorSpecification(PLSQLParser.java:38919)
	at net.sourceforge.pmd.lang.plsql.ast.PLSQLParser.DeclarativeUnit(PLSQLParser.java:2728)
	at net.sourceforge.pmd.lang.plsql.ast.PLSQLParser.DeclarativeSection(PLSQLParser.java:3154)
	at net.sourceforge.pmd.lang.plsql.ast.PLSQLParser.ProgramUnit(PLSQLParser.java:6446)
	at net.sourceforge.pmd.lang.plsql.ast.PLSQLParser.Global(PLSQLParser.java:879)
	at net.sourceforge.pmd.lang.plsql.ast.PLSQLParser.Input(PLSQLParser.java:153)
	at net.sourceforge.pmd.lang.plsql.PLSQLParser.parse(PLSQLParser.java:61)
	at net.sourceforge.pmd.lang.AbstractParser.doParse(AbstractParser.java:44)
	at net.sourceforge.pmd.SourceCodeProcessor.parse(SourceCodeProcessor.java:136)
	at net.sourceforge.pmd.SourceCodeProcessor.processSource(SourceCodeProcessor.java:200)
	at net.sourceforge.pmd.SourceCodeProcessor.processSourceCodeWithoutCache(SourceCodeProcessor.java:118)
	... 10 more

Code Sample demonstrating the issue:

CREATE OR REPLACE PROCEDURE EXAMPLE_PROCEDURE IS
   --
   CURSOR c_example IS
      SELECT a.owner, u.object_name, p.aggregate
        FROM ((USER_OBJECTS u INNER JOIN ALL_OBJECTS a ON
               u.object_name = a.object_name AND u.object_type = a.object_type AND u.object_id = a.object_id)
               INNER JOIN ALL_PROCEDURES p ON
               p.owner = a.owner AND p.object_name = a.object_name AND p.object_type = a.object_type)
       WHERE a.owner = USER;
   --
BEGIN
   --
   FOR l_object IN c_example LOOP
      --
      DBMS_OUTPUT.Put_Line(l_object.owner);
      DBMS_OUTPUT.Put_Line(l_object.object_name);
      DBMS_OUTPUT.Put_Line(l_object.aggregate);
      --
   END LOOP;
   --
END EXAMPLE_PROCEDURE;

Note: By removing all the parentheses in the example c_example cursor, you will not have parsing problems.

Steps to reproduce:

  1. Put the code above ("Code Sample demonstrating the issue" section) in example_procedure.prc
  2. Execute PMD analyzer from CLI.
  3. See the error showed in the "Exception Stacktrace" section.

Running PMD through: [CLI]

Metadata

Assignees

Labels

a:bugPMD crashes or fails to analyse a file.in:grammarAbout the grammar of a lexer or parser, eg, a parse/lex exception

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions