mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
bug fixed for sql parser
This commit is contained in:
@@ -41,6 +41,7 @@ public class OracleParameter extends OracleSQLObjectImpl {
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, name);
|
||||
acceptChild(visitor, dataType);
|
||||
acceptChild(visitor, defaultValue);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
+29
-1
@@ -6,12 +6,40 @@ public class OracleCommitStatement extends OracleStatementImpl {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private boolean write;
|
||||
private Boolean wait;
|
||||
private Boolean immediate;
|
||||
|
||||
@Override
|
||||
public void accept0(OracleASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
|
||||
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public boolean isWrite() {
|
||||
return write;
|
||||
}
|
||||
|
||||
public void setWrite(boolean write) {
|
||||
this.write = write;
|
||||
}
|
||||
|
||||
public Boolean getWait() {
|
||||
return wait;
|
||||
}
|
||||
|
||||
public void setWait(Boolean wait) {
|
||||
this.wait = wait;
|
||||
}
|
||||
|
||||
public Boolean getImmediate() {
|
||||
return immediate;
|
||||
}
|
||||
|
||||
public void setImmediate(Boolean immediate) {
|
||||
this.immediate = immediate;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+61
@@ -0,0 +1,61 @@
|
||||
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleParameter;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OracleCreateProcedureStatement extends OracleStatementImpl {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private boolean orReplace;
|
||||
private SQLName name;
|
||||
private OracleBlockStatement block;
|
||||
private List<OracleParameter> parameters = new ArrayList<OracleParameter>();
|
||||
|
||||
@Override
|
||||
public void accept0(OracleASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, name);
|
||||
acceptChild(visitor, parameters);
|
||||
acceptChild(visitor, block);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public List<OracleParameter> getParameters() {
|
||||
return parameters;
|
||||
}
|
||||
|
||||
public void setParameters(List<OracleParameter> parameters) {
|
||||
this.parameters = parameters;
|
||||
}
|
||||
|
||||
public SQLName getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(SQLName name) {
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public OracleBlockStatement getBlock() {
|
||||
return block;
|
||||
}
|
||||
|
||||
public void setBlock(OracleBlockStatement block) {
|
||||
this.block = block;
|
||||
}
|
||||
|
||||
public boolean isOrReplace() {
|
||||
return orReplace;
|
||||
}
|
||||
|
||||
public void setOrReplace(boolean orReplace) {
|
||||
this.orReplace = orReplace;
|
||||
}
|
||||
|
||||
}
|
||||
+8
-8
@@ -23,9 +23,9 @@ public class OracleExceptionStatement extends OracleSQLObjectImpl implements Ora
|
||||
|
||||
public static class Item extends OracleSQLObjectImpl {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private SQLExpr when;
|
||||
private SQLStatement statement;
|
||||
private static final long serialVersionUID = 1L;
|
||||
private SQLExpr when;
|
||||
private List<SQLStatement> statements = new ArrayList<SQLStatement>();
|
||||
|
||||
public SQLExpr getWhen() {
|
||||
return when;
|
||||
@@ -35,19 +35,19 @@ public class OracleExceptionStatement extends OracleSQLObjectImpl implements Ora
|
||||
this.when = when;
|
||||
}
|
||||
|
||||
public SQLStatement getStatement() {
|
||||
return statement;
|
||||
public List<SQLStatement> getStatements() {
|
||||
return statements;
|
||||
}
|
||||
|
||||
public void setStatement(SQLStatement statement) {
|
||||
this.statement = statement;
|
||||
public void setStatements(List<SQLStatement> statements) {
|
||||
this.statements = statements;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept0(OracleASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, when);
|
||||
acceptChild(visitor, statement);
|
||||
acceptChild(visitor, statements);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
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 OracleFetchStatement extends OracleStatementImpl {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private SQLName cursorName;
|
||||
|
||||
private List<SQLExpr> into = new ArrayList<SQLExpr>();
|
||||
|
||||
@Override
|
||||
public void accept0(OracleASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, cursorName);
|
||||
acceptChild(visitor, into);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public SQLName getCursorName() {
|
||||
return cursorName;
|
||||
}
|
||||
|
||||
public void setCursorName(SQLName cursorName) {
|
||||
this.cursorName = cursorName;
|
||||
}
|
||||
|
||||
public List<SQLExpr> getInto() {
|
||||
return into;
|
||||
}
|
||||
|
||||
public void setInto(List<SQLExpr> into) {
|
||||
this.into = into;
|
||||
}
|
||||
|
||||
}
|
||||
+2
-3
@@ -15,10 +15,9 @@
|
||||
*/
|
||||
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLStatementImpl;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OraclePLSQLCommitStatement extends SQLStatementImpl {
|
||||
public class OraclePLSQLCommitStatement extends OracleStatementImpl {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
@@ -26,7 +25,7 @@ public class OraclePLSQLCommitStatement extends SQLStatementImpl {
|
||||
|
||||
}
|
||||
|
||||
protected void accept0(OracleASTVisitor visitor) {
|
||||
public void accept0(OracleASTVisitor visitor) {
|
||||
visitor.visit(this);
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OracleRollbackStatement extends OracleStatementImpl {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private SQLName to;
|
||||
|
||||
@Override
|
||||
public void accept0(OracleASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, to);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public SQLName getTo() {
|
||||
return to;
|
||||
}
|
||||
|
||||
public void setTo(SQLName to) {
|
||||
this.to = to;
|
||||
}
|
||||
|
||||
}
|
||||
+28
@@ -0,0 +1,28 @@
|
||||
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor;
|
||||
|
||||
public class OracleSavePointStatement extends OracleStatementImpl {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
private SQLName to;
|
||||
|
||||
@Override
|
||||
public void accept0(OracleASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, to);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public SQLName getTo() {
|
||||
return to;
|
||||
}
|
||||
|
||||
public void setTo(SQLName to) {
|
||||
this.to = to;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -18,6 +18,8 @@ package com.alibaba.druid.sql.dialect.oracle.parser;
|
||||
import java.math.BigInteger;
|
||||
import java.util.List;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLDataType;
|
||||
import com.alibaba.druid.sql.ast.SQLDataTypeImpl;
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.ast.SQLOrderingSpecification;
|
||||
@@ -65,24 +67,21 @@ import com.alibaba.druid.sql.parser.SQLExprParser;
|
||||
import com.alibaba.druid.sql.parser.Token;
|
||||
|
||||
public class OracleExprParser extends SQLExprParser {
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public boolean allowStringAdditive = false;
|
||||
|
||||
/**
|
||||
* @formatter:off
|
||||
*/
|
||||
private static final String[] _aggregateFunctions = { "AVG", "CORR", "COVAR_POP", "COVAR_SAMP", "COUNT", "CUME_DIST", "DENSE_RANK", "FIRST", "FIRST_VALUE", "LAG", "LAST", "LAST_VALUE", "LEAD", "MAX", "MIN", "NTILE", "PERCENT_RANK", "PERCENTILE_CONT", "PERCENTILE_DISC", "RANK", "RATIO_TO_REPORT", "REGR_SLOPE", "REGR_INTERCEPT", "REGR_COUNT", "REGR_R2", "REGR_AVGX",
|
||||
"REGR_AVGY", "REGR_SXX", "REGR_SYY", "REGR_SXY", "ROW_NUMBER", "STDDEV", "STDDEV_POP", "STDDEV_SAMP", "SUM", "VAR_POP", "VAR_SAMP", "VARIANCE" };
|
||||
private static final String[] _aggregateFunctions = { //
|
||||
"AVG", "CORR", "COVAR_POP", "COVAR_SAMP", "COUNT", //
|
||||
"CUME_DIST", "DENSE_RANK", "FIRST", "FIRST_VALUE", //
|
||||
"LAG", "LAST", "LAST_VALUE", "LEAD", "MAX", "MIN", //
|
||||
"NTILE", "PERCENT_RANK", "PERCENTILE_CONT", "PERCENTILE_DISC", "RANK", //
|
||||
"RATIO_TO_REPORT", "REGR_SLOPE", "REGR_INTERCEPT", "REGR_COUNT", "REGR_R2", //
|
||||
"REGR_AVGX", "REGR_AVGY", "REGR_SXX", "REGR_SYY", "REGR_SXY", //
|
||||
"ROW_NUMBER", "STDDEV", "STDDEV_POP", "STDDEV_SAMP", "SUM", //
|
||||
"VAR_POP", "VAR_SAMP", "VARIANCE" //
|
||||
};
|
||||
|
||||
public OracleExprParser(Lexer lexer){
|
||||
super(lexer);
|
||||
@@ -92,6 +91,33 @@ public class OracleExprParser extends SQLExprParser {
|
||||
super(new OracleLexer(text));
|
||||
this.lexer.nextToken();
|
||||
}
|
||||
|
||||
public SQLDataType parseDataType() throws ParserException {
|
||||
|
||||
if (lexer.token() == Token.DEFAULT || lexer.token() == Token.NOT || lexer.token() == Token.NULL) {
|
||||
return null;
|
||||
}
|
||||
|
||||
SQLName typeExpr = name();
|
||||
String typeName = typeExpr.toString();
|
||||
|
||||
if (lexer.token() == Token.PERCENT) {
|
||||
lexer.nextToken();
|
||||
if (identifierEquals("TYPE")) {
|
||||
lexer.nextToken();
|
||||
typeName += "%TYPE";
|
||||
} else if (identifierEquals("ROWTYPE")) {
|
||||
lexer.nextToken();
|
||||
typeName += "%ROWTYPE";
|
||||
} else {
|
||||
throw new ParserException("syntax error : " + lexer.token() + " " + lexer.stringVal());
|
||||
}
|
||||
}
|
||||
|
||||
SQLDataType dataType = new SQLDataTypeImpl(typeName);
|
||||
parseDataTypeRest(dataType);
|
||||
return dataType;
|
||||
}
|
||||
|
||||
public boolean isAggreateFunction(String word) {
|
||||
for (int i = 0; i < _aggregateFunctions.length; ++i) {
|
||||
|
||||
@@ -139,6 +139,8 @@ public class OracleLexer extends Lexer {
|
||||
map.put("ELSE", Token.ELSE);
|
||||
map.put("GOTO", Token.GOTO);
|
||||
map.put("COMMIT", Token.COMMIT);
|
||||
map.put("ROLLBACK", Token.ROLLBACK);
|
||||
map.put("SAVEPOINT", Token.SAVEPOINT);
|
||||
|
||||
DEFAULT_ORACLE_KEYWORDS = new Keywords(map);
|
||||
}
|
||||
@@ -217,7 +219,6 @@ public class OracleLexer extends Lexer {
|
||||
np = bp;
|
||||
sp = 0;
|
||||
scanChar();
|
||||
sp++;
|
||||
|
||||
// /*+ */
|
||||
if (ch == '*') {
|
||||
@@ -277,7 +278,7 @@ public class OracleLexer extends Lexer {
|
||||
break;
|
||||
}
|
||||
|
||||
if (ch == '\r') {
|
||||
if (ch == '\n') {
|
||||
scanChar();
|
||||
sp++;
|
||||
break;
|
||||
|
||||
+188
-36
@@ -18,14 +18,18 @@ package com.alibaba.druid.sql.dialect.oracle.parser;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLDataTypeImpl;
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.ast.SQLStatement;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLNullExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLConstaint;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLDropTableStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLInsertInto;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelect;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem;
|
||||
@@ -61,12 +65,14 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterViewStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateProcedureStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateSequenceStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFetchStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement;
|
||||
@@ -80,6 +86,8 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleLoopStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMergeStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleRollbackStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSavePointStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSetTransactionStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleTruncateStatement;
|
||||
@@ -240,7 +248,7 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
statementList.add(this.parseException());
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (identifierEquals("EXIT")) {
|
||||
lexer.nextToken();
|
||||
OracleExitStatement stmt = new OracleExitStatement();
|
||||
@@ -252,6 +260,24 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (identifierEquals("FETCH")) {
|
||||
lexer.nextToken();
|
||||
OracleFetchStatement stmt = new OracleFetchStatement();
|
||||
stmt.setCursorName(this.exprParser.name());
|
||||
accept(Token.INTO);
|
||||
for (;;) {
|
||||
stmt.getInto().add(this.exprParser.name());
|
||||
if (lexer.token() == Token.COMMA) {
|
||||
lexer.nextToken();
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
statementList.add(stmt);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.IDENTIFIER) {
|
||||
if (identifierEquals("EXPLAIN")) {
|
||||
statementList.add(this.parseExplain());
|
||||
@@ -319,6 +345,62 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
lexer.nextToken();
|
||||
}
|
||||
OracleCommitStatement stmt = new OracleCommitStatement();
|
||||
|
||||
if (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 (identifierEquals("IMMEDIATE")) {
|
||||
lexer.nextToken();
|
||||
stmt.setImmediate(Boolean.TRUE);
|
||||
continue;
|
||||
} else if (identifierEquals("BATCH")) {
|
||||
lexer.nextToken();
|
||||
stmt.setImmediate(Boolean.FALSE);
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
statementList.add(stmt);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.ROLLBACK) {
|
||||
lexer.nextToken();
|
||||
|
||||
OracleRollbackStatement stmt = new OracleRollbackStatement();
|
||||
|
||||
if (lexer.token() == Token.TO) {
|
||||
lexer.nextToken();
|
||||
stmt.setTo(this.exprParser.name());
|
||||
}
|
||||
|
||||
statementList.add(stmt);
|
||||
continue;
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.SAVEPOINT) {
|
||||
lexer.nextToken();
|
||||
|
||||
OracleSavePointStatement stmt = new OracleSavePointStatement();
|
||||
|
||||
if (lexer.token() == Token.TO) {
|
||||
lexer.nextToken();
|
||||
stmt.setTo(this.exprParser.name());
|
||||
}
|
||||
|
||||
statementList.add(stmt);
|
||||
continue;
|
||||
}
|
||||
@@ -331,7 +413,26 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
statementList.add(stmt);
|
||||
continue;
|
||||
}
|
||||
|
||||
|
||||
if (lexer.token() == Token.DROP) {
|
||||
lexer.nextToken();
|
||||
|
||||
if (lexer.token() == Token.TABLE) {
|
||||
SQLDropTableStatement stmt = parseDropTable(false);
|
||||
statementList.add(stmt);
|
||||
continue;
|
||||
}
|
||||
|
||||
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
|
||||
}
|
||||
|
||||
if (lexer.token() == Token.NULL) {
|
||||
lexer.nextToken();
|
||||
OracleExprStatement stmt = new OracleExprStatement(new SQLNullExpr());
|
||||
statementList.add(stmt);
|
||||
continue;
|
||||
}
|
||||
|
||||
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
|
||||
}
|
||||
}
|
||||
@@ -390,12 +491,12 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
accept(Token.LOOP);
|
||||
return stmt;
|
||||
}
|
||||
|
||||
|
||||
public OracleLoopStatement parseLoop() {
|
||||
accept(Token.LOOP);
|
||||
|
||||
|
||||
OracleLoopStatement stmt = new OracleLoopStatement();
|
||||
|
||||
|
||||
this.parseStatementList(stmt.getStatements());
|
||||
accept(Token.END);
|
||||
accept(Token.LOOP);
|
||||
@@ -457,17 +558,17 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
public SQLStatement parseSet() {
|
||||
accept(Token.SET);
|
||||
acceptIdentifier("TRANSACTION");
|
||||
|
||||
|
||||
OracleSetTransactionStatement stmt = new OracleSetTransactionStatement();
|
||||
|
||||
|
||||
if (identifierEquals("READ")) {
|
||||
lexer.nextToken();
|
||||
acceptIdentifier("ONLY");
|
||||
stmt.setReadOnly(true);
|
||||
}
|
||||
|
||||
|
||||
acceptIdentifier("NAME");
|
||||
|
||||
|
||||
stmt.setName(this.exprParser.expr());
|
||||
return stmt;
|
||||
}
|
||||
@@ -479,10 +580,10 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
|
||||
SQLName name = this.exprParser.name();
|
||||
stmt.getTableNames().add(name);
|
||||
|
||||
|
||||
if (identifierEquals("PURGE")) {
|
||||
lexer.nextToken();
|
||||
|
||||
|
||||
if (identifierEquals("SNAPSHOT")) {
|
||||
lexer.nextToken();
|
||||
accept(Token.LOG);
|
||||
@@ -952,30 +1053,15 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
return stmt;
|
||||
}
|
||||
|
||||
public OracleStatement parseBlock() {
|
||||
public OracleBlockStatement parseBlock() {
|
||||
OracleBlockStatement block = new OracleBlockStatement();
|
||||
|
||||
if (lexer.token() == Token.DECLARE) {
|
||||
lexer.nextToken();
|
||||
|
||||
for (;;) {
|
||||
OracleParameter parameter = new OracleParameter();
|
||||
parameter.setName(this.exprParser.name());
|
||||
parameter.setDataType(this.exprParser.parseDataType());
|
||||
|
||||
block.getParameters().add(parameter);
|
||||
|
||||
if (lexer.token() == Token.COLONEQ) {
|
||||
lexer.nextToken();
|
||||
parameter.setDefaultValue(this.exprParser.expr());
|
||||
}
|
||||
parameter.setParent(block);
|
||||
accept(Token.SEMI);
|
||||
if (lexer.token() != Token.BEGIN) {
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
parserParameters(block.getParameters());
|
||||
for (OracleParameter param : block.getParameters()) {
|
||||
param.setParent(block);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -988,6 +1074,46 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
return block;
|
||||
}
|
||||
|
||||
private void parserParameters(List<OracleParameter> parameters) {
|
||||
for (;;) {
|
||||
OracleParameter parameter = new OracleParameter();
|
||||
|
||||
if (lexer.token() == Token.CURSOR) {
|
||||
lexer.nextToken();
|
||||
|
||||
parameter.setName(this.exprParser.name());
|
||||
|
||||
accept(Token.IS);
|
||||
SQLSelect select = this.createSQLSelectParser().select();
|
||||
|
||||
SQLDataTypeImpl dataType = new SQLDataTypeImpl();
|
||||
dataType.setName("CURSOR");
|
||||
parameter.setDataType(dataType);
|
||||
|
||||
parameter.setDefaultValue(new SQLQueryExpr(select));
|
||||
} else {
|
||||
parameter.setName(this.exprParser.name());
|
||||
parameter.setDataType(this.exprParser.parseDataType());
|
||||
|
||||
if (lexer.token() == Token.COLONEQ) {
|
||||
lexer.nextToken();
|
||||
parameter.setDefaultValue(this.exprParser.expr());
|
||||
}
|
||||
}
|
||||
|
||||
parameters.add(parameter);
|
||||
if (lexer.token() == Token.COMMA || lexer.token() == Token.SEMI) {
|
||||
lexer.nextToken();
|
||||
}
|
||||
|
||||
if (lexer.token() != Token.BEGIN && lexer.token() != Token.RPAREN) {
|
||||
continue;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public OracleSelectParser createSQLSelectParser() {
|
||||
return new OracleSelectParser(this.lexer);
|
||||
}
|
||||
@@ -1187,9 +1313,7 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
OracleExceptionStatement.Item item = new OracleExceptionStatement.Item();
|
||||
item.setWhen(this.exprParser.expr());
|
||||
accept(Token.THEN);
|
||||
List<SQLStatement> statements = new ArrayList<SQLStatement>();
|
||||
parseStatementList(statements, 1);
|
||||
item.setStatement(statements.get(0));
|
||||
parseStatementList(item.getStatements());
|
||||
|
||||
stmt.getItems().add(item);
|
||||
|
||||
@@ -1404,12 +1528,12 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
if (acceptCreate) {
|
||||
accept(Token.CREATE);
|
||||
}
|
||||
|
||||
|
||||
acceptIdentifier("SEQUENCE");
|
||||
|
||||
OracleCreateSequenceStatement stmt = new OracleCreateSequenceStatement();
|
||||
stmt.setName(this.exprParser.name());
|
||||
|
||||
|
||||
for (;;) {
|
||||
if (lexer.token() == Token.START) {
|
||||
lexer.nextToken();
|
||||
@@ -1437,10 +1561,38 @@ public class OracleStatementParser extends SQLStatementParser {
|
||||
lexer.nextToken();
|
||||
stmt.setCycle(Boolean.FALSE);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return stmt;
|
||||
}
|
||||
|
||||
public OracleCreateProcedureStatement parseCreateProcedure() {
|
||||
OracleCreateProcedureStatement stmt = new OracleCreateProcedureStatement();
|
||||
accept(Token.CREATE);
|
||||
if (lexer.token() == Token.OR) {
|
||||
lexer.nextToken();
|
||||
acceptIdentifier("REPLACE");
|
||||
stmt.setOrReplace(true);
|
||||
}
|
||||
|
||||
accept(Token.PROCEDURE);
|
||||
|
||||
stmt.setName(this.exprParser.name());
|
||||
|
||||
if (lexer.token() == Token.LPAREN) {
|
||||
lexer.nextToken();
|
||||
parserParameters(stmt.getParameters());
|
||||
accept(Token.RPAREN);
|
||||
}
|
||||
|
||||
accept(Token.AS);
|
||||
|
||||
OracleBlockStatement block = this.parseBlock();
|
||||
|
||||
stmt.setBlock(block);
|
||||
|
||||
return stmt;
|
||||
}
|
||||
}
|
||||
|
||||
+67
-22
@@ -67,6 +67,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateProcedureStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateSequenceStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement;
|
||||
@@ -74,6 +75,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFetchStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement;
|
||||
@@ -95,6 +97,8 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleOrderByItem;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleRollbackStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSavePointStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectForUpdate;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectHierachicalQueryClause;
|
||||
@@ -1257,55 +1261,55 @@ public class OracleASTVIsitorAdapter extends SQLASTVisitorAdapter implements Ora
|
||||
public void endVisit(OracleAlterTableMoveTablespace x) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleSizeExpr x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleSizeExpr x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleFileSpecification x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleFileSpecification x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterTablespaceAddDataFile x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterTablespaceAddDataFile x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleAlterTablespaceStatement x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleAlterTablespaceStatement x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleTruncateStatement x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleTruncateStatement x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1315,17 +1319,17 @@ public class OracleASTVIsitorAdapter extends SQLASTVisitorAdapter implements Ora
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleCreateSequenceStatement x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleRangeValuesClause x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleRangeValuesClause x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1335,16 +1339,17 @@ public class OracleASTVIsitorAdapter extends SQLASTVisitorAdapter implements Ora
|
||||
|
||||
@Override
|
||||
public void endVisit(OraclePartitionByRangeClause x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleLoopStatement x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleLoopStatement x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1354,6 +1359,46 @@ public class OracleASTVIsitorAdapter extends SQLASTVisitorAdapter implements Ora
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleExitStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleFetchStatement x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleFetchStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleRollbackStatement x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleRollbackStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleSavePointStatement x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleSavePointStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleCreateProcedureStatement x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleCreateProcedureStatement x) {
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -73,6 +73,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateProcedureStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateSequenceStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement;
|
||||
@@ -80,6 +81,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFetchStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement;
|
||||
@@ -99,6 +101,8 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleOrderByItem;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleRollbackStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSavePointStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectForUpdate;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectHierachicalQueryClause;
|
||||
@@ -600,4 +604,20 @@ public interface OracleASTVisitor extends SQLASTVisitor {
|
||||
boolean visit(OracleExitStatement x);
|
||||
|
||||
void endVisit(OracleExitStatement x);
|
||||
|
||||
boolean visit(OracleFetchStatement x);
|
||||
|
||||
void endVisit(OracleFetchStatement x);
|
||||
|
||||
boolean visit(OracleRollbackStatement x);
|
||||
|
||||
void endVisit(OracleRollbackStatement x);
|
||||
|
||||
boolean visit(OracleSavePointStatement x);
|
||||
|
||||
void endVisit(OracleSavePointStatement x);
|
||||
|
||||
boolean visit(OracleCreateProcedureStatement x);
|
||||
|
||||
void endVisit(OracleCreateProcedureStatement x);
|
||||
}
|
||||
|
||||
+150
-12
@@ -28,6 +28,7 @@ import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLObjectCreateExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
|
||||
@@ -107,6 +108,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateProcedureStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateSequenceStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement;
|
||||
@@ -114,6 +116,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFetchStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement;
|
||||
@@ -135,6 +138,8 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleOrderByItem;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleRollbackStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSavePointStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectForUpdate;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectHierachicalQueryClause;
|
||||
@@ -169,6 +174,9 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
if (x instanceof OraclePLSQLCommitStatement) {
|
||||
return;
|
||||
}
|
||||
if (x.getParent() instanceof OracleCreateProcedureStatement) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (x.getParent() != null) {
|
||||
print(";");
|
||||
@@ -357,6 +365,7 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
|
||||
public boolean visit(OraclePLSQLCommitStatement astNode) {
|
||||
print("/");
|
||||
println();
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -446,13 +455,13 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
if (isRoot) {
|
||||
incrementIndent();
|
||||
}
|
||||
|
||||
|
||||
println();
|
||||
print(JoinType.toString(x.getJoinType()));
|
||||
print(" ");
|
||||
|
||||
x.getRight().accept(this);
|
||||
|
||||
|
||||
if (isRoot) {
|
||||
decrementIndent();
|
||||
}
|
||||
@@ -1749,12 +1758,17 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
incrementIndent();
|
||||
println();
|
||||
|
||||
for (OracleParameter param : x.getParameters()) {
|
||||
for (int i = 0, size = x.getParameters().size(); i < size; ++i) {
|
||||
if (i != 0) {
|
||||
println();
|
||||
}
|
||||
OracleParameter param = x.getParameters().get(i);
|
||||
param.accept(this);
|
||||
println();
|
||||
print(";");
|
||||
}
|
||||
|
||||
decrementIndent();
|
||||
println();
|
||||
}
|
||||
print("BEGIN");
|
||||
incrementIndent();
|
||||
@@ -1870,8 +1884,13 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
print("WHEN ");
|
||||
x.getWhen().accept(this);
|
||||
incrementIndent();
|
||||
println();
|
||||
x.getStatement().accept(this);
|
||||
|
||||
for (int i = 0, size = x.getStatements().size(); i < size; ++i) {
|
||||
println();
|
||||
SQLStatement stmt = x.getStatements().get(i);
|
||||
stmt.setParent(x);
|
||||
stmt.accept(this);
|
||||
}
|
||||
decrementIndent();
|
||||
return false;
|
||||
}
|
||||
@@ -2576,14 +2595,28 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleParameter x) {
|
||||
x.getName().accept(this);
|
||||
print(" ");
|
||||
x.getDataType().accept(this);
|
||||
if (x.getDataType().getName().equalsIgnoreCase("CURSOR")) {
|
||||
print("CURSOR ");
|
||||
x.getName().accept(this);
|
||||
print(" IS");
|
||||
incrementIndent();
|
||||
println();
|
||||
SQLSelect select = ((SQLQueryExpr) x.getDefaultValue()).getSubQuery();
|
||||
select.accept(this);
|
||||
decrementIndent();
|
||||
|
||||
if (x.getDefaultValue() != null) {
|
||||
print(" := ");
|
||||
x.getDefaultValue().accept(this);
|
||||
} else {
|
||||
x.getName().accept(this);
|
||||
print(" ");
|
||||
|
||||
x.getDataType().accept(this);
|
||||
|
||||
if (x.getDefaultValue() != null) {
|
||||
print(" := ");
|
||||
x.getDefaultValue().accept(this);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -2595,6 +2628,26 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
@Override
|
||||
public boolean visit(OracleCommitStatement x) {
|
||||
print("COMMIT");
|
||||
|
||||
if (x.isWrite()) {
|
||||
print(" WRITE");
|
||||
if (x.getWait() != null) {
|
||||
if (x.getWait().booleanValue()) {
|
||||
print(" WAIT");
|
||||
} else {
|
||||
print(" NOWAIT");
|
||||
}
|
||||
}
|
||||
|
||||
if (x.getImmediate() != null) {
|
||||
if (x.getImmediate().booleanValue()) {
|
||||
print(" IMMEDIATE");
|
||||
} else {
|
||||
print(" BATCH");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@@ -2919,4 +2972,89 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
|
||||
public void endVisit(OracleExitStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleFetchStatement x) {
|
||||
print("FETCH ");
|
||||
x.getCursorName().accept(this);
|
||||
print(" INTO ");
|
||||
printAndAccept(x.getInto(), ", ");
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleFetchStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleRollbackStatement x) {
|
||||
print("ROLLBACK");
|
||||
if (x.getTo() != null) {
|
||||
print(" TO ");
|
||||
x.getTo().accept(this);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleRollbackStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleSavePointStatement x) {
|
||||
print("ROLLBACK");
|
||||
if (x.getTo() != null) {
|
||||
print(" TO ");
|
||||
x.getTo().accept(this);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleSavePointStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleCreateProcedureStatement x) {
|
||||
if (x.isOrReplace()) {
|
||||
print("CREATE OR REPLACE PROCEDURE ");
|
||||
} else {
|
||||
print("CREATE PROCEDURE ");
|
||||
}
|
||||
x.getName().accept(this);
|
||||
|
||||
int paramSize = x.getParameters().size();
|
||||
|
||||
if (paramSize > 0) {
|
||||
print(" (");
|
||||
incrementIndent();
|
||||
println();
|
||||
|
||||
for (int i = 0; i < paramSize; ++i) {
|
||||
if (i != 0) {
|
||||
print(", ");
|
||||
println();
|
||||
}
|
||||
OracleParameter param = x.getParameters().get(i);
|
||||
param.accept(this);
|
||||
}
|
||||
|
||||
decrementIndent();
|
||||
println();
|
||||
print(")");
|
||||
}
|
||||
|
||||
println();
|
||||
x.getBlock().setParent(x);
|
||||
x.getBlock().accept(this);
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleCreateProcedureStatement x) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+58
-9
@@ -41,10 +41,10 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleParameter;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OraclePartitionByRangeClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleRangeValuesClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.SearchClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.SubqueryFactoringClause;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.clause.SubqueryFactoringClause.Entry;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleAggregateExpr;
|
||||
@@ -86,6 +86,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleBlockStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCommitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraintState;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateIndexStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateProcedureStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateSequenceStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleDeleteStatement;
|
||||
@@ -93,6 +94,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExceptionStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExplainStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFetchStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement;
|
||||
@@ -114,6 +116,8 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleMultiInsertStatement.
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleOrderByItem;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePLSQLCommitStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleRollbackStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSavePointStatement;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectForUpdate;
|
||||
import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectHierachicalQueryClause;
|
||||
@@ -143,7 +147,8 @@ import com.alibaba.druid.stat.TableStat.Relationship;
|
||||
public class OracleSchemaStatVisitor extends SchemaStatVisitor implements OracleASTVisitor {
|
||||
|
||||
public OracleSchemaStatVisitor(){
|
||||
this.aliasMap.put("DUAL", null);
|
||||
this.variants.put("DUAL", null);
|
||||
this.variants.put("NOTFOUND", null);
|
||||
}
|
||||
|
||||
protected Column getColumn(SQLExpr expr) {
|
||||
@@ -317,15 +322,16 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
x.getWhere().setParent(x);
|
||||
}
|
||||
|
||||
visit((SQLSelectQueryBlock) x);
|
||||
|
||||
if (x.getInto() instanceof SQLName) {
|
||||
TableStat stat = getTableStat(x.getInto().toString());
|
||||
String tableName = x.getInto().toString();
|
||||
TableStat stat = getTableStat(tableName);
|
||||
if (stat != null) {
|
||||
stat.incrementInsertCount();
|
||||
}
|
||||
}
|
||||
|
||||
visit((SQLSelectQueryBlock) x);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1610,7 +1616,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleParameter x) {
|
||||
return false;
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1755,7 +1761,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
|
||||
@Override
|
||||
public void endVisit(OraclePartitionByRangeClause x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1765,7 +1771,7 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleLoopStatement x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -1775,6 +1781,49 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleExitStatement x) {
|
||||
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleFetchStatement x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleFetchStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleRollbackStatement x) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleRollbackStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleSavePointStatement x) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleSavePointStatement x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(OracleCreateProcedureStatement x) {
|
||||
String name = x.getName().toString();
|
||||
this.variants.put(name, x);
|
||||
accept(x.getBlock());
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(OracleCreateProcedureStatement x) {
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,35 +0,0 @@
|
||||
package com.alibaba.druid.sql.dialect.postgresql.ast;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitor;
|
||||
|
||||
public class PGCurrentOfExpr extends PGSQLObjectImpl implements SQLExpr {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
private SQLExpr cursor;
|
||||
|
||||
public PGCurrentOfExpr() {
|
||||
|
||||
}
|
||||
|
||||
public PGCurrentOfExpr(SQLExpr cursor) {
|
||||
this.cursor = cursor;
|
||||
}
|
||||
|
||||
public SQLExpr getCursor() {
|
||||
return cursor;
|
||||
}
|
||||
|
||||
public void setCursor(SQLExpr cursor) {
|
||||
this.cursor = cursor;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept0(PGASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, cursor);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
}
|
||||
+2
-2
@@ -5,12 +5,12 @@ import java.util.List;
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.ast.SQLStatement;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLCurrentOfCursorExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
|
||||
import com.alibaba.druid.sql.dialect.postgresql.ast.PGCurrentOfExpr;
|
||||
import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithClause;
|
||||
import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithQuery;
|
||||
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGDeleteStatement;
|
||||
@@ -169,7 +169,7 @@ public class PGSQLStatementParser extends SQLStatementParser {
|
||||
lexer.nextToken();
|
||||
accept(Token.OF);
|
||||
SQLName cursorName = this.exprParser.name();
|
||||
SQLExpr where = new PGCurrentOfExpr(cursorName);
|
||||
SQLExpr where = new SQLCurrentOfCursorExpr(cursorName);
|
||||
deleteStatement.setWhere(where);
|
||||
} else {
|
||||
SQLExpr where = this.exprParser.expr();
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package com.alibaba.druid.sql.dialect.postgresql.visitor;
|
||||
|
||||
import com.alibaba.druid.sql.dialect.postgresql.ast.PGCurrentOfExpr;
|
||||
import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithClause;
|
||||
import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithQuery;
|
||||
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGDeleteStatement;
|
||||
@@ -45,10 +44,6 @@ public interface PGASTVisitor extends SQLASTVisitor {
|
||||
|
||||
boolean visit(PGDeleteStatement x);
|
||||
|
||||
void endVisit(PGCurrentOfExpr x);
|
||||
|
||||
boolean visit(PGCurrentOfExpr x);
|
||||
|
||||
void endVisit(PGInsertStatement x);
|
||||
|
||||
boolean visit(PGInsertStatement x);
|
||||
|
||||
-11
@@ -1,6 +1,5 @@
|
||||
package com.alibaba.druid.sql.dialect.postgresql.visitor;
|
||||
|
||||
import com.alibaba.druid.sql.dialect.postgresql.ast.PGCurrentOfExpr;
|
||||
import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithClause;
|
||||
import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithQuery;
|
||||
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGDeleteStatement;
|
||||
@@ -104,16 +103,6 @@ public class PGASTVisitorAdapter extends SQLASTVisitorAdapter implements PGASTVi
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(PGCurrentOfExpr x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(PGCurrentOfExpr x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(PGInsertStatement x) {
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@ package com.alibaba.druid.sql.dialect.postgresql.visitor;
|
||||
import com.alibaba.druid.sql.ast.SQLSetQuantifier;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
|
||||
import com.alibaba.druid.sql.dialect.postgresql.ast.PGCurrentOfExpr;
|
||||
import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithClause;
|
||||
import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithQuery;
|
||||
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGDeleteStatement;
|
||||
@@ -318,19 +317,6 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(PGCurrentOfExpr x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(PGCurrentOfExpr x) {
|
||||
print("CURRENT OF ");
|
||||
x.getCursor().accept(this);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(PGInsertStatement x) {
|
||||
|
||||
|
||||
+2
-13
@@ -6,7 +6,6 @@ import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLTruncateStatement;
|
||||
import com.alibaba.druid.sql.dialect.postgresql.ast.PGCurrentOfExpr;
|
||||
import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithClause;
|
||||
import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithQuery;
|
||||
import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGDeleteStatement;
|
||||
@@ -152,16 +151,6 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(PGCurrentOfExpr x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(PGCurrentOfExpr x) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(PGInsertStatement x) {
|
||||
|
||||
@@ -225,7 +214,7 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
|
||||
@Override
|
||||
public boolean visit(PGUpdateStatement x) {
|
||||
Map<String, String> oldAliasMap = getAliasMap();
|
||||
|
||||
|
||||
setAliasMap();
|
||||
|
||||
if (x.getWith() != null) {
|
||||
@@ -243,7 +232,7 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit
|
||||
|
||||
accept(x.getItems());
|
||||
accept(x.getWhere());
|
||||
|
||||
|
||||
setAliasMap(oldAliasMap);
|
||||
|
||||
return false;
|
||||
|
||||
Reference in New Issue
Block a user