From a318ebae292de590384bb13712252e1156184361 Mon Sep 17 00:00:00 2001 From: wenshao Date: Sat, 10 Jun 2017 15:58:52 +0800 Subject: [PATCH] sql parser refactor. --- .../druid/sql/ast/expr/SQLIdentifierExpr.java | 9 +- .../SQLCreateProcedureStatement.java | 47 ++++++++ .../mysql/parser/MySqlStatementParser.java | 54 ++++++--- .../mysql/visitor/MySqlOutputVisitor.java | 105 +++++++++++------- .../druid/sql/parser/SQLStatementParser.java | 12 ++ .../druid/sql/visitor/SchemaStatVisitor.java | 65 +++++++++-- .../create/MySqlCreateProcedureTest13.java | 61 ++++++++++ .../create/MySqlCreateProcedureTest14.java | 63 +++++++++++ .../create/MySqlCreateProcedureTest8.java | 27 +++-- .../create/MySqlCreateProcedureTest9.java | 20 ++-- .../sql/oracle/block/OracleBlockTest13.java | 4 +- .../sql/oracle/block/OracleBlockTest14.java | 4 +- .../sql/oracle/block/OracleBlockTest15.java | 4 +- .../sql/oracle/block/OracleBlockTest18.java | 6 +- .../sql/oracle/block/OracleBlockTest7.java | 2 +- .../create/OracleCreateProcedureTest1.java | 4 +- .../create/OracleCreateProcedureTest2.java | 6 +- 17 files changed, 394 insertions(+), 99 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest13.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest14.java diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLIdentifierExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLIdentifierExpr.java index 38cf6be547..f60089c051 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLIdentifierExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLIdentifierExpr.java @@ -24,6 +24,7 @@ public class SQLIdentifierExpr extends SQLExprImpl implements SQLName { private String name; private transient String lowerName; + private transient Boolean parameter; public SQLIdentifierExpr(){ @@ -53,8 +54,12 @@ public class SQLIdentifierExpr extends SQLExprImpl implements SQLName { return lowerName; } - public void setLowerName(String lowerName) { - this.lowerName = lowerName; + public Boolean isParameter() { + return parameter; + } + + public void setParameter(Boolean parameter) { + this.parameter = parameter; } public void output(StringBuffer buf) { diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateProcedureStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateProcedureStatement.java index af92bdc02f..c3e18b7f34 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateProcedureStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateProcedureStatement.java @@ -39,6 +39,13 @@ public class SQLCreateProcedureStatement extends SQLStatementImpl { private SQLName authid; + // for mysql + private boolean deterministic; + private boolean containsSql; + private boolean noSql; + private boolean readSqlData; + private boolean modifiesSqlData; + @Override public void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { @@ -119,4 +126,44 @@ public class SQLCreateProcedureStatement extends SQLStatementImpl { public void setJavaCallSpec(String javaCallSpec) { this.javaCallSpec = javaCallSpec; } + + public boolean isDeterministic() { + return deterministic; + } + + public void setDeterministic(boolean deterministic) { + this.deterministic = deterministic; + } + + public boolean isContainsSql() { + return containsSql; + } + + public void setContainsSql(boolean containsSql) { + this.containsSql = containsSql; + } + + public boolean isNoSql() { + return noSql; + } + + public void setNoSql(boolean noSql) { + this.noSql = noSql; + } + + public boolean isReadSqlData() { + return readSqlData; + } + + public void setReadSqlData(boolean readSqlData) { + this.readSqlData = readSqlData; + } + + public boolean isModifiesSqlData() { + return modifiesSqlData; + } + + public void setModifiesSqlData(boolean modifiesSqlData) { + this.modifiesSqlData = modifiesSqlData; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java index 0b7ea7be21..92cc27d1fc 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java @@ -2030,6 +2030,8 @@ public class MySqlStatementParser extends SQLStatementParser { if (identifierEquals("USING")) { lexer.nextToken(); exprParser.exprList(stmt.getParameters(), stmt); + } else if (lexer.token() == Token.IDENTIFIER) { + exprParser.exprList(stmt.getParameters(), stmt); } return stmt; @@ -3252,8 +3254,31 @@ public class MySqlStatementParser extends SQLStatementParser { parserParameters(stmt.getParameters(), stmt); accept(Token.RPAREN);// match ")" } - SQLStatement block; + for (;;) { + if (identifierEquals("DETERMINISTIC")) { + lexer.nextToken(); + stmt.setDeterministic(true); + continue; + } + if (identifierEquals("CONTAINS")) { + lexer.nextToken(); + acceptIdentifier("SQL"); + stmt.setContainsSql(true); + continue; + } + + if (identifierEquals("SQL")) { + lexer.nextToken(); + acceptIdentifier("SECURITY"); + SQLName authid = this.exprParser.name(); + stmt.setAuthid(authid); + } + + break; + } + + SQLStatement block; if (lexer.token() == Token.BEGIN) { block = this.parseBlock(); } else { @@ -3565,7 +3590,7 @@ public class MySqlStatementParser extends SQLStatementParser { accept(Token.THEN); - this.parseProcedureStatementList(stmt.getStatements()); + this.parseStatementList(stmt.getStatements(), -1, stmt); while (lexer.token() == Token.ELSE) { lexer.nextToken(); @@ -3578,12 +3603,13 @@ public class MySqlStatementParser extends SQLStatementParser { elseIf.setCondition(this.exprParser.expr()); accept(Token.THEN); - this.parseProcedureStatementList(elseIf.getStatements()); + this.parseStatementList(elseIf.getStatements(), -1, elseIf); + stmt.getElseIfList().add(elseIf); } else { SQLIfStatement.Else elseItem = new SQLIfStatement.Else(); - this.parseProcedureStatementList(elseItem.getStatements()); + this.parseStatementList(elseItem.getStatements(), -1, elseItem); stmt.setElseItem(elseItem); break; } @@ -3610,7 +3636,7 @@ public class MySqlStatementParser extends SQLStatementParser { accept(Token.DO); - this.parseProcedureStatementList(stmt.getStatements()); + this.parseStatementList(stmt.getStatements(), -1, stmt); accept(Token.END); @@ -3638,7 +3664,7 @@ public class MySqlStatementParser extends SQLStatementParser { accept(Token.DO); - this.parseProcedureStatementList(stmt.getStatements()); + this.parseStatementList(stmt.getStatements(), -1, stmt); accept(Token.END); @@ -3672,14 +3698,14 @@ public class MySqlStatementParser extends SQLStatementParser { accept(Token.THEN); // when block - parseProcedureStatementList(when.getStatements()); + this.parseStatementList(when.getStatements(), -1, when); stmt.addWhenStatement(when); } if (lexer.token() == Token.ELSE) { // parse else block SQLIfStatement.Else elseStmt = new SQLIfStatement.Else(); - parseProcedureStatementList(elseStmt.getStatements()); + this.parseStatementList(elseStmt.getStatements(), -1, elseStmt); stmt.setElseItem(elseStmt); } } else// grammar 2 @@ -3696,7 +3722,7 @@ public class MySqlStatementParser extends SQLStatementParser { accept(Token.THEN); // when block - parseProcedureStatementList(when.getStatements()); + this.parseStatementList(when.getStatements(), -1, when); stmt.addWhenStatement(when); } @@ -3704,7 +3730,7 @@ public class MySqlStatementParser extends SQLStatementParser { accept(Token.ELSE); // else block SQLIfStatement.Else elseStmt = new SQLIfStatement.Else(); - parseProcedureStatementList(elseStmt.getStatements()); + this.parseStatementList(elseStmt.getStatements(), -1, elseStmt); stmt.setElseItem(elseStmt); } } @@ -3799,7 +3825,7 @@ public class MySqlStatementParser extends SQLStatementParser { public SQLLoopStatement parseLoop() { SQLLoopStatement loopStmt = new SQLLoopStatement(); accept(Token.LOOP); - parseProcedureStatementList(loopStmt.getStatements()); + this.parseStatementList(loopStmt.getStatements(), -1, loopStmt); accept(Token.END); accept(Token.LOOP); accept(Token.SEMI); @@ -3814,7 +3840,7 @@ public class MySqlStatementParser extends SQLStatementParser { SQLLoopStatement loopStmt = new SQLLoopStatement(); loopStmt.setLabelName(label); accept(Token.LOOP); - parseProcedureStatementList(loopStmt.getStatements()); + this.parseStatementList(loopStmt.getStatements(), -1, loopStmt); accept(Token.END); accept(Token.LOOP); if (lexer.token() != Token.SEMI) { @@ -3832,7 +3858,7 @@ public class MySqlStatementParser extends SQLStatementParser { SQLBlockStatement block = new SQLBlockStatement(); block.setLabelName(label); accept(Token.BEGIN); - parseProcedureStatementList(block.getStatementList()); + this.parseStatementList(block.getStatementList(), -1, block); accept(Token.END); acceptIdentifier(label); return block; @@ -3888,7 +3914,7 @@ public class MySqlStatementParser extends SQLStatementParser { MySqlRepeatStatement repeatStmt = new MySqlRepeatStatement(); repeatStmt.setLabelName(label); accept(Token.REPEAT); - parseProcedureStatementList(repeatStmt.getStatements()); + this.parseStatementList(repeatStmt.getStatements(), -1, repeatStmt); accept(Token.UNTIL); repeatStmt.setCondition(exprParser.expr()); accept(Token.END); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java index e47c798201..5501482ce9 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java @@ -3141,45 +3141,6 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV return false; } - /** - * visit procedure create node - */ - @Override - public boolean visit(SQLCreateProcedureStatement x) { - if (x.isOrReplace()) { - print0(ucase ? "CREATE OR REPLACE PROCEDURE " : "create or replace procedure "); - } else { - print0(ucase ? "CREATE PROCEDURE " : "create procedure "); - } - x.getName().accept(this); - - int paramSize = x.getParameters().size(); - - print0(" ("); - if (paramSize > 0) { - incrementIndent(); - println(); - - for (int i = 0; i < paramSize; ++i) { - if (i != 0) { - print0(", "); - println(); - } - SQLParameter param = x.getParameters().get(i); - param.accept(this); - } - - decrementIndent(); - println(); - } - print(')'); - - println(); - x.getBlock().setParent(x); - x.getBlock().accept(this); - return false; - } - @Override public boolean visit(SQLIfStatement x) { print0(ucase ? "IF " : "if "); @@ -3587,6 +3548,72 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV return false; } + /** + * visit procedure create node + */ + @Override + public boolean visit(SQLCreateProcedureStatement x) { + if (x.isOrReplace()) { + print0(ucase ? "CREATE OR REPLACE PROCEDURE " : "create or replace procedure "); + } else { + print0(ucase ? "CREATE PROCEDURE " : "create procedure "); + } + x.getName().accept(this); + + int paramSize = x.getParameters().size(); + + print0(" ("); + if (paramSize > 0) { + incrementIndent(); + println(); + + for (int i = 0; i < paramSize; ++i) { + if (i != 0) { + print0(", "); + println(); + } + SQLParameter param = x.getParameters().get(i); + param.accept(this); + } + + decrementIndent(); + println(); + } + print(')'); + + if (x.isDeterministic()) { + println(); + print(ucase ? "DETERMINISTIC" : "deterministic"); + } + + if (x.isContainsSql()) { + println(); + print0(ucase ? "CONTAINS SQL" : "contains sql"); + } + + if (x.isNoSql()) { + println(); + print(ucase ? "NO SQL" : "no sql"); + } + + if (x.isModifiesSqlData()) { + println(); + print(ucase ? "MODIFIES SQL DATA" : "modifies sql data"); + } + + SQLName authid = x.getAuthid(); + if (authid != null) { + println(); + print(ucase ? "SQL SECURITY " : "sql security "); + authid.accept(this); + } + + println(); + x.getBlock().setParent(x); + x.getBlock().accept(this); + return false; + } + @Override public boolean visit(SQLCreateFunctionStatement x) { print0(ucase ? "CREATE FUNCTION " : "create function "); diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index 86eae3b3fc..ecd123b849 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -103,6 +103,8 @@ public class SQLStatementParser extends SQLParser { case EOF: case END: case UNTIL: + case ELSE: + case WHEN: if (lexer.isKeepComments() && lexer.hasComment() && statementList.size() > 0) { SQLStatement stmt = statementList.get(statementList.size() - 1); stmt.addAfterComment(lexer.readAndResetComments()); @@ -289,6 +291,12 @@ public class SQLStatementParser extends SQLParser { statementList.add(stmt); continue; } + case LEAVE: { + SQLStatement stmt = parseLeave(); + stmt.setParent(parent); + statementList.add(stmt); + continue; + } default: break; } @@ -435,6 +443,10 @@ public class SQLStatementParser extends SQLParser { throw new ParserException("not supported. " + lexer.info()); } + public SQLStatement parseLeave() { + throw new ParserException("not supported. " + lexer.info()); + } + public SQLStatement parseReturn() { if (lexer.token() == Token.RETURN || identifierEquals("RETURN")) { diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java index e66f0dd2f7..45fc94a138 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -574,12 +574,16 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } if (expr instanceof SQLIdentifierExpr) { + SQLIdentifierExpr identifierExpr = (SQLIdentifierExpr) expr; + if (isParam(identifierExpr)) { + return null; + } Column attrColumn = (Column) expr.getAttribute(ATTR_COLUMN); if (attrColumn != null) { return attrColumn; } - String column = ((SQLIdentifierExpr) expr).getName(); + String column = identifierExpr.getName(); String table = getCurrentTable(); if (table != null && aliasMap.containsKey(table)) { table = aliasMap.get(table); @@ -715,12 +719,18 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { return false; } - if (x.getInto() != null && x.getInto().getExpr() instanceof SQLName) { - SQLName into = (SQLName) x.getInto().getExpr(); - String ident = into.toString(); - TableStat stat = getTableStat(ident); - if (stat != null) { - stat.incrementInsertCount(); + SQLExprTableSource into = x.getInto(); + if (into != null && into.getExpr() instanceof SQLName) { + SQLName intoExpr = (SQLName) into.getExpr(); + + boolean isParam = intoExpr instanceof SQLIdentifierExpr && isParam((SQLIdentifierExpr) intoExpr); + + if (!isParam) { + String ident = intoExpr.toString(); + TableStat stat = getTableStat(ident); + if (stat != null) { + stat.incrementInsertCount(); + } } } @@ -761,6 +771,36 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { return true; } + public static boolean isParam(SQLIdentifierExpr x) { + if (x.isParameter() != null) { + return x.isParameter(); + } + + for (SQLObject parent = x.getParent(); parent != null; parent = parent.getParent()) { + if (parent instanceof SQLCreateProcedureStatement) { + SQLCreateProcedureStatement stmt = (SQLCreateProcedureStatement) parent; + for (SQLParameter parameter : stmt.getParameters()) { + if (x.equals(parameter.getName())) { + x.setParameter(true); + return true; + } + } + break; + } + + if (parent instanceof SQLBlockStatement) { + SQLBlockStatement stmt = (SQLBlockStatement) parent; + for (SQLParameter parameter : stmt.getParameters()) { + if (x.equals(parameter.getName())) { + x.setParameter(true); + return true; + } + } + } + } + return false; + } + public void endVisit(SQLSelectQueryBlock x) { String originalTable = (String) x.getAttribute("_old_local_"); x.putAttribute("table", getCurrentTable()); @@ -945,6 +985,10 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { } public boolean visit(SQLIdentifierExpr x) { + if (isParam(x)) { + return false; + } + String currentTable = getCurrentTable(); if (containsSubQuery(currentTable)) { @@ -1208,7 +1252,12 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { public boolean visit(SQLExprTableSource x) { if (isSimpleExprTableSource(x)) { - String ident = x.getExpr().toString(); + SQLExpr expr = x.getExpr(); + if (expr instanceof SQLIdentifierExpr && isParam((SQLIdentifierExpr) expr)) { + return false; + } + + String ident = expr.toString(); if (variants.containsKey(ident)) { return false; diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest13.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest13.java new file mode 100644 index 0000000000..7b9523a709 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest13.java @@ -0,0 +1,61 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.mysql.create; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.visitor.SchemaStatVisitor; +import com.alibaba.druid.util.JdbcConstants; +import org.apache.ibatis.jdbc.SQL; + +import java.util.List; + +public class MySqlCreateProcedureTest13 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "create procedure foo(param1 int unsigned) contains sql begin select param1; end"; + + List statementList = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL); + SQLStatement stmt = statementList.get(0); +// print(statementList); + assertEquals(1, statementList.size()); + + System.out.println(SQLUtils.toMySqlString(stmt)); + + assertEquals("CREATE PROCEDURE foo (\n" + + "\tparam1 int UNSIGNED\n" + + ")\n" + + "CONTAINS SQL\n" + + "BEGIN\n" + + "\tSELECT param1;\n" + + "END", SQLUtils.toMySqlString(stmt)); + + SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.MYSQL); + 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()); + + assertEquals(0, visitor.getTables().size()); + assertEquals(0, visitor.getColumns().size()); + assertEquals(0, visitor.getConditions().size()); + } + + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest14.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest14.java new file mode 100644 index 0000000000..0d22f0fdb2 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest14.java @@ -0,0 +1,63 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.mysql.create; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.visitor.SchemaStatVisitor; +import com.alibaba.druid.util.JdbcConstants; + +import java.util.List; + +public class MySqlCreateProcedureTest14 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "CREATE DEFINER = 'admin'@'localhost' PROCEDURE account_count()\n" + + "SQL SECURITY INVOKER\n" + + "BEGIN\n" + + " SELECT 'Number of accounts:', COUNT(*) FROM mysql.user;\n" + + "END;"; + + List statementList = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL); + SQLStatement stmt = statementList.get(0); +// print(statementList); + assertEquals(1, statementList.size()); + + System.out.println(SQLUtils.toMySqlString(stmt)); + + assertEquals("CREATE PROCEDURE account_count ()\n" + + "SQL SECURITY INVOKER\n" + + "BEGIN\n" + + "\tSELECT 'Number of accounts:', COUNT(*)\n" + + "\tFROM mysql.user;\n" + + "END;", SQLUtils.toMySqlString(stmt)); + + SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.MYSQL); + 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()); + + assertEquals(1, visitor.getTables().size()); + assertEquals(0, visitor.getColumns().size()); + assertEquals(0, visitor.getConditions().size()); + } + + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest8.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest8.java index 6ac6b66db8..2256dead92 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest8.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest8.java @@ -16,9 +16,12 @@ package com.alibaba.druid.bvt.sql.mysql.create; 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.sql.visitor.SchemaStatVisitor; +import com.alibaba.druid.util.JdbcConstants; import org.junit.Assert; import java.util.List; @@ -55,24 +58,24 @@ public class MySqlCreateProcedureTest8 extends MysqlTest { +" close cur_test;" +" end if;" +" end;"; - - MySqlStatementParser parser=new MySqlStatementParser(sql); - List statementList = parser.parseStatementList(); - SQLStatement statemen = statementList.get(0); + + List statementList = SQLUtils.parseStatements(sql, JdbcConstants.MYSQL); + SQLStatement stmt = statementList.get(0); + System.out.println(SQLUtils.toSQLString(stmt, JdbcConstants.MYSQL)); // print(statementList); - Assert.assertEquals(1, statementList.size()); + assertEquals(1, statementList.size()); - MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); - statemen.accept(visitor); + SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.MYSQL); + stmt.accept(visitor); -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); - Assert.assertEquals(1, visitor.getTables().size()); - Assert.assertEquals(3, visitor.getColumns().size()); - Assert.assertEquals(0, visitor.getConditions().size()); + assertEquals(2, visitor.getTables().size()); + assertEquals(5, visitor.getColumns().size()); + assertEquals(1, visitor.getConditions().size()); } public void test_1() throws Exception { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest9.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest9.java index ea38bf24cc..412b4e50cb 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest9.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/create/MySqlCreateProcedureTest9.java @@ -16,9 +16,11 @@ package com.alibaba.druid.bvt.sql.mysql.create; 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.util.JdbcConstants; import org.junit.Assert; import java.util.List; @@ -106,20 +108,20 @@ public class MySqlCreateProcedureTest9 extends MysqlTest { MySqlStatementParser parser=new MySqlStatementParser(sql); List statementList = parser.parseStatementList(); SQLStatement statemen = statementList.get(0); -// print(statementList); - Assert.assertEquals(1, statementList.size()); + System.out.println(SQLUtils.toSQLString(statementList, JdbcConstants.MYSQL)); + Assert.assertEquals(1, statementList.size()); MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); statemen.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()); + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); - Assert.assertEquals(1, visitor.getTables().size()); - Assert.assertEquals(3, visitor.getColumns().size()); - Assert.assertEquals(0, visitor.getConditions().size()); + Assert.assertEquals(2, visitor.getTables().size()); + Assert.assertEquals(5, visitor.getColumns().size()); + Assert.assertEquals(1, visitor.getConditions().size()); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest13.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest13.java index 6548a02e98..ebd796e1a4 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest13.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest13.java @@ -80,8 +80,8 @@ public class OracleBlockTest13 extends OracleTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("emp_name"))); Assert.assertEquals(7, visitor.getColumns().size()); - Assert.assertEquals(3, visitor.getConditions().size()); - Assert.assertEquals(1, visitor.getRelationships().size()); + Assert.assertEquals(2, visitor.getConditions().size()); + Assert.assertEquals(0, visitor.getRelationships().size()); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest14.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest14.java index c3a6b2ffa6..da2427afb1 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest14.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest14.java @@ -81,8 +81,8 @@ public class OracleBlockTest14 extends OracleTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("emp_name"))); Assert.assertEquals(7, visitor.getColumns().size()); - Assert.assertEquals(3, visitor.getConditions().size()); - Assert.assertEquals(1, visitor.getRelationships().size()); + Assert.assertEquals(2, visitor.getConditions().size()); + Assert.assertEquals(0, visitor.getRelationships().size()); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest15.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest15.java index 0dce534daa..6a7db87841 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest15.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest15.java @@ -81,8 +81,8 @@ public class OracleBlockTest15 extends OracleTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); Assert.assertEquals(2, visitor.getColumns().size()); - Assert.assertEquals(2, visitor.getConditions().size()); - Assert.assertEquals(1, visitor.getRelationships().size()); + Assert.assertEquals(1, visitor.getConditions().size()); + Assert.assertEquals(0, visitor.getRelationships().size()); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest18.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest18.java index e258c13577..b3b9d5f1e8 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest18.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest18.java @@ -89,9 +89,9 @@ public class OracleBlockTest18 extends OracleTest { assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); - assertEquals(5, visitor.getColumns().size()); - assertEquals(2, visitor.getConditions().size()); - assertEquals(1, visitor.getRelationships().size()); + assertEquals(2, visitor.getColumns().size()); + assertEquals(1, visitor.getConditions().size()); + assertEquals(0, visitor.getRelationships().size()); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest7.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest7.java index 7e901e71ae..4d8e9934a3 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest7.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/block/OracleBlockTest7.java @@ -77,7 +77,7 @@ public class OracleBlockTest7 extends OracleTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees_temp"))); Assert.assertEquals(6, visitor.getColumns().size()); - Assert.assertEquals(2, visitor.getConditions().size()); + Assert.assertEquals(1, visitor.getConditions().size()); Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id"))); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateProcedureTest1.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateProcedureTest1.java index e785245537..91d757a30b 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateProcedureTest1.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateProcedureTest1.java @@ -71,8 +71,8 @@ public class OracleCreateProcedureTest1 extends OracleTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("dept_temp"))); // Assert.assertEquals(7, visitor.getColumns().size()); - Assert.assertEquals(2, visitor.getConditions().size()); - Assert.assertEquals(1, visitor.getRelationships().size()); + Assert.assertEquals(1, visitor.getConditions().size()); + Assert.assertEquals(0, visitor.getRelationships().size()); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateProcedureTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateProcedureTest2.java index 38ce0531ce..24133425c1 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateProcedureTest2.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateProcedureTest2.java @@ -66,9 +66,9 @@ public class OracleCreateProcedureTest2 extends OracleTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("accounts"))); - Assert.assertEquals(5, visitor.getColumns().size()); - Assert.assertEquals(3, visitor.getConditions().size()); - Assert.assertEquals(2, visitor.getRelationships().size()); + Assert.assertEquals(3, visitor.getColumns().size()); + Assert.assertEquals(1, visitor.getConditions().size()); + Assert.assertEquals(0, visitor.getRelationships().size()); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); }