0
votes

I have modified the PLSQL parser given by [Porcelli] (https://github.com/porcelli/plsql-parser ). I am using this parser to parse PlSql files. I am facing issue with parsing Insert..Select statements, e.g.

insert into tname Select cname from tname2

But if I provide column names to the insert statement, then it will parse successfully, e.g

insert into tname (c1,c2) Select cname from tname2

Grammar for Insert_statement is present in

insert_statement
:    insert_key^
(    single_table_insert
|    multi_table_insert
)
;

// $<Insert - Specific Clauses

single_table_insert
:    insert_into_clause
(    values_clause static_returning_clause?
|    select_statement
)
error_logging_clause?
-> ^(SINGLE_TABLE_MODE insert_into_clause values_clause? static_returning_clause?          select_statement? error_logging_clause?)
;

insert_into_clause
:    into_key general_table_ref 
    (LEFT_PAREN column_name (COMMA column_name)* RIGHT_PAREN)?
    -> ^(into_key general_table_ref ^(COLUMNS column_name*))
;

Not sure why it is failing for first case, even though grammar handles tht case.

EDIT:

I am getting NoViableException, here is the stacktrace,

Exception in thread "main" java.lang.RuntimeException: Parser Exception
NoViableAltException(33@[])
at br.com.porcelli.parser.plsql.PLSQLParser_PLSQL_DMLParser.single_table_insert(PLSQLParser_PLSQL_DMLParser.java:12904)
at br.com.porcelli.parser.plsql.PLSQLParser_PLSQL_DMLParser.insert_statement(PLSQLParser_PLSQL_DMLParser.java:12806)
at br.com.porcelli.parser.plsql.PLSQLParser.insert_statement(PLSQLParser.java:36823)
at com.abc.xyz.main.PlSql.parse(PlSql.java:49)
at com.abc.xyz.main.PlSql.main(PlSql.java:41)

at br.com.porcelli.parser.plsql.PLSQLParser_PLSQL_DMLParser.reportError(PLSQLParser_PLSQL_DMLParser.java:821)
at br.com.porcelli.parser.plsql.PLSQLParser_PLSQL_DMLParser.single_table_insert(PLSQLParser_PLSQL_DMLParser.java:13058)
at br.com.porcelli.parser.plsql.PLSQLParser_PLSQL_DMLParser.insert_statement(PLSQLParser_PLSQL_DMLParser.java:12806)
at br.com.porcelli.parser.plsql.PLSQLParser.insert_statement(PLSQLParser.java:36823)
at com.abc.xyz.main.PlSql.parse(PlSql.java:49)
at com.abc.xyz.main.PlSql.main(PlSql.java:41)
1
it seems that the grammar should handle it, what is the error message? - lp_
@lp_ - I have added error message to the question. - Mohit Chawda

1 Answers

1
votes

It works for me. Try to use mine branch. But I can not tell why. See