mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
improved sql parser.
This commit is contained in:
@@ -395,9 +395,7 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.TRIGGER) {
|
||||
if (replace) {
|
||||
lexer.reset(markBp, markChar, Token.CREATE);
|
||||
}
|
||||
lexer.reset(markBp, markChar, Token.CREATE);
|
||||
return parseCreateTrigger();
|
||||
}
|
||||
// parse create procedure
|
||||
@@ -3011,18 +3009,24 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
item.addColumn(name);
|
||||
|
||||
while (lexer.token() == Token.COMMA) {
|
||||
lexer.mark();
|
||||
char markChar = lexer.current();
|
||||
int markBp = lexer.bp();
|
||||
|
||||
lexer.nextToken();
|
||||
if (identifierEquals("CHANGE")) {
|
||||
lexer.reset();
|
||||
lexer.reset(markBp, markChar, Token.COMMA);
|
||||
break;
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.IDENTIFIER) {
|
||||
if ("ADD".equalsIgnoreCase(lexer.stringVal())) {
|
||||
lexer.reset(markBp, markChar, Token.COMMA);
|
||||
break;
|
||||
}
|
||||
name = exprParser.name();
|
||||
name.setParent(item);
|
||||
} else {
|
||||
lexer.reset();
|
||||
lexer.reset(markBp, markChar, Token.COMMA);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -3561,6 +3565,7 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
accept(Token.END);
|
||||
accept(Token.IF);
|
||||
accept(Token.SEMI);
|
||||
stmt.setAfterSemi(true);
|
||||
|
||||
return stmt;
|
||||
}
|
||||
@@ -3770,6 +3775,7 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
accept(Token.END);
|
||||
accept(Token.LOOP);
|
||||
accept(Token.SEMI);
|
||||
loopStmt.setAfterSemi(true);
|
||||
return loopStmt;
|
||||
}
|
||||
|
||||
@@ -3787,6 +3793,7 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
acceptIdentifier(label);
|
||||
}
|
||||
accept(Token.SEMI);
|
||||
loopStmt.setAfterSemi(true);
|
||||
return loopStmt;
|
||||
}
|
||||
|
||||
|
||||
@@ -15,14 +15,7 @@
|
||||
*/
|
||||
package com.alibaba.druid.sql.dialect.mysql.visitor;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLCommentHint;
|
||||
import com.alibaba.druid.sql.ast.SQLDataType;
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLObject;
|
||||
import com.alibaba.druid.sql.ast.SQLOrderBy;
|
||||
import com.alibaba.druid.sql.ast.SQLParameter;
|
||||
import com.alibaba.druid.sql.ast.SQLSetQuantifier;
|
||||
import com.alibaba.druid.sql.ast.SQLStatement;
|
||||
import com.alibaba.druid.sql.ast.*;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
|
||||
@@ -380,12 +373,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
|
||||
}
|
||||
|
||||
public boolean visit(SQLDataType x) {
|
||||
print0(x.getName());
|
||||
if (!x.getArguments().isEmpty()) {
|
||||
print('(');
|
||||
printAndAccept(x.getArguments(), ", ");
|
||||
print(')');
|
||||
}
|
||||
printDataType(x);
|
||||
|
||||
if (Boolean.TRUE == x.getAttribute("UNSIGNED")) {
|
||||
print0(ucase ? " UNSIGNED" : " unsigned");
|
||||
@@ -3284,6 +3272,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
|
||||
@Override
|
||||
public boolean visit(SQLIfStatement.Else x) {
|
||||
print0(ucase ? "ELSE " : "else ");
|
||||
incrementIndent();
|
||||
println();
|
||||
for (int i = 0, size = x.getStatements().size(); i < size; ++i) {
|
||||
SQLStatement item = x.getStatements().get(i);
|
||||
@@ -3293,6 +3282,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
|
||||
println();
|
||||
}
|
||||
}
|
||||
decrementIndent();
|
||||
println();
|
||||
return false;
|
||||
}
|
||||
@@ -3617,4 +3607,24 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
|
||||
public void endVisit(MySqlDeclareConditionStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLAlterTableDropColumnItem x) {
|
||||
|
||||
for (int i = 0; i < x.getColumns().size(); ++i) {
|
||||
if (i != 0) {
|
||||
print0(", ");
|
||||
}
|
||||
|
||||
SQLName columnn = x.getColumns().get(i);
|
||||
|
||||
print0(ucase ? "DROP COLUMN " : "drop column ");
|
||||
columnn.accept(this);
|
||||
|
||||
if (x.isCascade()) {
|
||||
print0(ucase ? " CASCADE" : " cascade");
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
} //
|
||||
|
||||
+4
-8
@@ -19,10 +19,10 @@ import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OracleConntinueStatement extends OracleStatementImpl {
|
||||
public class OracleContinueStatement extends OracleStatementImpl {
|
||||
|
||||
private SQLExpr when;
|
||||
private SQLName label;
|
||||
private String label;
|
||||
|
||||
public SQLExpr getWhen() {
|
||||
return when;
|
||||
@@ -35,21 +35,17 @@ public class OracleConntinueStatement extends OracleStatementImpl {
|
||||
this.when = when;
|
||||
}
|
||||
|
||||
public SQLName getLabel() {
|
||||
public String getLabel() {
|
||||
return label;
|
||||
}
|
||||
|
||||
public void setLabel(SQLName label) {
|
||||
if (label != null) {
|
||||
label.setParent(this);
|
||||
}
|
||||
public void setLabel(String label) {
|
||||
this.label = label;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept0(OracleASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, label);
|
||||
acceptChild(visitor, when);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
+55
@@ -0,0 +1,55 @@
|
||||
/*
|
||||
* Copyright 1999-2017 Alibaba Group Holding Ltd.
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OracleExecuteImmediateStatement extends OracleStatementImpl {
|
||||
|
||||
private SQLCharExpr dynamicSql;
|
||||
|
||||
public OracleExecuteImmediateStatement(){
|
||||
}
|
||||
|
||||
public OracleExecuteImmediateStatement(String dynamicSql){
|
||||
this.setDynamicSql(dynamicSql);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept0(OracleASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
// acceptChild(visitor, label);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public SQLCharExpr getDynamicSql() {
|
||||
return dynamicSql;
|
||||
}
|
||||
|
||||
public void setDynamicSql(SQLCharExpr dynamicSql) {
|
||||
if (dynamicSql != null) {
|
||||
dynamicSql.setParent(this);
|
||||
}
|
||||
this.dynamicSql = dynamicSql;
|
||||
}
|
||||
|
||||
public void setDynamicSql(String dynamicSql) {
|
||||
this.setDynamicSql(new SQLCharExpr(dynamicSql));
|
||||
}
|
||||
}
|
||||
@@ -19,6 +19,7 @@ import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OracleExitStatement extends OracleStatementImpl {
|
||||
private String label;
|
||||
|
||||
private SQLExpr when;
|
||||
|
||||
@@ -41,4 +42,11 @@ public class OracleExitStatement extends OracleStatementImpl {
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public String getLabel() {
|
||||
return label;
|
||||
}
|
||||
|
||||
public void setLabel(String label) {
|
||||
this.label = label;
|
||||
}
|
||||
}
|
||||
|
||||
+12
-3
@@ -17,11 +17,12 @@ package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OracleLockTableStatement extends OracleStatementImpl {
|
||||
|
||||
private SQLName table;
|
||||
private SQLExprTableSource table;
|
||||
private LockMode lockMode;
|
||||
private boolean noWait = false;
|
||||
private SQLExpr wait;
|
||||
@@ -42,14 +43,22 @@ public class OracleLockTableStatement extends OracleStatementImpl {
|
||||
this.wait = wait;
|
||||
}
|
||||
|
||||
public SQLName getTable() {
|
||||
public SQLExprTableSource getTable() {
|
||||
return table;
|
||||
}
|
||||
|
||||
public void setTable(SQLName table) {
|
||||
public void setTable(SQLExprTableSource table) {
|
||||
if (table != null) {
|
||||
table.setParent(this);
|
||||
}
|
||||
this.table = table;
|
||||
}
|
||||
|
||||
public void setTable(SQLName table) {
|
||||
this.setTable(new SQLExprTableSource(table));
|
||||
this.table.setParent(this);
|
||||
}
|
||||
|
||||
public LockMode getLockMode() {
|
||||
return lockMode;
|
||||
}
|
||||
|
||||
+102
-11
@@ -217,11 +217,7 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
|
||||
if (identifierEquals("EXIT")) {
|
||||
lexer.nextToken();
|
||||
OracleExitStatement stmt = new OracleExitStatement();
|
||||
if (lexer.token() == Token.WHEN) {
|
||||
lexer.nextToken();
|
||||
stmt.setWhen(this.exprParser.expr());
|
||||
}
|
||||
OracleExitStatement stmt = parseExit();
|
||||
stmt.setParent(parent);
|
||||
statementList.add(stmt);
|
||||
continue;
|
||||
@@ -229,10 +225,11 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
|
||||
if (lexer.token() == Token.CONTINUE) {
|
||||
lexer.nextToken();
|
||||
OracleConntinueStatement stmt = new OracleConntinueStatement();
|
||||
OracleContinueStatement stmt = new OracleContinueStatement();
|
||||
|
||||
if (lexer.token() == Token.IDENTIFIER) {
|
||||
SQLName label = this.exprParser.name();
|
||||
String label = lexer.stringVal();
|
||||
lexer.nextToken();
|
||||
stmt.setLabel(label);
|
||||
}
|
||||
if (lexer.token() == Token.WHEN) {
|
||||
@@ -268,17 +265,52 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
if (lexer.token() == Token.IDENTIFIER) {
|
||||
String strVal = lexer.stringVal();
|
||||
if (strVal.equalsIgnoreCase("RAISE")) {
|
||||
statementList.add(this.parseRaise());
|
||||
SQLStatement stmt = this.parseRaise();
|
||||
stmt.setParent(parent);
|
||||
statementList.add(stmt);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (strVal.equalsIgnoreCase("FORALL")) {
|
||||
SQLStatement forAll = this.parseFor();
|
||||
statementList.add(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;
|
||||
}
|
||||
|
||||
SQLExpr expr = exprParser.expr();
|
||||
|
||||
if (expr instanceof SQLBinaryOpExpr) {
|
||||
SQLBinaryOpExpr binaryOpExpr = (SQLBinaryOpExpr) expr;
|
||||
if (binaryOpExpr.getOperator() == SQLBinaryOperator.Assignment) {
|
||||
SQLSetStatement stmt = new SQLSetStatement();
|
||||
stmt.setDbType(JdbcConstants.ORACLE);
|
||||
stmt.setParent(parent);
|
||||
|
||||
SQLAssignItem assignItem = new SQLAssignItem(binaryOpExpr.getLeft(), binaryOpExpr.getRight());
|
||||
assignItem.setParent(stmt);
|
||||
stmt.getItems().add(assignItem);
|
||||
|
||||
statementList.add(stmt);
|
||||
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
OracleExprStatement stmt = new OracleExprStatement(expr);
|
||||
stmt.setParent(parent);
|
||||
statementList.add(stmt);
|
||||
@@ -584,6 +616,53 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
}
|
||||
}
|
||||
|
||||
public SQLStatement parseExecute() {
|
||||
acceptIdentifier("EXECUTE");
|
||||
|
||||
if (lexer.token() == Token.IMMEDIATE) {
|
||||
lexer.nextToken();
|
||||
|
||||
OracleExecuteImmediateStatement stmt = new OracleExecuteImmediateStatement();
|
||||
String dyanmiacSql = lexer.stringVal();
|
||||
accept(Token.LITERAL_CHARS);
|
||||
stmt.setDynamicSql(dyanmiacSql);
|
||||
return stmt;
|
||||
}
|
||||
throw new ParserException("TODO : " + lexer.info());
|
||||
}
|
||||
|
||||
public SQLStatement parseRename() {
|
||||
lexer.nextToken();
|
||||
SQLName from = this.exprParser.name();
|
||||
accept(Token.TO);
|
||||
SQLName to = this.exprParser.name();
|
||||
|
||||
SQLAlterTableStatement stmt = new SQLAlterTableStatement();
|
||||
stmt.setTableSource(from);
|
||||
SQLAlterTableRename toItem = new SQLAlterTableRename(to);
|
||||
stmt.addItem(toItem);
|
||||
|
||||
return stmt;
|
||||
}
|
||||
|
||||
private OracleExitStatement parseExit() {
|
||||
OracleExitStatement stmt = new OracleExitStatement();
|
||||
|
||||
if (lexer.token() == Token.IDENTIFIER) {
|
||||
String label = lexer.stringVal();
|
||||
stmt.setLabel(label);
|
||||
lexer.nextToken();
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.WHEN) {
|
||||
lexer.nextToken();
|
||||
stmt.setWhen(this.exprParser.expr());
|
||||
}
|
||||
accept(Token.SEMI);
|
||||
stmt.setAfterSemi(true);
|
||||
return stmt;
|
||||
}
|
||||
|
||||
public SQLStatement parseReturn() {
|
||||
accept(Token.RETURN);
|
||||
SQLReturnStatement stmt = new SQLReturnStatement();
|
||||
@@ -790,6 +869,7 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
// lexer.nextToken();
|
||||
// }
|
||||
accept(Token.SEMI);
|
||||
stmt.setAfterSemi(true);
|
||||
|
||||
return stmt;
|
||||
}
|
||||
@@ -838,6 +918,15 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
this.parseStatementList(stmt.getStatements(), -1, stmt);
|
||||
accept(Token.END);
|
||||
accept(Token.LOOP);
|
||||
|
||||
if (lexer.token() == Token.IDENTIFIER) {
|
||||
String label = lexer.stringVal();
|
||||
stmt.setLabelName(label);
|
||||
lexer.nextToken();
|
||||
}
|
||||
|
||||
accept(Token.SEMI);
|
||||
stmt.setAfterSemi(true);
|
||||
return stmt;
|
||||
}
|
||||
|
||||
@@ -2034,8 +2123,10 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
|
||||
varDecl.getItems().add(varItem);
|
||||
|
||||
stmt.getStatements().add(varDecl);
|
||||
accept(Token.SEMI);
|
||||
varDecl.setAfterSemi(true);
|
||||
|
||||
stmt.getStatements().add(varDecl);
|
||||
} else if (lexer.token() == Token.FUNCTION) {
|
||||
SQLStatement function = this.parseFunction();
|
||||
function.setParent(stmt);
|
||||
|
||||
@@ -389,9 +389,9 @@ public interface OracleASTVisitor extends SQLASTVisitor {
|
||||
|
||||
void endVisit(OracleExitStatement x);
|
||||
|
||||
boolean visit(OracleConntinueStatement x);
|
||||
boolean visit(OracleContinueStatement x);
|
||||
|
||||
void endVisit(OracleConntinueStatement x);
|
||||
void endVisit(OracleContinueStatement x);
|
||||
|
||||
boolean visit(OracleRaiseStatement x);
|
||||
|
||||
@@ -460,4 +460,8 @@ public interface OracleASTVisitor extends SQLASTVisitor {
|
||||
boolean visit(OracleCreatePackageStatement x);
|
||||
|
||||
void endVisit(OracleCreatePackageStatement x);
|
||||
|
||||
boolean visit(OracleExecuteImmediateStatement x);
|
||||
|
||||
void endVisit(OracleExecuteImmediateStatement x);
|
||||
}
|
||||
|
||||
+12
-2
@@ -938,12 +938,12 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleConntinueStatement x) {
|
||||
public boolean visit(OracleContinueStatement x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleConntinueStatement x) {
|
||||
public void endVisit(OracleContinueStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@@ -1109,4 +1109,14 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora
|
||||
public void endVisit(OracleCreatePackageStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleExecuteImmediateStatement x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleExecuteImmediateStatement x) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+52
-8
@@ -28,7 +28,6 @@ import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource.JoinType;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeTimestamp;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.OracleSegmentAttributes;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.CycleClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfFlashbackQueryClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.AsOfSnapshotClause;
|
||||
@@ -1469,7 +1468,12 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
if (x.getStatements().size() > 1) {
|
||||
println();
|
||||
} else {
|
||||
print(' ');
|
||||
if (x.getStatements().size() == 1
|
||||
&& x.getStatements().get(0) instanceof SQLIfStatement) {
|
||||
println();
|
||||
} else {
|
||||
print(' ');
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0, size = x.getStatements().size(); i < size; ++i) {
|
||||
@@ -1594,6 +1598,19 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLAlterTableStatement x) {
|
||||
if (x.getItems().size() == 1) {
|
||||
SQLAlterTableItem item = x.getItems().get(0);
|
||||
if (item instanceof SQLAlterTableRename) {
|
||||
SQLExpr to = ((SQLAlterTableRename) item).getTo().getExpr();
|
||||
|
||||
print0(ucase ? "RENAME " : "rename ");
|
||||
x.getName().accept(this);
|
||||
print0(ucase ? " TO " : "to ");
|
||||
to.accept(this);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
print0(ucase ? "ALTER TABLE " : "alter table ");
|
||||
printTableSourceExpr(x.getName());
|
||||
incrementIndent();
|
||||
@@ -1958,7 +1975,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
x.getElseItem().accept(this);
|
||||
}
|
||||
println();
|
||||
print0(ucase ? "END IF;" : "end if;");
|
||||
print0(ucase ? "END IF" : "end if");
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -2043,7 +2060,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleCreateTableStatement x) {
|
||||
this.visit((SQLCreateTableStatement) x);
|
||||
printCreateTable(x);
|
||||
|
||||
if (x.getOf() != null) {
|
||||
println();
|
||||
@@ -2431,6 +2448,12 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
@Override
|
||||
public boolean visit(OracleExitStatement x) {
|
||||
print0(ucase ? "EXIT" : "exit");
|
||||
|
||||
if (x.getLabel() != null) {
|
||||
print(' ');
|
||||
print0(x.getLabel());
|
||||
}
|
||||
|
||||
if (x.getWhen() != null) {
|
||||
print0(ucase ? " WHEN " : " when ");
|
||||
x.getWhen().accept(this);
|
||||
@@ -2445,13 +2468,13 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleConntinueStatement x) {
|
||||
public boolean visit(OracleContinueStatement x) {
|
||||
print0(ucase ? "CONTINUE" : "continue");
|
||||
|
||||
SQLName label = x.getLabel();
|
||||
String label = x.getLabel();
|
||||
if (label != null) {
|
||||
print(' ');
|
||||
label.accept(this);
|
||||
print0(label);
|
||||
}
|
||||
|
||||
if (x.getWhen() != null) {
|
||||
@@ -2462,7 +2485,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleConntinueStatement x) {
|
||||
public void endVisit(OracleContinueStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@@ -3189,4 +3212,25 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
public void endVisit(OracleCreatePackageStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLAssignItem x) {
|
||||
x.getTarget().accept(this);
|
||||
print0(" := ");
|
||||
x.getValue().accept(this);
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleExecuteImmediateStatement x) {
|
||||
print0(ucase ? "EXECUTE IMMEDIATE " : "execute immediate ");
|
||||
x.getDynamicSql().accept(this);
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleExecuteImmediateStatement x) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+21
-2
@@ -19,9 +19,11 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import com.alibaba.druid.sql.SQLUtils;
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.ast.SQLObject;
|
||||
import com.alibaba.druid.sql.ast.SQLStatement;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
|
||||
@@ -84,6 +86,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot.Item;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.CheckOption;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectRestriction.ReadOnly;
|
||||
import com.alibaba.druid.sql.parser.SQLParserUtils;
|
||||
import com.alibaba.druid.sql.visitor.SchemaStatVisitor;
|
||||
import com.alibaba.druid.stat.TableStat;
|
||||
import com.alibaba.druid.stat.TableStat.Column;
|
||||
@@ -1271,12 +1274,12 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleConntinueStatement x) {
|
||||
public boolean visit(OracleContinueStatement x) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleConntinueStatement x) {
|
||||
public void endVisit(OracleContinueStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@@ -1447,4 +1450,20 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
public void endVisit(OracleCreatePackageStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleExecuteImmediateStatement x) {
|
||||
String sql = x.getDynamicSql().getText();
|
||||
|
||||
List<SQLStatement> stmtList = SQLUtils.parseStatements(sql, getDbType());
|
||||
for (SQLStatement stmt : stmtList) {
|
||||
stmt.accept(this);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleExecuteImmediateStatement x) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user