|
|
@ -227,6 +227,9 @@ public class PLSQLParser {
|
|
|
|
/**
|
|
|
|
/**
|
|
|
|
* Semantic lookahead to check if the next identifier is a
|
|
|
|
* Semantic lookahead to check if the next identifier is a
|
|
|
|
* specific keyword.
|
|
|
|
* specific keyword.
|
|
|
|
|
|
|
|
*
|
|
|
|
|
|
|
|
* <p>
|
|
|
|
|
|
|
|
* Usage: <code>LOOKAHEAD({isKeyword("WAIT")}) KEYWORD("WAIT")</code>
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
private boolean isKeyword(String keyword) {
|
|
|
|
private boolean isKeyword(String keyword) {
|
|
|
|
return getToken(1).kind == IDENTIFIER && getToken(1).image.equalsIgnoreCase(keyword);
|
|
|
|
return getToken(1).kind == IDENTIFIER && getToken(1).image.equalsIgnoreCase(keyword);
|
|
|
@ -259,13 +262,13 @@ ASTInput Input(String sourcecode) : {}
|
|
|
|
| LOOKAHEAD(6) Directory()
|
|
|
|
| LOOKAHEAD(6) Directory()
|
|
|
|
| LOOKAHEAD(6) DatabaseLink()
|
|
|
|
| LOOKAHEAD(6) DatabaseLink()
|
|
|
|
| LOOKAHEAD(6) Global()
|
|
|
|
| LOOKAHEAD(6) Global()
|
|
|
|
| LOOKAHEAD(6) DDLCommand() //Ignore any other DDL Event
|
|
|
|
| (LOOKAHEAD(6) DDLCommand())+
|
|
|
|
| LOOKAHEAD(2) SqlPlusCommand()
|
|
|
|
| LOOKAHEAD(2) SqlPlusCommand()
|
|
|
|
| UpdateStatement()
|
|
|
|
| UpdateStatement()
|
|
|
|
| DeleteStatement()
|
|
|
|
| DeleteStatement()
|
|
|
|
| InsertStatement()
|
|
|
|
| InsertStatement()
|
|
|
|
| SelectStatement() (";")?
|
|
|
|
| SelectStatement() [";"]
|
|
|
|
|(<COMMIT>|<ROLLBACK>|<SAVEPOINT>|<LOCK><TABLE>|<MERGE>|<WITH>) SkipPastNextTokenOccurrence(SQLPLUS_TERMINATOR) //Ignore SQL statements in scripts
|
|
|
|
|(<COMMIT>|<ROLLBACK>|<SAVEPOINT>|<LOCK><TABLE>|<MERGE>|<WITH>) ReadPastNextOccurrence(";") //Ignore SQL statements in scripts
|
|
|
|
)
|
|
|
|
)
|
|
|
|
("/")*
|
|
|
|
("/")*
|
|
|
|
)*
|
|
|
|
)*
|
|
|
@ -279,8 +282,15 @@ ASTDDLCommand DDLCommand() :
|
|
|
|
}
|
|
|
|
}
|
|
|
|
{
|
|
|
|
{
|
|
|
|
(
|
|
|
|
(
|
|
|
|
simpleNode = DDLEvent()
|
|
|
|
(
|
|
|
|
SkipPastNextTokenOccurrence(SQLPLUS_TERMINATOR)
|
|
|
|
LOOKAHEAD({isKeyword("COMMENT")})
|
|
|
|
|
|
|
|
simpleNode = Comment()
|
|
|
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
(
|
|
|
|
|
|
|
|
simpleNode = DDLEvent()
|
|
|
|
|
|
|
|
ReadPastNextOccurrence(";")
|
|
|
|
|
|
|
|
)
|
|
|
|
)
|
|
|
|
)
|
|
|
|
{ jjtThis.setImage(simpleNode.getImage()) ; return jjtThis ; }
|
|
|
|
{ jjtThis.setImage(simpleNode.getImage()) ; return jjtThis ; }
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -315,7 +325,7 @@ ASTSqlPlusCommand SqlPlusCommand() :
|
|
|
|
| <VARIABLE>
|
|
|
|
| <VARIABLE>
|
|
|
|
| <WHENEVER>
|
|
|
|
| <WHENEVER>
|
|
|
|
// DDL that might be encountered
|
|
|
|
// DDL that might be encountered
|
|
|
|
| <COMMENT>
|
|
|
|
| LOOKAHEAD({isKeyword("COMMENT")}) KEYWORD("COMMENT")
|
|
|
|
| <GRANT>
|
|
|
|
| <GRANT>
|
|
|
|
| <REVOKE>
|
|
|
|
| <REVOKE>
|
|
|
|
| <DROP>
|
|
|
|
| <DROP>
|
|
|
@ -1121,6 +1131,7 @@ ASTRead2NextOccurrence Read2NextOccurrence(String target) :
|
|
|
|
{
|
|
|
|
{
|
|
|
|
nextToken = getNextToken();
|
|
|
|
nextToken = getNextToken();
|
|
|
|
sb.append(nextToken.image);
|
|
|
|
sb.append(nextToken.image);
|
|
|
|
|
|
|
|
sb.append(' ');
|
|
|
|
nextToken = getToken(1);
|
|
|
|
nextToken = getToken(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -1133,10 +1144,11 @@ ASTRead2NextOccurrence Read2NextOccurrence(String target) :
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
ASTReadPastNextOccurrence ReadPastNextOccurrence(String target) :
|
|
|
|
ASTReadPastNextOccurrence ReadPastNextOccurrence(String target) :
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
ASTRead2NextOccurrence skipped = Read2NextOccurrence(target);
|
|
|
|
|
|
|
|
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
StringBuilder sb = new StringBuilder();
|
|
|
|
Token t = null;
|
|
|
|
sb.append(skipped.getImage()) ;
|
|
|
|
sb.append(Read2NextOccurrence(target)) ;
|
|
|
|
Token t = getNextToken(); // Chomp this one
|
|
|
|
t = getNextToken(); // Chomp this one
|
|
|
|
|
|
|
|
sb.append(t.image);
|
|
|
|
sb.append(t.image);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -3860,19 +3872,22 @@ ASTViewColumn ViewColumn() :
|
|
|
|
{ return jjtThis ; }
|
|
|
|
{ return jjtThis ; }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* https://docs.oracle.com/en/database/oracle/oracle-database/18/sqlrf/COMMENT.html#GUID-65F447C4-6914-4823-9691-F15D52DB74D7
|
|
|
|
|
|
|
|
*/
|
|
|
|
ASTComment Comment() :
|
|
|
|
ASTComment Comment() :
|
|
|
|
{
|
|
|
|
{
|
|
|
|
}
|
|
|
|
}
|
|
|
|
{
|
|
|
|
{
|
|
|
|
<COMMENT> <ON> (
|
|
|
|
LOOKAHEAD({isKeyword("COMMENT")}) KEYWORD("COMMENT") { jjtThis.setImage(token.image); }
|
|
|
|
|
|
|
|
<ON> (
|
|
|
|
((<TABLE> | <OPERATOR> | <INDEXTYPE>) [LOOKAHEAD(2) ID()"."] ID()) |
|
|
|
|
((<TABLE> | <OPERATOR> | <INDEXTYPE>) [LOOKAHEAD(2) ID()"."] ID()) |
|
|
|
|
(<COLUMN> [LOOKAHEAD(ID()"."ID()"."ID()) ID()"."] ID() "." ID())
|
|
|
|
(<COLUMN> [LOOKAHEAD(ID()"."ID()"."ID()) ID()"."] ID() "." ID())
|
|
|
|
)
|
|
|
|
)
|
|
|
|
<IS> <STRING_LITERAL>
|
|
|
|
<IS> StringLiteral()
|
|
|
|
[";"]
|
|
|
|
";"
|
|
|
|
{ return jjtThis ; }
|
|
|
|
{ return jjtThis ; }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
// SRT * /
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -4445,23 +4460,26 @@ ASTNonDMLTrigger NonDMLTrigger() :
|
|
|
|
{ return jjtThis ; }
|
|
|
|
{ return jjtThis ; }
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
|
|
|
* https://docs.oracle.com/en/database/oracle/oracle-database/18/sqlrf/Types-of-SQL-Statements.html#GUID-FD9A8CB4-6B9A-44E5-B114-EFB8DA76FC88
|
|
|
|
|
|
|
|
*/
|
|
|
|
ASTDDLEvent DDLEvent(): {}
|
|
|
|
ASTDDLEvent DDLEvent(): {}
|
|
|
|
{
|
|
|
|
{
|
|
|
|
( <ALTER>
|
|
|
|
( <ALTER>
|
|
|
|
| <ANALYZE>
|
|
|
|
| <ANALYZE>
|
|
|
|
| <ASSOCIATE> <STATISTICS>
|
|
|
|
| <ASSOCIATE> <STATISTICS>
|
|
|
|
| <AUDIT>
|
|
|
|
| <AUDIT>
|
|
|
|
| <COMMENT>
|
|
|
|
| LOOKAHEAD({isKeyword("COMMENT")}) KEYWORD("COMMENT")
|
|
|
|
| <CREATE>
|
|
|
|
| <CREATE>
|
|
|
|
| <DISASSOCIATE> <STATISTICS>
|
|
|
|
| <DISASSOCIATE> <STATISTICS>
|
|
|
|
| <DROP>
|
|
|
|
| <DROP>
|
|
|
|
|
|
|
|
// | <FLASHBACK>
|
|
|
|
| <GRANT>
|
|
|
|
| <GRANT>
|
|
|
|
| <NOAUDIT>
|
|
|
|
| <NOAUDIT>
|
|
|
|
|
|
|
|
// | <PURGE>
|
|
|
|
| <RENAME>
|
|
|
|
| <RENAME>
|
|
|
|
| <REVOKE>
|
|
|
|
| <REVOKE>
|
|
|
|
| <TRUNCATE>
|
|
|
|
| <TRUNCATE>
|
|
|
|
| <DDL>
|
|
|
|
|
|
|
|
)
|
|
|
|
)
|
|
|
|
{ jjtThis.setImage(token.toString()) ; jjtThis.value = token ; return jjtThis ; }
|
|
|
|
{ jjtThis.setImage(token.toString()) ; jjtThis.value = token ; return jjtThis ; }
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -4697,7 +4715,6 @@ TOKEN [IGNORE_CASE]:
|
|
|
|
<COALESCE: "COALESCE"> |
|
|
|
|
<COALESCE: "COALESCE"> |
|
|
|
|
<COLLECT: "COLLECT"> |
|
|
|
|
<COLLECT: "COLLECT"> |
|
|
|
|
<COLUMN: "COLUMN"> |
|
|
|
|
<COLUMN: "COLUMN"> |
|
|
|
|
<COMMENT: "COMMENT"> |
|
|
|
|
|
|
|
|
<COMMIT: "COMMIT"> |
|
|
|
|
<COMMIT: "COMMIT"> |
|
|
|
|
<CONSTANT: "CONSTANT"> |
|
|
|
|
<CONSTANT: "CONSTANT"> |
|
|
|
|
<CONSTRAINT: "CONSTRAINT"> |
|
|
|
|
<CONSTRAINT: "CONSTRAINT"> |
|
|
|
@ -4953,7 +4970,6 @@ TOKEN [IGNORE_CASE]:
|
|
|
|
| <COMPOUND: "COMPOUND"> //11G Trigger Syntax
|
|
|
|
| <COMPOUND: "COMPOUND"> //11G Trigger Syntax
|
|
|
|
| <DATABASE: "DATABASE"> //11G Trigger Syntax
|
|
|
|
| <DATABASE: "DATABASE"> //11G Trigger Syntax
|
|
|
|
| <CALL: "CALL"> //11G Trigger Syntax
|
|
|
|
| <CALL: "CALL"> //11G Trigger Syntax
|
|
|
|
| <DDL: "DDL"> //11G Trigger Syntax
|
|
|
|
|
|
|
|
| <DISASSOCIATE: "DISASSOCIATE"> //11G Trigger Syntax
|
|
|
|
| <DISASSOCIATE: "DISASSOCIATE"> //11G Trigger Syntax
|
|
|
|
| <EACH: "EACH"> //11G Trigger Syntax
|
|
|
|
| <EACH: "EACH"> //11G Trigger Syntax
|
|
|
|
| <FOLLOWS: "FOLLOWS"> //11G Trigger Syntax
|
|
|
|
| <FOLLOWS: "FOLLOWS"> //11G Trigger Syntax
|
|
|
@ -5082,8 +5098,6 @@ TOKEN :
|
|
|
|
< JAVA_INTERFACE_CLASS: ( "SQLData" | "CustomDatum" | "OraData" ) >
|
|
|
|
< JAVA_INTERFACE_CLASS: ( "SQLData" | "CustomDatum" | "OraData" ) >
|
|
|
|
//|
|
|
|
|
//|
|
|
|
|
//< #BOOLEAN_LITERAL: "TRUE" | "FALSE" >
|
|
|
|
//< #BOOLEAN_LITERAL: "TRUE" | "FALSE" >
|
|
|
|
|
|
|
|
|
|
|
|
|
<SQLPLUS_TERMINATOR: ( ";" | "/" ) >
|
|
|
|
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
/**
|
|
|
@ -5360,7 +5374,6 @@ ASTKEYWORD_UNRESERVED KEYWORD_UNRESERVED (): {}
|
|
|
|
//| <COLUMN_STATS>
|
|
|
|
//| <COLUMN_STATS>
|
|
|
|
//| <COLUMN_VALUE>
|
|
|
|
//| <COLUMN_VALUE>
|
|
|
|
//| <COLUMNS>
|
|
|
|
//| <COLUMNS>
|
|
|
|
| <COMMENT>
|
|
|
|
|
|
|
|
| <COMMIT>
|
|
|
|
| <COMMIT>
|
|
|
|
//| <COMMITTED>
|
|
|
|
//| <COMMITTED>
|
|
|
|
//| <COMPACT>
|
|
|
|
//| <COMPACT>
|
|
|
@ -5421,7 +5434,6 @@ ASTKEYWORD_UNRESERVED KEYWORD_UNRESERVED (): {}
|
|
|
|
//| <DBA_RECYCLEBIN>
|
|
|
|
//| <DBA_RECYCLEBIN>
|
|
|
|
//| <DBMS_STATS>
|
|
|
|
//| <DBMS_STATS>
|
|
|
|
| <DBTIMEZONE>
|
|
|
|
| <DBTIMEZONE>
|
|
|
|
| <DDL>
|
|
|
|
|
|
|
|
//| <DEALLOCATE>
|
|
|
|
//| <DEALLOCATE>
|
|
|
|
//| <DEBUG>
|
|
|
|
//| <DEBUG>
|
|
|
|
| <DEC>
|
|
|
|
| <DEC>
|
|
|
@ -6326,7 +6338,7 @@ ASTID ID(): {}
|
|
|
|
| KEYWORD_UNRESERVED() //SRT 2011-04-17
|
|
|
|
| KEYWORD_UNRESERVED() //SRT 2011-04-17
|
|
|
|
/*KEYWORDS_UNRESERVED
|
|
|
|
/*KEYWORDS_UNRESERVED
|
|
|
|
|<EXTRACT> | <FALSE> | <TRUE> | <SECOND> | <MINUTE> | <HOUR> | <DAY> | <MONTH> | <YEAR>
|
|
|
|
|<EXTRACT> | <FALSE> | <TRUE> | <SECOND> | <MINUTE> | <HOUR> | <DAY> | <MONTH> | <YEAR>
|
|
|
|
| <NO> |<ROW> | <COMMENT> | <CURSOR>
|
|
|
|
| <NO> |<ROW> | <CURSOR>
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
//20120501 | <DEFINER>
|
|
|
|
//20120501 | <DEFINER>
|
|
|
|
| <SERIALLY_REUSABLE> | <RESTRICT_REFERENCES>
|
|
|
|
| <SERIALLY_REUSABLE> | <RESTRICT_REFERENCES>
|
|
|
@ -6589,7 +6601,6 @@ ASTQualifiedID QualifiedID(): {}
|
|
|
|
//<CLUSTER>
|
|
|
|
//<CLUSTER>
|
|
|
|
//| <COALESCE>
|
|
|
|
//| <COALESCE>
|
|
|
|
//20120501 | <COLLECT>
|
|
|
|
//20120501 | <COLLECT>
|
|
|
|
//| <COMMENT>
|
|
|
|
|
|
|
|
//| <COMMIT>
|
|
|
|
//| <COMMIT>
|
|
|
|
//<COMPRESS>
|
|
|
|
//<COMPRESS>
|
|
|
|
//<CONNECT>
|
|
|
|
//<CONNECT>
|
|
|
|