A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://github.com/pmd/pmd/issues/5521 below:

[plsql] Long parse time and eventually parse error with XMLAGG order by clause · Issue #5521 · pmd/pmd · GitHub

Affects PMD Version:

PMD 7.9.0 (10b47319e42bb817df69d29196ceca8fdb94b461, 2024-12-27T12:29:08Z)
Java version: 21.0.6, vendor: Ubuntu, runtime: /usr/lib/jvm/java-21-openjdk-amd64

Description:

A relatively simple SQL expression takes overly long to parse and eventually fails. While I believe the SQL expression such as it is isn't valid(?), the actual failure happened in a nested context where the parser didn't finish even within half an hour, at which point I stopped it.

The full example that I wanted to have it parse is https://github.com/Qualtagh/OracleDBUtils/blob/master/p_utils_tests.sql#10, while the nested context I was referring to is at line 30:

                   XMLAgg(
                     XMLElement( "elem", NAME )
                     order by SURNAME
                   )

Exception Stacktrace:

% time pmd ast-dump --language=plsql -i <<EOF
select a(b('' order by c));                                                             
EOF                                                                  
Reading from stdin...                                        
net.sourceforge.pmd.lang.ast.ParseException: Parse exception in file 'stdin' at line 1, column 15: Encountered "ORDER".     
Was expecting one of:                                                                                                                                                                                                                                                                                                                                                                 [0/1627]
    ")" ...                                                                             
    "," ...                                                                             
    "=" ...                                                                                                                                                                                    
    "<" ...                                                                          
    "!" ...                                                                             
    "~" ...                                                                                                                                                                                    
    "+" ...                                                                                                                                                                                    
    "-" ...                                                                                                                                                                                    
    "^" ...                                                            
    ">" ...                                                     
    "||" ...                                                                                                                                                                                   
    "AND" ...                                                       
    "BETWEEN" ...                                                   
    "DEFAULT" ...                                                                       
    "IN" ...                                                         
    "IS" ...                                                 
    "LIKE" ...                                                
    "NOT" ...                                                                          
    "ON" ...
    "OR" ...                 
    "MEMBER" ...           
    "USING" ...                                                             
    "MULTISET" ...                  
    "SUBMULTISET" ...
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.generateParseException(PLSQLParserImpl.java)                                                                                     
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.jj_consume_token(PLSQLParserImpl.java)                                                                                           
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.Arguments(PLSQLParserImpl.java:48106)                                                                                            
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.FunctionCall(PLSQLParserImpl.java:16885)                                                                                         
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.PrimaryPrefix(PLSQLParserImpl.java:46183)                                                                                        
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.PrimaryExpression(PLSQLParserImpl.java:46123)                                                                                    
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.IsOfTypeCondition(PLSQLParserImpl.java:45365)                                                                                    
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.IsNullCondition(PLSQLParserImpl.java:44859)                                                                                      
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.UnaryExpressionNotPlusMinus(PLSQLParserImpl.java:44422)                                                                          
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.UnaryExpression(PLSQLParserImpl.java:44252)                                                                                      
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.MultiplicativeExpression(PLSQLParserImpl.java:43811)                                                                             
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.AdditiveExpression(PLSQLParserImpl.java:43697)                                                                                   
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.RelationalExpression(PLSQLParserImpl.java:43457)                                                                                 
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.EqualityExpression(PLSQLParserImpl.java:43387)                                                                                   
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.ConditionalAndExpression(PLSQLParserImpl.java:43339)                                                                             
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.ConditionalOrExpression(PLSQLParserImpl.java:43291)                                                                              
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.Expression(PLSQLParserImpl.java:42378)                                                                                           
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.Argument(PLSQLParserImpl.java:48200)                                                                                             
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.ArgumentList(PLSQLParserImpl.java:48138)                                                                                         
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.Arguments(PLSQLParserImpl.java:48086)                                                                                            
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.FunctionCall(PLSQLParserImpl.java:16885)                                                                                         
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.PrimaryPrefix(PLSQLParserImpl.java:46183)                                                                                        
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.PrimaryExpression(PLSQLParserImpl.java:46123)                                                                                    
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.IsOfTypeCondition(PLSQLParserImpl.java:45365)                                                                                    
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.IsNullCondition(PLSQLParserImpl.java:44859)                                                                                      
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.UnaryExpressionNotPlusMinus(PLSQLParserImpl.java:44422)                                                                          
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.UnaryExpression(PLSQLParserImpl.java:44252)                                                                                      
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.MultiplicativeExpression(PLSQLParserImpl.java:43811)                                                                             
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.AdditiveExpression(PLSQLParserImpl.java:43697)                                                                                   
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.SqlExpression(PLSQLParserImpl.java:14067)                                                                                        
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.SelectListEntry(PLSQLParserImpl.java:22345)                                                                                      
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.SelectList(PLSQLParserImpl.java:22294)                                                                                           
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.SelectStatement(PLSQLParserImpl.java:29482)                                                                                      
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParserImpl.Input(PLSQLParserImpl.java:189)
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParser.parseImpl(PLSQLParser.java:86)
        at net.sourceforge.pmd.lang.plsql.ast.PLSQLParser.parseImpl(PLSQLParser.java:21)
        at net.sourceforge.pmd.lang.ast.impl.javacc.JjtreeParserAdapter.parse(JjtreeParserAdapter.java:36)                                                                                     
        at net.sourceforge.pmd.util.treeexport.TreeExporter.run(TreeExporter.java:84)
        at net.sourceforge.pmd.util.treeexport.TreeExporter.export(TreeExporter.java:59)
        at net.sourceforge.pmd.cli.commands.internal.TreeExportCommand.execute(TreeExportCommand.java:111)                                                                                     
        at net.sourceforge.pmd.cli.commands.internal.AbstractPmdSubcommand.call(AbstractPmdSubcommand.java:30)                                                                                 
        at net.sourceforge.pmd.cli.commands.internal.AbstractPmdSubcommand.call(AbstractPmdSubcommand.java:16)                                                                                 
        at picocli.CommandLine.executeUserObject(CommandLine.java:2045)
        at picocli.CommandLine.access$1500(CommandLine.java:148)
        at picocli.CommandLine$RunLast.executeUserObjectOfLastSubcommandWithSameParent(CommandLine.java:2465)                                                                                  
        at picocli.CommandLine$RunLast.handle(CommandLine.java:2457)                                                                                                                           
        at picocli.CommandLine$RunLast.handle(CommandLine.java:2419)           
        at picocli.CommandLine$AbstractParseResultHandler.execute(CommandLine.java:2277)
        at picocli.CommandLine$RunLast.execute(CommandLine.java:2421)
        at picocli.CommandLine.execute(CommandLine.java:2174)
        at net.sourceforge.pmd.cli.PmdCli.main(PmdCli.java:24)
pmd ast-dump --language=plsql -i <<<''  9.40s user 0.23s system 108% cpu 8.865 total

Code Sample demonstrating the issue:

select a(b('' order by c));

Running PMD through: CLI

% java -version
openjdk version "21.0.6" 2025-01-21
OpenJDK Runtime Environment (build 21.0.6+7-Ubuntu-124.04.1)
OpenJDK 64-Bit Server VM (build 21.0.6+7-Ubuntu-124.04.1, mixed mode, sharing)

RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4