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)
