mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
Merge pull request #1040 from wenshao/master
improved mysql parser for 'create procedure statement support'
This commit is contained in:
+4
-6
@@ -13,17 +13,15 @@
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.alibaba.druid.sql.dialect.sqlserver.ast;
|
||||
package com.alibaba.druid.sql.ast;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLDataType;
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLTableElement;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitor;
|
||||
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
|
||||
|
||||
public class SQLServerDeclareItem extends SQLServerObjectImpl {
|
||||
public class SQLDeclareItem extends SQLObjectImpl {
|
||||
|
||||
protected Type type;
|
||||
|
||||
@@ -36,7 +34,7 @@ public class SQLServerDeclareItem extends SQLServerObjectImpl {
|
||||
protected List<SQLTableElement> tableElementList = new ArrayList<SQLTableElement>();
|
||||
|
||||
@Override
|
||||
public void accept0(SQLServerASTVisitor visitor) {
|
||||
protected void accept0(SQLASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, this.name);
|
||||
acceptChild(visitor, this.dataType);
|
||||
@@ -26,6 +26,8 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor;
|
||||
|
||||
public class SQLCreateProcedureStatement extends SQLStatementImpl {
|
||||
|
||||
private SQLName definer;
|
||||
|
||||
private boolean orReplace;
|
||||
private SQLName name;
|
||||
private SQLStatement block;
|
||||
@@ -34,6 +36,7 @@ public class SQLCreateProcedureStatement extends SQLStatementImpl {
|
||||
@Override
|
||||
public void accept0(SQLASTVisitor visitor) {
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, definer);
|
||||
acceptChild(visitor, name);
|
||||
acceptChild(visitor, parameters);
|
||||
acceptChild(visitor, block);
|
||||
@@ -73,4 +76,13 @@ public class SQLCreateProcedureStatement extends SQLStatementImpl {
|
||||
this.orReplace = orReplace;
|
||||
}
|
||||
|
||||
public SQLName getDefiner() {
|
||||
return definer;
|
||||
}
|
||||
|
||||
|
||||
public void setDefiner(SQLName definer) {
|
||||
this.definer = definer;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+22
-36
@@ -18,54 +18,40 @@ package com.alibaba.druid.sql.dialect.mysql.ast.clause;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLDataType;
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLDeclareItem;
|
||||
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStatementImpl;
|
||||
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
|
||||
|
||||
/**
|
||||
*
|
||||
* @Description: MySql declare statement
|
||||
* @author zz email:455910092@qq.com
|
||||
* @date 2015-9-14
|
||||
* @version V1.0
|
||||
*/
|
||||
public class MySqlDeclareStatement extends MySqlStatementImpl{
|
||||
|
||||
//var type
|
||||
private SQLDataType type;
|
||||
//var list
|
||||
private List<SQLExpr> varList=new ArrayList<SQLExpr>();
|
||||
|
||||
public class MySqlDeclareStatement extends MySqlStatementImpl {
|
||||
|
||||
public List<SQLExpr> getVarList() {
|
||||
return varList;
|
||||
}
|
||||
public void addVar(SQLExpr expr)
|
||||
{
|
||||
varList.add(expr);
|
||||
}
|
||||
private List<SQLDeclareItem> varList = new ArrayList<SQLDeclareItem>();
|
||||
|
||||
public void setVarList(List<SQLExpr> varList) {
|
||||
this.varList = varList;
|
||||
}
|
||||
public List<SQLDeclareItem> getVarList() {
|
||||
return varList;
|
||||
}
|
||||
|
||||
public SQLDataType getType() {
|
||||
return type;
|
||||
}
|
||||
public void addVar(SQLDeclareItem expr) {
|
||||
varList.add(expr);
|
||||
}
|
||||
|
||||
public void setType(SQLDataType type) {
|
||||
this.type = type;
|
||||
}
|
||||
public void setVarList(List<SQLDeclareItem> varList) {
|
||||
this.varList = varList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void accept0(MySqlASTVisitor visitor) {
|
||||
// TODO Auto-generated method stub
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, type);
|
||||
acceptChild(visitor, varList);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
|
||||
}
|
||||
@Override
|
||||
public void accept0(MySqlASTVisitor visitor) {
|
||||
// TODO Auto-generated method stub
|
||||
if (visitor.visit(this)) {
|
||||
acceptChild(visitor, varList);
|
||||
}
|
||||
visitor.endVisit(this);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+48
-39
@@ -20,6 +20,7 @@ import java.util.List;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLCommentHint;
|
||||
import com.alibaba.druid.sql.ast.SQLDataTypeImpl;
|
||||
import com.alibaba.druid.sql.ast.SQLDeclareItem;
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.ast.SQLOrderBy;
|
||||
@@ -29,7 +30,6 @@ 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.SQLIdentifierExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLNCharExpr;
|
||||
@@ -378,7 +378,7 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
return parseCreateTrigger();
|
||||
}
|
||||
//parse create procedure
|
||||
if (lexer.token() == Token.PROCEDURE) {
|
||||
if (lexer.token() == Token.PROCEDURE || identifierEquals("DEFINER")) {
|
||||
if (replace) {
|
||||
lexer.reset(markBp, markChar, Token.CREATE);
|
||||
}
|
||||
@@ -2765,12 +2765,19 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
*/
|
||||
SQLCreateProcedureStatement stmt = new SQLCreateProcedureStatement();
|
||||
|
||||
accept(Token.CREATE);
|
||||
if (lexer.token() == Token.OR) {
|
||||
lexer.nextToken();
|
||||
accept(Token.REPLACE);
|
||||
stmt.setOrReplace(true);
|
||||
}
|
||||
if(identifierEquals("DEFINER")) {
|
||||
lexer.nextToken();
|
||||
accept(Token.EQ);
|
||||
SQLName definer = this.exprParser.name();
|
||||
stmt.setDefiner(definer);
|
||||
} else {
|
||||
accept(Token.CREATE);
|
||||
if (lexer.token() == Token.OR) {
|
||||
lexer.nextToken();
|
||||
accept(Token.REPLACE);
|
||||
stmt.setOrReplace(true);
|
||||
}
|
||||
}
|
||||
|
||||
accept(Token.PROCEDURE);
|
||||
|
||||
@@ -2793,6 +2800,10 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
* @param parameters
|
||||
*/
|
||||
private void parserParameters(List<SQLParameter> parameters) {
|
||||
if (lexer.token() == Token.RPAREN) {
|
||||
return;
|
||||
}
|
||||
|
||||
for (;;) {
|
||||
SQLParameter parameter = new SQLParameter();
|
||||
|
||||
@@ -3264,37 +3275,35 @@ public class MySqlStatementParser extends SQLStatementParser {
|
||||
/**
|
||||
* parse declare statement
|
||||
*/
|
||||
public MySqlDeclareStatement parseDeclare()
|
||||
{
|
||||
MySqlDeclareStatement stmt=new MySqlDeclareStatement();
|
||||
accept(Token.DECLARE);
|
||||
//lexer.nextToken();
|
||||
for(;;)
|
||||
{
|
||||
SQLExpr var = exprParser.primary();
|
||||
if (var instanceof SQLIdentifierExpr) {
|
||||
var = new SQLVariantRefExpr(((SQLIdentifierExpr) var).getName());
|
||||
}
|
||||
stmt.addVar(var);
|
||||
if(lexer.token()==Token.COMMA)
|
||||
{
|
||||
accept(Token.COMMA);
|
||||
continue;
|
||||
}
|
||||
else if(lexer.token()!=Token.EOF)
|
||||
{
|
||||
//var type
|
||||
stmt.setType(exprParser.parseDataType());
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
setErrorEndPos(lexer.pos());
|
||||
printError(lexer.token());
|
||||
}
|
||||
}
|
||||
return stmt;
|
||||
}
|
||||
public MySqlDeclareStatement parseDeclare() {
|
||||
MySqlDeclareStatement stmt = new MySqlDeclareStatement();
|
||||
accept(Token.DECLARE);
|
||||
// lexer.nextToken();
|
||||
for (;;) {
|
||||
SQLDeclareItem item = new SQLDeclareItem();
|
||||
item.setName(exprParser.name());
|
||||
|
||||
stmt.addVar(item);
|
||||
if (lexer.token() == Token.COMMA) {
|
||||
accept(Token.COMMA);
|
||||
continue;
|
||||
} else if (lexer.token() != Token.EOF) {
|
||||
// var type
|
||||
item.setDataType(exprParser.parseDataType());
|
||||
|
||||
if (lexer.token() == Token.DEFAULT) {
|
||||
lexer.nextToken();
|
||||
SQLExpr defaultValue = this.exprParser.primary();
|
||||
item.setValue(defaultValue);
|
||||
}
|
||||
|
||||
break;
|
||||
} else {
|
||||
throw new ParserException("TODO");
|
||||
}
|
||||
}
|
||||
return stmt;
|
||||
}
|
||||
|
||||
/**
|
||||
* parse assign statement
|
||||
|
||||
@@ -164,8 +164,12 @@ 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.dialect.mysql.ast.statement.MySqlUpdateTableSource;
|
||||
import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor;
|
||||
import com.alibaba.druid.util.JdbcConstants;
|
||||
|
||||
public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTVisitor {
|
||||
{
|
||||
this.dbType = JdbcConstants.MYSQL;
|
||||
}
|
||||
|
||||
public MySqlOutputVisitor(Appendable appender){
|
||||
super(appender);
|
||||
@@ -3179,8 +3183,8 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
|
||||
|
||||
int paramSize = x.getParameters().size();
|
||||
|
||||
print0(" (");
|
||||
if (paramSize > 0) {
|
||||
print0(" (");
|
||||
incrementIndent();
|
||||
println();
|
||||
|
||||
@@ -3195,8 +3199,8 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
|
||||
|
||||
decrementIndent();
|
||||
println();
|
||||
print(')');
|
||||
}
|
||||
print(')');
|
||||
|
||||
println();
|
||||
x.getBlock().setParent(x);
|
||||
@@ -3317,13 +3321,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
|
||||
@Override
|
||||
public boolean visit(MySqlDeclareStatement x) {
|
||||
print0(ucase ? "DECLARE " : "declare ");
|
||||
for (int i = 0; i < x.getVarList().size(); i++) {
|
||||
x.getVarList().get(i).accept(this);
|
||||
if(i!=x.getVarList().size()-1)
|
||||
print0(", ");
|
||||
}
|
||||
print(' ');
|
||||
x.getType().accept(this);
|
||||
printAndAccept(x.getVarList(), ", ");
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
+4
-5
@@ -17,11 +17,10 @@ package com.alibaba.druid.sql.dialect.mysql.visitor;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLDeclareItem;
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.ast.SQLObject;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
|
||||
@@ -1359,11 +1358,11 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
|
||||
|
||||
@Override
|
||||
public boolean visit(MySqlDeclareStatement x) {
|
||||
for (SQLExpr item : x.getVarList()) {
|
||||
for (SQLDeclareItem item : x.getVarList()) {
|
||||
item.setParent(x);
|
||||
|
||||
SQLVariantRefExpr var = (SQLVariantRefExpr)item;
|
||||
this.variants.put(var.getName(), var);
|
||||
SQLName var = (SQLName)item.getName();
|
||||
this.variants.put(var.toString(), var);
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
+4
-4
@@ -18,14 +18,14 @@ package com.alibaba.druid.sql.dialect.sqlserver.ast.stmt;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerDeclareItem;
|
||||
import com.alibaba.druid.sql.ast.SQLDeclareItem;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerObjectImpl;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerStatement;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitor;
|
||||
|
||||
public class SQLServerDeclareStatement extends SQLServerObjectImpl implements SQLServerStatement {
|
||||
|
||||
protected List<SQLServerDeclareItem> items = new ArrayList<SQLServerDeclareItem>();
|
||||
protected List<SQLDeclareItem> items = new ArrayList<SQLDeclareItem>();
|
||||
|
||||
private String dbType;
|
||||
|
||||
@@ -37,11 +37,11 @@ public class SQLServerDeclareStatement extends SQLServerObjectImpl implements SQ
|
||||
visitor.endVisit(this);
|
||||
}
|
||||
|
||||
public List<SQLServerDeclareItem> getItems() {
|
||||
public List<SQLDeclareItem> getItems() {
|
||||
return items;
|
||||
}
|
||||
|
||||
public void setItems(List<SQLServerDeclareItem> items) {
|
||||
public void setItems(List<SQLDeclareItem> items) {
|
||||
this.items = items;
|
||||
}
|
||||
|
||||
|
||||
+5
-5
@@ -21,6 +21,7 @@ import java.util.List;
|
||||
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.SQLDeclareItem;
|
||||
import com.alibaba.druid.sql.ast.SQLStatement;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
|
||||
import com.alibaba.druid.sql.ast.expr.SQLQueryExpr;
|
||||
@@ -34,7 +35,6 @@ import com.alibaba.druid.sql.ast.statement.SQLSetStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLTableElement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerDeclareItem;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerOutput;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerTop;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.stmt.SQLServerCommitStatement;
|
||||
@@ -171,7 +171,7 @@ public class SQLServerStatementParser extends SQLStatementParser {
|
||||
SQLServerDeclareStatement declareStatement = new SQLServerDeclareStatement();
|
||||
|
||||
for (;;) {
|
||||
SQLServerDeclareItem item = new SQLServerDeclareItem();
|
||||
SQLDeclareItem item = new SQLDeclareItem();
|
||||
declareStatement.getItems().add(item);
|
||||
|
||||
item.setName(this.exprParser.name());
|
||||
@@ -182,7 +182,7 @@ public class SQLServerStatementParser extends SQLStatementParser {
|
||||
|
||||
if (lexer.token() == Token.TABLE) {
|
||||
lexer.nextToken();
|
||||
item.setType(SQLServerDeclareItem.Type.TABLE);
|
||||
item.setType(SQLDeclareItem.Type.TABLE);
|
||||
|
||||
if (lexer.token() == Token.LPAREN) {
|
||||
lexer.nextToken();
|
||||
@@ -221,10 +221,10 @@ public class SQLServerStatementParser extends SQLStatementParser {
|
||||
}
|
||||
break;
|
||||
} else if (lexer.token() == Token.CURSOR) {
|
||||
item.setType(SQLServerDeclareItem.Type.CURSOR);
|
||||
item.setType(SQLDeclareItem.Type.CURSOR);
|
||||
lexer.nextToken();
|
||||
} else {
|
||||
item.setType(SQLServerDeclareItem.Type.LOCAL);
|
||||
item.setType(SQLDeclareItem.Type.LOCAL);
|
||||
item.setDataType(this.exprParser.parseDataType());
|
||||
if (lexer.token() == Token.EQ) {
|
||||
lexer.nextToken();
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
package com.alibaba.druid.sql.dialect.sqlserver.visitor;
|
||||
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerColumnDefinition;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerDeclareItem;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerOutput;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelect;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock;
|
||||
@@ -79,10 +78,6 @@ public interface SQLServerASTVisitor extends SQLASTVisitor {
|
||||
boolean visit(SQLServerOutput x);
|
||||
|
||||
void endVisit(SQLServerOutput x);
|
||||
|
||||
boolean visit(SQLServerDeclareItem x);
|
||||
|
||||
void endVisit(SQLServerDeclareItem x);
|
||||
|
||||
boolean visit(SQLServerDeclareStatement x);
|
||||
|
||||
|
||||
-11
@@ -16,7 +16,6 @@
|
||||
package com.alibaba.druid.sql.dialect.sqlserver.visitor;
|
||||
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerColumnDefinition;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerDeclareItem;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerOutput;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelect;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock;
|
||||
@@ -146,16 +145,6 @@ public class SQLServerASTVisitorAdapter extends SQLASTVisitorAdapter implements
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLServerDeclareItem x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(SQLServerDeclareItem x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLServerDeclareStatement x) {
|
||||
return true;
|
||||
|
||||
-43
@@ -26,7 +26,6 @@ import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLGrantStatement;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerColumnDefinition;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerColumnDefinition.Identity;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerDeclareItem;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerOutput;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelect;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock;
|
||||
@@ -429,48 +428,6 @@ public class SQLServerOutputVisitor extends SQLASTOutputVisitor implements SQLSe
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLServerDeclareItem x) {
|
||||
x.getName().accept(this);
|
||||
|
||||
if(x.getType() == SQLServerDeclareItem.Type.TABLE) {
|
||||
print0(ucase ? " TABLE" : " table");
|
||||
int size = x.getTableElementList().size();
|
||||
|
||||
if (size > 0) {
|
||||
print0(" (");
|
||||
incrementIndent();
|
||||
println();
|
||||
for (int i = 0; i < size; ++i) {
|
||||
if (i != 0) {
|
||||
print(',');
|
||||
println();
|
||||
}
|
||||
x.getTableElementList().get(i).accept(this);
|
||||
}
|
||||
decrementIndent();
|
||||
println();
|
||||
print(')');
|
||||
}
|
||||
} else if (x.getType() == SQLServerDeclareItem.Type.CURSOR) {
|
||||
print0(ucase ? " CURSOR" : " cursor");
|
||||
} else {
|
||||
print(' ');
|
||||
x.getDataType().accept(this);
|
||||
if (x.getValue() != null) {
|
||||
print0(" = ");
|
||||
x.getValue().accept(this);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(SQLServerDeclareItem x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLServerDeclareStatement x) {
|
||||
print0(ucase ? "DECLARE " : "declare ");
|
||||
|
||||
+2
-12
@@ -17,13 +17,13 @@ package com.alibaba.druid.sql.dialect.sqlserver.visitor;
|
||||
|
||||
import java.util.Map;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLDeclareItem;
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLInsertStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerColumnDefinition;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerColumnDefinition.Identity;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerDeclareItem;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerOutput;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelect;
|
||||
import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock;
|
||||
@@ -176,19 +176,9 @@ public class SQLServerSchemaStatVisitor extends SchemaStatVisitor implements SQL
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLServerDeclareItem x) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(SQLServerDeclareItem x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLServerDeclareStatement x) {
|
||||
for (SQLServerDeclareItem item : x.getItems()) {
|
||||
for (SQLDeclareItem item : x.getItems()) {
|
||||
item.setParent(x);
|
||||
|
||||
SQLExpr name = item.getName();
|
||||
|
||||
@@ -28,6 +28,7 @@ import java.util.List;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLCommentHint;
|
||||
import com.alibaba.druid.sql.ast.SQLDataType;
|
||||
import com.alibaba.druid.sql.ast.SQLDeclareItem;
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLObject;
|
||||
import com.alibaba.druid.sql.ast.SQLOrderBy;
|
||||
@@ -166,6 +167,7 @@ import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLUseStatement;
|
||||
import com.alibaba.druid.sql.ast.statement.SQLWithSubqueryClause;
|
||||
import com.alibaba.druid.util.JdbcConstants;
|
||||
|
||||
public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements PrintableVisitor {
|
||||
|
||||
@@ -178,7 +180,9 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab
|
||||
|
||||
protected boolean groupItemSingleLine = false;
|
||||
|
||||
private List<Object> parameters;
|
||||
private List<Object> parameters;
|
||||
|
||||
protected String dbType;
|
||||
|
||||
public SQLASTOutputVisitor(Appendable appender){
|
||||
this.appender = appender;
|
||||
@@ -2614,6 +2618,53 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLDeclareItem x) {
|
||||
x.getName().accept(this);
|
||||
|
||||
if(x.getType() == SQLDeclareItem.Type.TABLE) {
|
||||
print0(ucase ? " TABLE" : " table");
|
||||
int size = x.getTableElementList().size();
|
||||
|
||||
if (size > 0) {
|
||||
print0(" (");
|
||||
incrementIndent();
|
||||
println();
|
||||
for (int i = 0; i < size; ++i) {
|
||||
if (i != 0) {
|
||||
print(',');
|
||||
println();
|
||||
}
|
||||
x.getTableElementList().get(i).accept(this);
|
||||
}
|
||||
decrementIndent();
|
||||
println();
|
||||
print(')');
|
||||
}
|
||||
} else if (x.getType() == SQLDeclareItem.Type.CURSOR) {
|
||||
print0(ucase ? " CURSOR" : " cursor");
|
||||
} else {
|
||||
if (x.getDataType() != null) {
|
||||
print(' ');
|
||||
x.getDataType().accept(this);
|
||||
}
|
||||
if (x.getValue() != null) {
|
||||
if (JdbcConstants.MYSQL.equals(getDbType())) {
|
||||
print0(ucase ? " DEFAULT " : " default ");
|
||||
} else {
|
||||
print0(" = ");
|
||||
}
|
||||
x.getValue().accept(this);
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public String getDbType() {
|
||||
return dbType;
|
||||
}
|
||||
|
||||
public boolean isUppCase() {
|
||||
return ucase;
|
||||
|
||||
@@ -17,6 +17,7 @@ package com.alibaba.druid.sql.visitor;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLCommentHint;
|
||||
import com.alibaba.druid.sql.ast.SQLDataType;
|
||||
import com.alibaba.druid.sql.ast.SQLDeclareItem;
|
||||
import com.alibaba.druid.sql.ast.SQLObject;
|
||||
import com.alibaba.druid.sql.ast.SQLOrderBy;
|
||||
import com.alibaba.druid.sql.ast.SQLOver;
|
||||
@@ -681,4 +682,8 @@ public interface SQLASTVisitor {
|
||||
boolean visit(SQLAlterTableDropKey x);
|
||||
|
||||
void endVisit(SQLAlterTableDropKey x);
|
||||
|
||||
boolean visit(SQLDeclareItem x);
|
||||
|
||||
void endVisit(SQLDeclareItem x);
|
||||
}
|
||||
|
||||
@@ -17,6 +17,7 @@ package com.alibaba.druid.sql.visitor;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLCommentHint;
|
||||
import com.alibaba.druid.sql.ast.SQLDataType;
|
||||
import com.alibaba.druid.sql.ast.SQLDeclareItem;
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLObject;
|
||||
import com.alibaba.druid.sql.ast.SQLOrderBy;
|
||||
@@ -1365,5 +1366,14 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor {
|
||||
public void endVisit(SQLAlterTableDropKey x) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLDeclareItem x) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void endVisit(SQLDeclareItem x) {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
|
||||
import com.alibaba.druid.sql.ast.SQLDeclareItem;
|
||||
import com.alibaba.druid.sql.ast.SQLExpr;
|
||||
import com.alibaba.druid.sql.ast.SQLName;
|
||||
import com.alibaba.druid.sql.ast.SQLObject;
|
||||
@@ -1445,4 +1446,9 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter {
|
||||
public boolean visit(SQLShowTablesStatement x) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean visit(SQLDeclareItem x) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
* 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.bvt.sql.mysql;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.junit.Assert;
|
||||
|
||||
import com.alibaba.druid.sql.MysqlTest;
|
||||
import com.alibaba.druid.sql.SQLUtils;
|
||||
import com.alibaba.druid.sql.ast.SQLStatement;
|
||||
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;
|
||||
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor;
|
||||
import com.alibaba.druid.stat.TableStat;
|
||||
import com.alibaba.druid.stat.TableStat.Column;
|
||||
|
||||
/**
|
||||
*
|
||||
* @Description: create procedure parameter type support
|
||||
* @author zz email:455910092@qq.com
|
||||
* @date 2015-9-14
|
||||
* @version V1.0
|
||||
*/
|
||||
public class MySqlCreateProcedureTest7 extends MysqlTest {
|
||||
|
||||
public void test_0() throws Exception {
|
||||
String sql="CREATE DEFINER=test@% PROCEDURE test11111()"
|
||||
+ "\nBEGIN"
|
||||
+ "\ndeclare v_a date default '2007-4-10';"
|
||||
+ "\ndeclare v_b date default '2007-4-11';"
|
||||
+ "\ndeclare v_c datetime default '2004-4-9 0:0:0';"
|
||||
+ "\nEND";
|
||||
|
||||
MySqlStatementParser parser=new MySqlStatementParser(sql);
|
||||
List<SQLStatement> statementList = parser.parseStatementList();
|
||||
SQLStatement stmt = statementList.get(0);
|
||||
print(statementList);
|
||||
Assert.assertEquals(1, statementList.size());
|
||||
|
||||
MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
|
||||
stmt.accept(visitor);
|
||||
|
||||
System.out.println("Tables : " + visitor.getTables());
|
||||
System.out.println("fields : " + visitor.getColumns());
|
||||
System.out.println("coditions : " + visitor.getConditions());
|
||||
System.out.println("orderBy : " + visitor.getOrderByColumns());
|
||||
|
||||
String output = SQLUtils.toMySqlString(stmt);
|
||||
Assert.assertEquals("CREATE PROCEDURE test11111 ()"
|
||||
+ "\nBEGIN"
|
||||
+ "\n\tDECLARE v_a date DEFAULT '2007-4-10';"
|
||||
+ "\n\tDECLARE v_b date DEFAULT '2007-4-11';"
|
||||
+ "\n\tDECLARE v_c datetime DEFAULT '2004-4-9 0:0:0';"
|
||||
+ "\nEND", output);
|
||||
|
||||
Assert.assertEquals(0, visitor.getTables().size());
|
||||
Assert.assertEquals(0, visitor.getColumns().size());
|
||||
Assert.assertEquals(0, visitor.getConditions().size());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* 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.bvt.sql.mysql;
|
||||
|
||||
import org.junit.Assert;
|
||||
import org.junit.Test;
|
||||
|
||||
import com.alibaba.druid.sql.MysqlTest;
|
||||
import com.alibaba.druid.sql.SQLUtils;
|
||||
import com.alibaba.druid.sql.ast.SQLStatement;
|
||||
import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser;
|
||||
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor;
|
||||
|
||||
public class MySqlCreateTableTest60 extends MysqlTest {
|
||||
|
||||
@Test
|
||||
public void test_one() throws Exception {
|
||||
String sql = "create table t10 (pk int auto_increment primary key,f1 varchar(65500) charset latin1);";
|
||||
|
||||
MySqlStatementParser parser = new MySqlStatementParser(sql);
|
||||
SQLStatement stmt = parser.parseCreateTable();
|
||||
|
||||
MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor();
|
||||
stmt.accept(visitor);
|
||||
|
||||
String output = SQLUtils.toMySqlString(stmt);
|
||||
Assert.assertEquals("CREATE TABLE t10 ("
|
||||
+ "\n\tpk int PRIMARY KEY AUTO_INCREMENT, "
|
||||
+ "\n\tf1 varchar(65500) CHARSET latin1 "
|
||||
+ "\n)", output);
|
||||
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user