in core/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java [69:757]
public void parseStatementList(List<SQLStatement> statementList, int max, SQLObject parent) {
for (; ; ) {
if (max != -1) {
if (statementList.size() >= max) {
return;
}
}
if (lexer.token() == Token.EOF) {
return;
}
if (lexer.token() == Token.END) {
return;
}
if (lexer.token() == Token.ELSE) {
return;
}
if (lexer.token() == (Token.SEMI)) {
lexer.nextToken();
if (!statementList.isEmpty()) {
SQLStatement lastStmt = statementList.get(statementList.size() - 1);
lastStmt.setAfterSemi(true);
}
continue;
}
if (lexer.token() == (Token.SELECT)) {
SQLStatement stmt = new SQLSelectStatement(new OracleSelectParser(this.exprParser).select(), DbType.oracle);
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == (Token.UPDATE)) {
SQLStatement stmt = parseUpdateStatement();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == (Token.CREATE)) {
SQLStatement stmt = parseCreate();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.INSERT) {
SQLStatement stmt = parseInsert();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == (Token.DELETE)) {
SQLStatement stmt = parseDeleteStatement();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == (Token.GET)) {
SQLStatement stmt = parseGetDiagnosticsStatement();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == (Token.SLASH)) {
lexer.nextToken();
SQLStatement stmt = new SQLScriptCommitStatement();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.ALTER) {
SQLStatement stmt = parserAlter();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.WITH) {
SQLSelectStatement stmt = new SQLSelectStatement(this.createSQLSelectParser().select(), dbType);
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.LBRACE || lexer.identifierEquals("CALL")) {
SQLStatement stmt = parseCall();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.MERGE) {
SQLStatement stmt = parseMerge();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.BEGIN
|| lexer.token() == Token.DECLARE) {
SQLStatement stmt = parseBlock();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.LOCK) {
SQLStatement stmt = parseLock();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.TRUNCATE) {
SQLStatement stmt = parseTruncate();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.VARIANT) {
SQLExpr variant = this.exprParser.primary();
if (variant instanceof SQLBinaryOpExpr) {
SQLBinaryOpExpr binaryOpExpr = (SQLBinaryOpExpr) variant;
if (binaryOpExpr.getOperator() == SQLBinaryOperator.Assignment) {
SQLSetStatement stmt = new SQLSetStatement(binaryOpExpr.getLeft(), binaryOpExpr.getRight(), getDbType());
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
}
accept(Token.COLONEQ);
SQLExpr value = this.exprParser.expr();
SQLSetStatement stmt = new SQLSetStatement(variant, value, getDbType());
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.EXCEPTION) {
SQLExceptionStatement stmt = this.parseException();
stmt.setParent(parent);
if (parent instanceof SQLBlockStatement) {
((SQLBlockStatement) parent).setException(stmt);
} else {
statementList.add(stmt);
}
continue;
}
if (lexer.identifierEquals("EXIT")) {
lexer.nextToken();
OracleExitStatement stmt = parseExit();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.identifierEquals("REFRESH")) {
SQLStatement stmt = parseRefresh();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.CONTINUE) {
lexer.nextToken();
OracleContinueStatement stmt = new OracleContinueStatement();
if (lexer.token() == Token.IDENTIFIER) {
String label = lexer.stringVal();
lexer.nextToken();
stmt.setLabel(label);
}
if (lexer.token() == Token.WHEN) {
lexer.nextToken();
stmt.setWhen(this.exprParser.expr());
}
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.FETCH || lexer.identifierEquals("FETCH")) {
SQLStatement stmt = parseFetch();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.identifierEquals("ROLLBACK")) {
SQLStatement stmt = parseRollback();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.EXPLAIN) {
OracleExplainStatement stmt = this.parseExplain();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.IDENTIFIER) {
String strVal = lexer.stringVal();
if (strVal.equalsIgnoreCase("RAISE")) {
SQLStatement stmt = this.parseRaise();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (strVal.equalsIgnoreCase("FORALL")) {
SQLStatement stmt = this.parseFor();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (strVal.equalsIgnoreCase("RENAME")) {
SQLStatement stmt = this.parseRename();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (strVal.equalsIgnoreCase("EXECUTE")) {
SQLStatement stmt = this.parseExecute();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (strVal.equalsIgnoreCase("ANALYZE")) {
acceptIdentifier("ANALYZE");
if (lexer.token() == TABLE) {
SQLAnalyzeTableStatement stmt = this.parseAnalyzeTable();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
}
if (strVal.equalsIgnoreCase("PIPE")) {
Lexer.SavePoint savePoint = lexer.mark();
lexer.nextToken();
if (lexer.token() == Token.ROW) {
lexer.reset(savePoint);
SQLStatement stmt = this.parsePipeRow();
stmt.setParent(parent);
statementList.add(stmt);
} else {
lexer.reset(savePoint);
}
continue;
}
if (strVal.equalsIgnoreCase("SHOW")) {
// Lexer.SavePoint savePoint = lexer.mark();
lexer.nextToken();
if (lexer.identifierEquals("ERR")) {
lexer.nextToken();
} else {
accept(Token.ERRORS);
}
SQLShowErrorsStatement stmt = new SQLShowErrorsStatement();
stmt.setDbType(dbType);
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
SQLExpr expr = exprParser.expr();
if (expr instanceof SQLBinaryOpExpr) {
SQLBinaryOpExpr binaryOpExpr = (SQLBinaryOpExpr) expr;
if (binaryOpExpr.getOperator() == SQLBinaryOperator.Assignment) {
SQLSetStatement stmt = new SQLSetStatement();
stmt.setDbType(DbType.oracle);
stmt.setParent(parent);
SQLAssignItem assignItem = new SQLAssignItem(binaryOpExpr.getLeft(), binaryOpExpr.getRight());
assignItem.setParent(stmt);
stmt.getItems().add(assignItem);
statementList.add(stmt);
continue;
}
}
SQLExprStatement stmt = new SQLExprStatement(expr);
stmt.setDbType(dbType);
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.LPAREN) {
Lexer.SavePoint savePoint = lexer.mark();
lexer.nextToken();
int parenCount = 0;
while (lexer.token() == Token.LPAREN) {
savePoint = lexer.mark();
lexer.nextToken();
parenCount++;
}
if (lexer.token() == Token.SELECT) {
lexer.reset(savePoint);
SQLStatement stmt = parseSelect();
stmt.setParent(parent);
statementList.add(stmt);
for (int i = 0; i < parenCount; ++i) {
accept(Token.RPAREN);
}
continue;
} else {
throw new ParserException("TODO : " + lexer.info());
}
}
if (lexer.token() == Token.SET) {
SQLStatement stmt = parseSet();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.GRANT) {
statementList.add(this.parseGrant());
continue;
}
if (lexer.token() == Token.REVOKE) {
statementList.add(this.parseRevoke());
continue;
}
if (lexer.token() == Token.COMMENT) {
statementList.add(this.parseComment());
continue;
}
if (lexer.token() == Token.FOR) {
OracleForStatement forStatement = this.parseFor();
forStatement.setParent(parent);
if (lexer.token() == Token.IDENTIFIER) {
String strVal = lexer.stringVal();
int stmtListSize = statementList.size();
if (stmtListSize > 0) {
SQLStatement lastStmt = statementList.get(stmtListSize - 1);
if (lastStmt instanceof OracleLabelStatement) {
if (((OracleLabelStatement) lastStmt).getLabel().getSimpleName().equalsIgnoreCase(strVal)) {
SQLName endLabbel = this.exprParser.name();
forStatement.setEndLabel(endLabbel);
}
}
}
}
statementList.add(forStatement);
continue;
}
if (lexer.token() == Token.LOOP) {
SQLStatement stmt = parseLoop();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.IF) {
SQLStatement stmt = parseIf();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.GOTO) {
lexer.nextToken();
SQLName label = this.exprParser.name();
OracleGotoStatement stmt = new OracleGotoStatement(label);
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.COMMIT) {
lexer.nextToken();
if (lexer.identifierEquals("WORK")) {
lexer.nextToken();
}
SQLCommitStatement stmt = new SQLCommitStatement();
stmt.setParent(parent);
if (lexer.identifierEquals("WRITE")) {
stmt.setWrite(true);
lexer.nextToken();
for (; ; ) {
if (lexer.token() == Token.WAIT) {
lexer.nextToken();
stmt.setWait(Boolean.TRUE);
continue;
} else if (lexer.token() == Token.NOWAIT) {
lexer.nextToken();
stmt.setWait(Boolean.FALSE);
continue;
} else if (lexer.token() == Token.IMMEDIATE) {
lexer.nextToken();
stmt.setImmediate(Boolean.TRUE);
continue;
} else if (lexer.identifierEquals("BATCH")) {
lexer.nextToken();
stmt.setImmediate(Boolean.FALSE);
continue;
}
break;
}
}
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.SAVEPOINT) {
lexer.nextToken();
SQLSavePointStatement stmt = new SQLSavePointStatement();
stmt.setDbType(dbType);
stmt.setParent(parent);
if (lexer.token() == Token.TO) {
lexer.nextToken();
stmt.setName(this.exprParser.name());
} else if (lexer.token() != Token.SEMI) {
stmt.setName(this.exprParser.name());
}
accept(Token.SEMI);
stmt.setAfterSemi(true);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.LTLT) {
lexer.nextToken();
SQLName label = this.exprParser.name();
OracleLabelStatement stmt = new OracleLabelStatement(label);
accept(Token.GTGT);
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.DROP) {
Lexer.SavePoint savePoint = lexer.mark();
lexer.nextToken();
if (lexer.token() == Token.TABLE) {
SQLDropTableStatement stmt = parseDropTable(false);
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
boolean isPublic = false;
if (lexer.identifierEquals("PUBLIC")) {
lexer.nextToken();
isPublic = true;
}
if (lexer.token() == Token.DATABASE) {
lexer.nextToken();
if (lexer.identifierEquals("LINK")) {
lexer.nextToken();
OracleDropDbLinkStatement stmt = new OracleDropDbLinkStatement();
if (isPublic) {
stmt.setPublic(isPublic);
}
stmt.setName(this.exprParser.name());
statementList.add(stmt);
continue;
}
}
if (lexer.token() == Token.INDEX) {
SQLStatement stmt = parseDropIndex();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.VIEW) {
SQLStatement stmt = parseDropView(false);
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.SEQUENCE) {
SQLDropSequenceStatement stmt = parseDropSequence(false);
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.TRIGGER) {
SQLDropTriggerStatement stmt = parseDropTrigger(false);
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.USER) {
SQLDropUserStatement stmt = parseDropUser();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.PROCEDURE) {
SQLDropProcedureStatement stmt = parseDropProcedure(false);
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.FUNCTION) {
SQLDropFunctionStatement stmt = parseDropFunction(false);
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.identifierEquals(FnvHash.Constants.SYNONYM)) {
lexer.reset(savePoint);
SQLStatement stmt = parseDropSynonym();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.identifierEquals(FnvHash.Constants.TYPE)) {
lexer.reset(savePoint);
SQLStatement stmt = parseDropType();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.identifierEquals(FnvHash.Constants.PACKAGE)) {
lexer.reset(savePoint);
SQLStatement stmt = parseDropPackage();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.identifierEquals(FnvHash.Constants.MATERIALIZED)) {
lexer.reset(savePoint);
SQLStatement stmt = parseDropMaterializedView();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
throw new ParserException("TODO : " + lexer.info());
}
if (lexer.token() == Token.NULL) {
lexer.nextToken();
SQLExprStatement stmt = new SQLExprStatement(new SQLNullExpr());
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.OPEN) {
SQLStatement stmt = this.parseOpen();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.CLOSE) {
SQLStatement stmt = this.parseClose();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.CASE) {
SQLStatement stmt = this.parseCase();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.PROCEDURE) {
SQLStatement stmt = this.parseCreateProcedure();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.ELSIF
&& (parent instanceof SQLIfStatement || parent instanceof SQLIfStatement.ElseIf)) {
break;
}
if (lexer.token() == Token.WHEN
&& parent instanceof SQLExceptionStatement.Item) {
break;
}
if (lexer.token() == Token.FUNCTION) {
SQLStatement stmt = this.parseFunction();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.WHILE) {
SQLStatement stmt = this.parseWhile();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.RETURN) {
SQLStatement stmt = this.parseReturn();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.TRIGGER) {
SQLStatement stmt = this.parseCreateTrigger();
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.MONKEYS_AT_AT) {
lexer.nextToken();
SQLExpr expr = exprParser.primary();
OracleRunStatement stmt = new OracleRunStatement(expr);
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.QUES) {
SQLExpr expr = this.exprParser.expr();
SQLExprStatement stmt = new SQLExprStatement(expr);
stmt.setParent(parent);
statementList.add(stmt);
continue;
}
throw new ParserException("TODO : " + lexer.info());
}
}