refactor sql parser, support open/close statement

This commit is contained in:
高铁
2015-09-19 13:20:14 +08:00
parent 03c5436d8c
commit 12bef9bb54
23 changed files with 172 additions and 357 deletions
@@ -13,10 +13,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.druid.sql.dialect.mysql.ast.clause;
package com.alibaba.druid.sql.ast.statement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStatementImpl;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
import com.alibaba.druid.sql.ast.SQLStatementImpl;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
/**
*
* @Description: MySql cursor close statement
@@ -24,7 +24,7 @@ import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
* @date 2015-9-14
* @version V1.0
*/
public class MySqlCursorCloseStatement extends MySqlStatementImpl{
public class SQLCloseStatement extends SQLStatementImpl{
//cursor name
private String cursorName;
@@ -38,8 +38,7 @@ public class MySqlCursorCloseStatement extends MySqlStatementImpl{
}
@Override
public void accept0(MySqlASTVisitor visitor) {
// TODO Auto-generated method stub
protected void accept0(SQLASTVisitor visitor) {
visitor.visit(this);
visitor.endVisit(this);
@@ -13,23 +13,24 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.druid.sql.dialect.oracle.ast.stmt;
package com.alibaba.druid.sql.ast.statement;
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;
import com.alibaba.druid.sql.ast.SQLStatementImpl;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class OracleFetchStatement extends OracleStatementImpl {
public class SQLFetchStatement extends SQLStatementImpl {
private SQLName cursorName;
private List<SQLExpr> into = new ArrayList<SQLExpr>();
@Override
public void accept0(OracleASTVisitor visitor) {
protected void accept0(SQLASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, cursorName);
acceptChild(visitor, into);
@@ -13,10 +13,10 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.alibaba.druid.sql.dialect.mysql.ast.clause;
package com.alibaba.druid.sql.ast.statement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStatementImpl;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
import com.alibaba.druid.sql.ast.SQLStatementImpl;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
/**
*
* @Description: MySql cursor open statement
@@ -24,7 +24,7 @@ import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
* @date 2015-9-14
* @version V1.0
*/
public class MySqlCursorOpenStatement extends MySqlStatementImpl{
public class SQLOpenStatement extends SQLStatementImpl{
//cursor name
private String cursorName;
@@ -38,7 +38,7 @@ public class MySqlCursorOpenStatement extends MySqlStatementImpl{
}
@Override
public void accept0(MySqlASTVisitor visitor) {
protected void accept0(SQLASTVisitor visitor) {
// TODO Auto-generated method stub
visitor.visit(this);
visitor.endVisit(this);
@@ -1,63 +0,0 @@
/*
* Copyright 1999-2101 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.mysql.ast.clause;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStatementImpl;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
import com.alibaba.druid.sql.ast.SQLExpr;
/**
*
* @Description: MySql procedure cursor fetch into statement
* @author zz email:455910092@qq.com
* @date 2015-9-14
* @version V1.0
*/
public class MySqlCursorFetchIntoStatement extends MySqlStatementImpl{
//cursor name
private String cursorName;
//var list
private List<SQLExpr> varList=new ArrayList<SQLExpr>();
public String getCursorName() {
return cursorName;
}
public void setCursorName(String cursorName) {
this.cursorName = cursorName;
}
public List<SQLExpr> getVarList() {
return varList;
}
public void setVarList(List<SQLExpr> varList) {
this.varList = varList;
}
@Override
public void accept0(MySqlASTVisitor visitor) {
// TODO Auto-generated method stub
if (visitor.visit(this)) {
acceptChild(visitor, varList);
}
visitor.endVisit(this);
}
}
@@ -15,7 +15,6 @@
*/
package com.alibaba.druid.sql.dialect.mysql.ast.expr;
import com.alibaba.druid.sql.SQLUtils;
import com.alibaba.druid.sql.ast.expr.SQLCharExpr;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
@@ -64,17 +64,14 @@ import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement.MySqlWhenStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCreateProcedureStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCursorCloseStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCursorDeclareStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCursorFetchIntoStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCursorOpenStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlDeclareStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlElseStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlIfStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlIfStatement.MySqlElseIfStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlIterateStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlLeaveStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlLoopStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlIfStatement.MySqlElseIfStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlParameter;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlRepeatStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlSelectIntoStatement;
@@ -1185,7 +1182,7 @@ public class MySqlStatementParser extends SQLStatementParser {
return stmt;
}
if (identifierEquals("OPEN")) {
if (lexer.token() == Token.OPEN || identifierEquals("OPEN")) {
lexer.nextToken();
acceptIdentifier(TABLES);
MySqlShowOpenTablesStatement stmt = new MySqlShowOpenTablesStatement();
@@ -2998,19 +2995,19 @@ public class MySqlStatementParser extends SQLStatementParser {
// open cursor
if (lexer.token() == Token.OPEN) {
statementList.add(this.parseCursorOpen());
statementList.add(this.parseOpen());
continue;
}
// close cursor
if (lexer.token() == Token.CLOSE) {
statementList.add(this.parseCursorClose());
statementList.add(this.parseClose());
continue;
}
// fetch cursor into
if (lexer.token() == Token.FETCH) {
statementList.add(this.parseCursorFetchInto());
statementList.add(this.parseFetch());
continue;
}
@@ -3400,71 +3397,4 @@ public class MySqlStatementParser extends SQLStatementParser {
return stmt;
}
/**
* parse cursor open statement
* @return
*/
public MySqlCursorOpenStatement parseCursorOpen()
{
MySqlCursorOpenStatement stmt=new MySqlCursorOpenStatement();
accept(Token.OPEN);
stmt.setCursorName(exprParser.name().getSimpleName());
accept(Token.SEMI);
return stmt;
}
/**
* parse cursor close statement
* @return
*/
public MySqlCursorCloseStatement parseCursorClose()
{
MySqlCursorCloseStatement stmt=new MySqlCursorCloseStatement();
accept(Token.CLOSE);
stmt.setCursorName(exprParser.name().getSimpleName());
accept(Token.SEMI);
return stmt;
}
/**
* parse cursor fetch into statement
* @return
*/
public MySqlCursorFetchIntoStatement parseCursorFetchInto()
{
MySqlCursorFetchIntoStatement stmt=new MySqlCursorFetchIntoStatement();
accept(Token.FETCH);
stmt.setCursorName(exprParser.name().getSimpleName());
stmt.setVarList(parseIntoArgs());
return stmt;
}
/**
* parse fetch into var list
* @return
*/
protected List<SQLExpr> parseIntoArgs() {
List<SQLExpr> args=new ArrayList<SQLExpr>();
if (lexer.token() == (Token.INTO)) {
accept(Token.INTO);
//lexer.nextToken();
for (;;) {
SQLExpr var = exprParser.primary();
if (var instanceof SQLIdentifierExpr) {
var = new SQLVariantRefExpr(
((SQLIdentifierExpr) var).getName());
}
args.add(var);
if (lexer.token() == Token.COMMA) {
accept(Token.COMMA);
continue;
}
else
{
break;
}
}
}
return args;
}
}
@@ -25,10 +25,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement.MySqlWhenStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCreateProcedureStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCursorCloseStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCursorDeclareStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCursorFetchIntoStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCursorOpenStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlDeclareStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlElseStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlIfStatement;
@@ -653,16 +650,5 @@ public interface MySqlASTVisitor extends SQLASTVisitor {
boolean visit(MySqlCursorDeclareStatement x);
void endVisit(MySqlCursorDeclareStatement x);
boolean visit(MySqlCursorOpenStatement x);
void endVisit(MySqlCursorOpenStatement x);
boolean visit(MySqlCursorCloseStatement x);
void endVisit(MySqlCursorCloseStatement x);
boolean visit(MySqlCursorFetchIntoStatement x);
void endVisit(MySqlCursorFetchIntoStatement x);
} //
@@ -25,10 +25,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement.MySqlWhenStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCreateProcedureStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCursorCloseStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCursorDeclareStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCursorFetchIntoStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCursorOpenStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlDeclareStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlElseStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlIfStatement;
@@ -1470,40 +1467,4 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements MySq
}
@Override
public boolean visit(MySqlCursorOpenStatement x) {
// TODO Auto-generated method stub
return false;
}
@Override
public void endVisit(MySqlCursorOpenStatement x) {
// TODO Auto-generated method stub
}
@Override
public boolean visit(MySqlCursorCloseStatement x) {
// TODO Auto-generated method stub
return false;
}
@Override
public void endVisit(MySqlCursorCloseStatement x) {
// TODO Auto-generated method stub
}
@Override
public boolean visit(MySqlCursorFetchIntoStatement x) {
// TODO Auto-generated method stub
return false;
}
@Override
public void endVisit(MySqlCursorFetchIntoStatement x) {
// TODO Auto-generated method stub
}
} //
@@ -15,6 +15,9 @@
*/
package com.alibaba.druid.sql.dialect.mysql.visitor;
import java.util.List;
import java.util.Map;
import com.alibaba.druid.sql.ast.SQLCommentHint;
import com.alibaba.druid.sql.ast.SQLDataType;
import com.alibaba.druid.sql.ast.SQLExpr;
@@ -47,10 +50,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement.MySqlWhenStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCreateProcedureStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCursorCloseStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCursorDeclareStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCursorFetchIntoStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCursorOpenStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlDeclareStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlElseStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlIfStatement;
@@ -169,9 +169,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUnlockTablesStatem
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement;
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
import java.util.List;
import java.util.Map;
public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTVisitor {
public MySqlOutputVisitor(Appendable appender){
@@ -3574,49 +3571,4 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
}
@Override
public boolean visit(MySqlCursorOpenStatement x) {
print("OPEN ");
print(x.getCursorName());
return false;
}
@Override
public void endVisit(MySqlCursorOpenStatement x) {
// TODO Auto-generated method stub
}
@Override
public boolean visit(MySqlCursorCloseStatement x) {
print("CLOSE ");
print(x.getCursorName());
return false;
}
@Override
public void endVisit(MySqlCursorCloseStatement x) {
// TODO Auto-generated method stub
}
@Override
public boolean visit(MySqlCursorFetchIntoStatement x) {
print("FETCH ");
print(x.getCursorName());
print(" INTO ");
for (int i = 0; i < x.getVarList().size(); i++) {
x.getVarList().get(i).accept(this);
if(i!=x.getVarList().size()-1)
print(",");
}
return false;
}
@Override
public void endVisit(MySqlCursorFetchIntoStatement x) {
// TODO Auto-generated method stub
}
} //
@@ -40,10 +40,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCaseStatement.MySqlWhenStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCreateProcedureStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCursorCloseStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCursorDeclareStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCursorFetchIntoStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlCursorOpenStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlDeclareStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlElseStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlIfStatement;
@@ -1574,40 +1571,4 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
}
@Override
public boolean visit(MySqlCursorOpenStatement x) {
// TODO Auto-generated method stub
return false;
}
@Override
public void endVisit(MySqlCursorOpenStatement x) {
// TODO Auto-generated method stub
}
@Override
public boolean visit(MySqlCursorCloseStatement x) {
// TODO Auto-generated method stub
return false;
}
@Override
public void endVisit(MySqlCursorCloseStatement x) {
// TODO Auto-generated method stub
}
@Override
public boolean visit(MySqlCursorFetchIntoStatement x) {
// TODO Auto-generated method stub
return false;
}
@Override
public void endVisit(MySqlCursorFetchIntoStatement x) {
// TODO Auto-generated method stub
}
}
@@ -82,7 +82,6 @@ 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;
@@ -266,20 +265,8 @@ 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;
}
if (lexer.token() == Token.FETCH || identifierEquals("FETCH")) {
SQLStatement stmt = parseFetch();
statementList.add(stmt);
continue;
}
@@ -491,6 +478,12 @@ public class OracleStatementParser extends SQLStatementParser {
statementList.add(stmt);
continue;
}
if (lexer.token() == Token.OPEN) {
SQLStatement stmt = this.parseOpen();
statementList.add(stmt);
continue;
}
throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal());
}
@@ -81,7 +81,6 @@ 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.OracleForeignKey;
@@ -540,10 +539,6 @@ public interface OracleASTVisitor extends SQLASTVisitor {
void endVisit(OracleExitStatement x);
boolean visit(OracleFetchStatement x);
void endVisit(OracleFetchStatement x);
boolean visit(OracleSavePointStatement x);
void endVisit(OracleSavePointStatement x);
@@ -89,7 +89,6 @@ 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.OracleForeignKey;
@@ -1210,16 +1209,6 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora
}
@Override
public boolean visit(OracleFetchStatement x) {
return true;
}
@Override
public void endVisit(OracleFetchStatement x) {
}
@Override
public boolean visit(OracleSavePointStatement x) {
return true;
@@ -123,7 +123,6 @@ 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.OracleForeignKey;
@@ -2974,20 +2973,6 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS
}
@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 void endVisit(SQLRollbackStatement x) {
@@ -112,7 +112,6 @@ 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.OracleForeignKey;
@@ -1610,16 +1609,6 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle
}
@Override
public boolean visit(OracleFetchStatement x) {
return true;
}
@Override
public void endVisit(OracleFetchStatement x) {
}
@Override
public boolean visit(OracleSavePointStatement x) {
return false;
@@ -99,7 +99,7 @@ public class SQLServerSelectParser extends SQLSelectParser {
acceptIdentifier("ROWS");
select.setOffset(offset);
if (identifierEquals("FETCH")) {
if (lexer.token() == Token.FETCH) {
lexer.nextToken();
acceptIdentifier("NEXT");
@@ -328,6 +328,8 @@ public class SQLExprParser extends SQLParser {
case ORDER:
case CONSTRAINT:
case TYPE:
case OPEN:
case REPEAT:
sqlExpr = new SQLIdentifierExpr(lexer.stringVal());
lexer.nextToken();
break;
@@ -52,6 +52,7 @@ import com.alibaba.druid.sql.ast.statement.SQLAlterViewRenameStatement;
import com.alibaba.druid.sql.ast.statement.SQLAssignItem;
import com.alibaba.druid.sql.ast.statement.SQLCallStatement;
import com.alibaba.druid.sql.ast.statement.SQLCheck;
import com.alibaba.druid.sql.ast.statement.SQLCloseStatement;
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
import com.alibaba.druid.sql.ast.statement.SQLCommentStatement;
import com.alibaba.druid.sql.ast.statement.SQLConstraint;
@@ -75,10 +76,12 @@ import com.alibaba.druid.sql.ast.statement.SQLDropUserStatement;
import com.alibaba.druid.sql.ast.statement.SQLDropViewStatement;
import com.alibaba.druid.sql.ast.statement.SQLExplainStatement;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLFetchStatement;
import com.alibaba.druid.sql.ast.statement.SQLGrantStatement;
import com.alibaba.druid.sql.ast.statement.SQLInsertInto;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
import com.alibaba.druid.sql.ast.statement.SQLObjectType;
import com.alibaba.druid.sql.ast.statement.SQLOpenStatement;
import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey;
import com.alibaba.druid.sql.ast.statement.SQLReleaseSavePointStatement;
import com.alibaba.druid.sql.ast.statement.SQLRevokeStatement;
@@ -2006,6 +2009,45 @@ public class SQLStatementParser extends SQLParser {
accept(Token.RPAREN);
return item;
}
/**
* parse cursor open statement
* @return
*/
public SQLOpenStatement parseOpen() {
SQLOpenStatement stmt=new SQLOpenStatement();
accept(Token.OPEN);
stmt.setCursorName(exprParser.name().getSimpleName());
accept(Token.SEMI);
return stmt;
}
public SQLFetchStatement parseFetch() {
accept(Token.FETCH);
SQLFetchStatement stmt = new SQLFetchStatement();
stmt.setCursorName(this.exprParser.name());
accept(Token.INTO);
for (;;) {
stmt.getInto().add(this.exprParser.name());
if (lexer.token() == Token.COMMA) {
lexer.nextToken();
continue;
}
break;
}
return stmt;
}
public SQLStatement parseClose() {
SQLCloseStatement stmt=new SQLCloseStatement();
accept(Token.CLOSE);
stmt.setCursorName(exprParser.name().getSimpleName());
accept(Token.SEMI);
return stmt;
}
public boolean isParseCompleteValues() {
return parseCompleteValues;
@@ -98,6 +98,7 @@ import com.alibaba.druid.sql.ast.statement.SQLAssignItem;
import com.alibaba.druid.sql.ast.statement.SQLCallStatement;
import com.alibaba.druid.sql.ast.statement.SQLCharacterDataType;
import com.alibaba.druid.sql.ast.statement.SQLCheck;
import com.alibaba.druid.sql.ast.statement.SQLCloseStatement;
import com.alibaba.druid.sql.ast.statement.SQLColumnCheck;
import com.alibaba.druid.sql.ast.statement.SQLColumnConstraint;
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
@@ -126,12 +127,14 @@ import com.alibaba.druid.sql.ast.statement.SQLDropViewStatement;
import com.alibaba.druid.sql.ast.statement.SQLExplainStatement;
import com.alibaba.druid.sql.ast.statement.SQLExprHint;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLFetchStatement;
import com.alibaba.druid.sql.ast.statement.SQLForeignKeyConstraint;
import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl;
import com.alibaba.druid.sql.ast.statement.SQLGrantStatement;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement.ValuesClause;
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource;
import com.alibaba.druid.sql.ast.statement.SQLOpenStatement;
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource.JoinType;
import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey;
import com.alibaba.druid.sql.ast.statement.SQLPrimaryKeyImpl;
@@ -2394,4 +2397,28 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab
print("]");
return false;
}
@Override
public boolean visit(SQLOpenStatement x) {
print("OPEN ");
print(x.getCursorName());
return false;
}
@Override
public boolean visit(SQLFetchStatement x) {
print("FETCH ");
x.getCursorName().accept(this);
print(" INTO ");
printAndAccept(x.getInto(), ", ");
return false;
}
@Override
public boolean visit(SQLCloseStatement x) {
print("CLOSE ");
print(x.getCursorName());
return false;
}
}
@@ -82,6 +82,7 @@ import com.alibaba.druid.sql.ast.statement.SQLAssignItem;
import com.alibaba.druid.sql.ast.statement.SQLCallStatement;
import com.alibaba.druid.sql.ast.statement.SQLCharacterDataType;
import com.alibaba.druid.sql.ast.statement.SQLCheck;
import com.alibaba.druid.sql.ast.statement.SQLCloseStatement;
import com.alibaba.druid.sql.ast.statement.SQLColumnCheck;
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
import com.alibaba.druid.sql.ast.statement.SQLColumnPrimaryKey;
@@ -107,10 +108,12 @@ import com.alibaba.druid.sql.ast.statement.SQLDropViewStatement;
import com.alibaba.druid.sql.ast.statement.SQLExplainStatement;
import com.alibaba.druid.sql.ast.statement.SQLExprHint;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLFetchStatement;
import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl;
import com.alibaba.druid.sql.ast.statement.SQLGrantStatement;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource;
import com.alibaba.druid.sql.ast.statement.SQLOpenStatement;
import com.alibaba.druid.sql.ast.statement.SQLPrimaryKeyImpl;
import com.alibaba.druid.sql.ast.statement.SQLReleaseSavePointStatement;
import com.alibaba.druid.sql.ast.statement.SQLRevokeStatement;
@@ -624,4 +627,16 @@ public interface SQLASTVisitor {
boolean visit(SQLArrayExpr x);
void endVisit(SQLOpenStatement x);
boolean visit(SQLOpenStatement x);
void endVisit(SQLFetchStatement x);
boolean visit(SQLFetchStatement x);
void endVisit(SQLCloseStatement x);
boolean visit(SQLCloseStatement x);
}
@@ -83,6 +83,7 @@ import com.alibaba.druid.sql.ast.statement.SQLAssignItem;
import com.alibaba.druid.sql.ast.statement.SQLCallStatement;
import com.alibaba.druid.sql.ast.statement.SQLCharacterDataType;
import com.alibaba.druid.sql.ast.statement.SQLCheck;
import com.alibaba.druid.sql.ast.statement.SQLCloseStatement;
import com.alibaba.druid.sql.ast.statement.SQLColumnCheck;
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
import com.alibaba.druid.sql.ast.statement.SQLColumnPrimaryKey;
@@ -108,11 +109,13 @@ import com.alibaba.druid.sql.ast.statement.SQLDropViewStatement;
import com.alibaba.druid.sql.ast.statement.SQLExplainStatement;
import com.alibaba.druid.sql.ast.statement.SQLExprHint;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLFetchStatement;
import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl;
import com.alibaba.druid.sql.ast.statement.SQLGrantStatement;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement.ValuesClause;
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource;
import com.alibaba.druid.sql.ast.statement.SQLOpenStatement;
import com.alibaba.druid.sql.ast.statement.SQLPrimaryKeyImpl;
import com.alibaba.druid.sql.ast.statement.SQLReleaseSavePointStatement;
import com.alibaba.druid.sql.ast.statement.SQLRevokeStatement;
@@ -1236,4 +1239,34 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor {
return true;
}
@Override
public void endVisit(SQLOpenStatement x) {
}
@Override
public boolean visit(SQLOpenStatement x) {
return true;
}
@Override
public void endVisit(SQLFetchStatement x) {
}
@Override
public boolean visit(SQLFetchStatement x) {
return true;
}
@Override
public void endVisit(SQLCloseStatement x) {
}
@Override
public boolean visit(SQLCloseStatement x) {
return true;
}
}
@@ -50,6 +50,7 @@ import com.alibaba.druid.sql.ast.statement.SQLAlterTableRename;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLCallStatement;
import com.alibaba.druid.sql.ast.statement.SQLCheck;
import com.alibaba.druid.sql.ast.statement.SQLCloseStatement;
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
import com.alibaba.druid.sql.ast.statement.SQLCommentStatement;
import com.alibaba.druid.sql.ast.statement.SQLCreateIndexStatement;
@@ -68,11 +69,13 @@ import com.alibaba.druid.sql.ast.statement.SQLDropTriggerStatement;
import com.alibaba.druid.sql.ast.statement.SQLDropUserStatement;
import com.alibaba.druid.sql.ast.statement.SQLDropViewStatement;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLFetchStatement;
import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl;
import com.alibaba.druid.sql.ast.statement.SQLGrantStatement;
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource;
import com.alibaba.druid.sql.ast.statement.SQLObjectType;
import com.alibaba.druid.sql.ast.statement.SQLOpenStatement;
import com.alibaba.druid.sql.ast.statement.SQLRevokeStatement;
import com.alibaba.druid.sql.ast.statement.SQLRollbackStatement;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
@@ -1379,4 +1382,20 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
exp.accept(this);
return false;
}
@Override
public boolean visit(SQLOpenStatement x) {
return false;
}
@Override
public boolean visit(SQLFetchStatement x) {
return false;
}
@Override
public boolean visit(SQLCloseStatement x) {
return false;
}
}
@@ -3,6 +3,7 @@ package com.alibaba.druid.bvt.sql.oracle.visitor;
import junit.framework.TestCase;
import com.alibaba.druid.sql.ast.expr.SQLTimestampExpr;
import com.alibaba.druid.sql.ast.statement.SQLFetchStatement;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableRename;
import com.alibaba.druid.sql.ast.statement.SQLDropSequenceStatement;
import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay;
@@ -74,7 +75,6 @@ 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;
@@ -187,7 +187,7 @@ public class OracleASTVisitorAdapterTest extends TestCase {
new OracleCreateDatabaseDbLinkStatement().accept(adapter);
new OracleCreateProcedureStatement().accept(adapter);
new OracleSavePointStatement().accept(adapter);
new OracleFetchStatement().accept(adapter);
new SQLFetchStatement().accept(adapter);
new OracleExitStatement().accept(adapter);
new OracleExplainStatement().accept(adapter);
new OracleAlterProcedureStatement().accept(adapter);