diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDeleteStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDeleteStatement.java index 85d0511ac6..d1cf31c9b3 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDeleteStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlDeleteStatement.java @@ -19,6 +19,7 @@ import java.util.ArrayList; import java.util.List; import com.alibaba.druid.sql.ast.SQLCommentHint; +import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLOrderBy; import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement; import com.alibaba.druid.sql.ast.statement.SQLTableSource; @@ -30,14 +31,15 @@ import com.alibaba.druid.util.JdbcConstants; public class MySqlDeleteStatement extends SQLDeleteStatement { - private boolean lowPriority = false; - private boolean quick = false; - private boolean ignore = false; - + private boolean lowPriority = false; + private boolean quick = false; + private boolean ignore = false; private SQLOrderBy orderBy; - private SQLLimit limit; - + private SQLLimit limit; private List hints; + // for petadata + private boolean forceAllPartitions = false; + private SQLName forcePartition; public MySqlDeleteStatement(){ super(JdbcConstants.MYSQL); @@ -137,14 +139,33 @@ public class MySqlDeleteStatement extends SQLDeleteStatement { protected void accept0(MySqlASTVisitor visitor) { if (visitor.visit(this)) { - acceptChild(visitor, getTableSource()); - acceptChild(visitor, getWhere()); - acceptChild(visitor, getFrom()); - acceptChild(visitor, getUsing()); + acceptChild(visitor, tableSource); + acceptChild(visitor, where); + acceptChild(visitor, from); + acceptChild(visitor, using); acceptChild(visitor, orderBy); acceptChild(visitor, limit); } visitor.endVisit(this); } + + public boolean isForceAllPartitions() { + return forceAllPartitions; + } + + public void setForceAllPartitions(boolean forceAllPartitions) { + this.forceAllPartitions = forceAllPartitions; + } + + public SQLName getForcePartition() { + return forcePartition; + } + + public void setForcePartition(SQLName x) { + if (x != null) { + x.setParent(this); + } + this.forcePartition = x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSelectQueryBlock.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSelectQueryBlock.java index f632f29e0f..286c03b11a 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSelectQueryBlock.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSelectQueryBlock.java @@ -40,6 +40,7 @@ public class MySqlSelectQueryBlock extends SQLSelectQueryBlock implements MySqlO private List procedureArgumentList; private boolean lockInShareMode; private List hints; + private SQLName forcePartition; // for petadata public MySqlSelectQueryBlock(){ dbType = JdbcConstants.MYSQL; @@ -241,6 +242,7 @@ public class MySqlSelectQueryBlock extends SQLSelectQueryBlock implements MySqlO public void accept0(MySqlASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, this.selectList); + acceptChild(visitor, this.forcePartition); acceptChild(visitor, this.from); acceptChild(visitor, this.where); acceptChild(visitor, this.groupBy); @@ -254,6 +256,17 @@ public class MySqlSelectQueryBlock extends SQLSelectQueryBlock implements MySqlO visitor.endVisit(this); } + public SQLName getForcePartition() { + return forcePartition; + } + + public void setForcePartition(SQLName x) { + if (x != null) { + x.setParent(this); + } + this.forcePartition = x; + } + public String toString() { return SQLUtils.toMySqlString(this); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowDatabasePartitionStatusStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowDatabasePartitionStatusStatement.java new file mode 100644 index 0000000000..07b0272d77 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowDatabasePartitionStatusStatement.java @@ -0,0 +1,40 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.sql.dialect.mysql.ast.statement; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; + +public class MySqlShowDatabasePartitionStatusStatement extends MySqlStatementImpl implements MySqlShowStatement { + + private SQLName database; + + public SQLName getDatabase() { + return database; + } + + public void setDatabase(SQLName database) { + this.database = database; + } + + public void accept0(MySqlASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, database); + } + visitor.endVisit(this); + } +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlUpdateStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlUpdateStatement.java index 1a2cc452f6..92569c1ff1 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlUpdateStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlUpdateStatement.java @@ -16,6 +16,7 @@ package com.alibaba.druid.sql.dialect.mysql.ast.statement; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLOrderBy; import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; import com.alibaba.druid.sql.ast.SQLLimit; @@ -26,13 +27,17 @@ import com.alibaba.druid.util.JdbcConstants; public class MySqlUpdateStatement extends SQLUpdateStatement implements MySqlStatement { private SQLLimit limit; - private boolean lowPriority = false; - private boolean ignore = false; - private boolean commitOnSuccess = false; - private boolean rollBackOnFail = false; - private boolean queryOnPk = false; + private boolean lowPriority = false; + private boolean ignore = false; + private boolean commitOnSuccess = false; + private boolean rollBackOnFail = false; + private boolean queryOnPk = false; private SQLExpr targetAffectRow; + // for petadata + private boolean forceAllPartitions = false; + private SQLName forcePartition; + public MySqlUpdateStatement(){ super(JdbcConstants.MYSQL); } @@ -119,5 +124,22 @@ public class MySqlUpdateStatement extends SQLUpdateStatement implements MySqlSta this.targetAffectRow = targetAffectRow; } + public boolean isForceAllPartitions() { + return forceAllPartitions; + } + public void setForceAllPartitions(boolean forceAllPartitions) { + this.forceAllPartitions = forceAllPartitions; + } + + public SQLName getForcePartition() { + return forcePartition; + } + + public void setForcePartition(SQLName x) { + if (x != null) { + x.setParent(this); + } + this.forcePartition = x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectParser.java index 023bfb134a..b6c3037a4e 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlSelectParser.java @@ -160,6 +160,13 @@ public class MySqlSelectParser extends SQLSelectParser { } parseSelectList(queryBlock); + + if (lexer.identifierEquals(FnvHash.Constants.FORCE)) { + lexer.nextToken(); + accept(Token.PARTITION); + SQLName partition = this.exprParser.name(); + queryBlock.setForcePartition(partition); + } parseInto(queryBlock); } @@ -297,6 +304,25 @@ public class MySqlSelectParser extends SQLSelectParser { update.setTargetAffectRow(targetAffectRow); } + if (lexer.identifierEquals(FnvHash.Constants.FORCE)) { + lexer.nextToken(); + + if (lexer.token() == Token.ALL) { + lexer.nextToken(); + acceptIdentifier("PARTITIONS"); + update.setForceAllPartitions(true); + } else if (lexer.identifierEquals(FnvHash.Constants.PARTITIONS)){ + lexer.nextToken(); + update.setForceAllPartitions(true); + } else if (lexer.token() == Token.PARTITION) { + lexer.nextToken(); + SQLName partition = this.exprParser.name(); + update.setForcePartition(partition); + } else { + throw new ParserException("TODO. " + lexer.info()); + } + } + SQLSelectParser selectParser = this.exprParser.createSelectParser(); SQLTableSource updateTableSource = selectParser.parseTableSource(); update.setTableSource(updateTableSource); 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 69b833522b..0982ddb9e3 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 @@ -157,6 +157,26 @@ public class MySqlStatementParser extends SQLStatementParser { lexer.nextToken(); } + if (lexer.identifierEquals(FnvHash.Constants.FORCE)) { + Lexer.SavePoint savePoint = lexer.mark(); + lexer.nextToken(); + + if (lexer.token() == Token.ALL) { + lexer.nextToken(); + acceptIdentifier("PARTITIONS"); + deleteStatement.setForceAllPartitions(true); + } else if (lexer.identifierEquals(FnvHash.Constants.PARTITIONS)){ + lexer.nextToken(); + deleteStatement.setForceAllPartitions(true); + } else if (lexer.token() == Token.PARTITION) { + lexer.nextToken(); + SQLName partition = this.exprParser.name(); + deleteStatement.setForcePartition(partition); + } else { + lexer.reset(savePoint); + } + } + if (lexer.token() == Token.IDENTIFIER) { deleteStatement.setTableSource(createSQLSelectParser().parseTableSource()); @@ -1740,6 +1760,16 @@ public class MySqlStatementParser extends SQLStatementParser { return stmt; } + if (lexer.token() == Token.DATABASE) { + lexer.nextToken(); + accept(Token.PARTITION); + acceptIdentifier("STATUS"); + accept(Token.FOR); + MySqlShowDatabasePartitionStatusStatement stmt = new MySqlShowDatabasePartitionStatusStatement(); + stmt.setDatabase(this.exprParser.name()); + return stmt; + } + if (lexer.identifierEquals("TRIGGERS")) { lexer.nextToken(); MySqlShowTriggersStatement stmt = new MySqlShowTriggersStatement(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java index 3790067a52..64e2300300 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java @@ -491,4 +491,7 @@ public interface MySqlASTVisitor extends SQLASTVisitor { boolean visit(MySqlAlterTablespaceStatement x); void endVisit(MySqlAlterTablespaceStatement x); + boolean visit(MySqlShowDatabasePartitionStatusStatement x); + void endVisit(MySqlShowDatabasePartitionStatusStatement x); + } // diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java index 937af1ad3b..f0df625fc6 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java @@ -1218,4 +1218,14 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements MySq } + @Override + public boolean visit(MySqlShowDatabasePartitionStatusStatement x) { + return true; + } + + @Override + public void endVisit(MySqlShowDatabasePartitionStatusStatement x) { + + } + } // 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 b72f02812d..873d12a7f7 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 @@ -173,6 +173,13 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV printSelectList(x.getSelectList()); + SQLName forcePartition = x.getForcePartition(); + if (forcePartition != null) { + println(); + print0(ucase ? "FORCE PARTITION " : "force partition "); + printExpr(forcePartition); + } + SQLExprTableSource into = x.getInto(); if (into != null) { println(); @@ -782,6 +789,17 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV print0(ucase ? "IGNORE " : "ignore "); } + if (x.isForceAllPartitions()) { + print0(ucase ? "FORCE ALL PARTITIONS " : "force all partitions "); + } else { + SQLName partition = x.getForcePartition(); + if (partition != null) { + print0(ucase ? "FORCE PARTITION " : "force partition "); + printExpr(partition); + print(' '); + } + } + SQLTableSource from = x.getFrom(); if (from == null) { print0(ucase ? "FROM " : "from "); @@ -1593,6 +1611,17 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV print(' '); } + if (x.isForceAllPartitions()) { + print0(ucase ? "FORCE ALL PARTITIONS " : "force all partitions "); + } else { + SQLName partition = x.getForcePartition(); + if (partition != null) { + print0(ucase ? "FORCE PARTITION " : "force partition "); + printExpr(partition); + print(' '); + } + } + printTableSource(x.getTableSource()); println(); @@ -4037,6 +4066,18 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } + @Override + public boolean visit(MySqlShowDatabasePartitionStatusStatement x) { + print0(ucase ? "SHOW DATABASE PARTITION STATUS FOR " : "show database partition status for "); + x.getDatabase().accept(this); + return false; + } + + @Override + public void endVisit(MySqlShowDatabasePartitionStatusStatement x) { + + } + protected void printQuery(SQLSelectQuery x) { Class clazz = x.getClass(); if (clazz == MySqlSelectQueryBlock.class) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java index 7fe6dd2701..35acce2ef2 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java @@ -1344,4 +1344,14 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS public void endVisit(MySqlAlterTablespaceStatement x) { } + + @Override + public boolean visit(MySqlShowDatabasePartitionStatusStatement x) { + return false; + } + + @Override + public void endVisit(MySqlShowDatabasePartitionStatusStatement x) { + + } } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index 6c0981bf74..bf8ba688f2 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -2992,8 +2992,24 @@ public class SQLExprParser extends SQLParser { if ((token == Token.IDENTIFIER && hash_lower != FnvHash.Constants.CURRENT) || token == Token.MODEL) { - String as = lexer.stringVal(); - lexer.nextTokenComma(); + String as; + if (lexer.hash_lower == FnvHash.Constants.FORCE && JdbcConstants.MYSQL.equals(dbType)) { + String force = lexer.stringVal(); + + Lexer.SavePoint savePoint = lexer.mark(); + lexer.nextToken(); + + if (lexer.token == Token.PARTITION) { + lexer.reset(savePoint); + as = null; + } else { + as = force; + lexer.nextTokenComma(); + } + } else { + as = lexer.stringVal(); + lexer.nextTokenComma(); + } return new SQLSelectItem(expr, as, connectByRoot); } diff --git a/src/main/java/com/alibaba/druid/util/FnvHash.java b/src/main/java/com/alibaba/druid/util/FnvHash.java index 12689694a8..c45ab1a045 100644 --- a/src/main/java/com/alibaba/druid/util/FnvHash.java +++ b/src/main/java/com/alibaba/druid/util/FnvHash.java @@ -614,5 +614,6 @@ public final class FnvHash { long CLUSTERED = fnv1a_64_lower("CLUSTERED"); long SORTED = fnv1a_64_lower("SORTED"); long LIFECYCLE = fnv1a_64_lower("LIFECYCLE"); + long PARTITIONS = fnv1a_64_lower("PARTITIONS"); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_4_force_partition.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_4_force_partition.java new file mode 100644 index 0000000000..60c71fe2cb --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_4_force_partition.java @@ -0,0 +1,65 @@ +/* + * 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; + +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; +import org.junit.Assert; + +import java.util.List; + +public class MySqlDeleteTest_4_force_partition extends MysqlTest { + + public void test_0() throws Exception { + String sql = "DELETE force all partitions car_tt FROM runoob_tbl WHERE runoob_id=3;"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + + Assert.assertEquals("DELETE FORCE ALL PARTITIONS car_tt\n" + + "FROM runoob_tbl\n" + + "WHERE runoob_id = 3;", SQLUtils.toMySqlString(stmt)); + Assert.assertEquals("delete force all partitions car_tt\n" + + "from runoob_tbl\n" + + "where runoob_id = 3;", SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); + + Assert.assertEquals(1, statementList.size()); + + System.out.println(stmt.toString()); + + 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()); + + Assert.assertEquals(2, visitor.getTables().size()); + Assert.assertEquals(1, visitor.getColumns().size()); + Assert.assertEquals(1, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("runoob_tbl"))); + + Assert.assertTrue(visitor.getColumns().contains(new Column("car_tt", "runoob_id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_5_force_partition.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_5_force_partition.java new file mode 100644 index 0000000000..07aa34cbf3 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_5_force_partition.java @@ -0,0 +1,65 @@ +/* + * 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; + +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; +import org.junit.Assert; + +import java.util.List; + +public class MySqlDeleteTest_5_force_partition extends MysqlTest { + + public void test_0() throws Exception { + String sql = "DELETE force partition 'pt001' car_tt FROM runoob_tbl WHERE runoob_id=3;"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + + Assert.assertEquals("DELETE FORCE PARTITION 'pt001' car_tt\n" + + "FROM runoob_tbl\n" + + "WHERE runoob_id = 3;", SQLUtils.toMySqlString(stmt)); + Assert.assertEquals("delete force partition 'pt001' car_tt\n" + + "from runoob_tbl\n" + + "where runoob_id = 3;", SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); + + Assert.assertEquals(1, statementList.size()); + + System.out.println(stmt.toString()); + + 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()); + + Assert.assertEquals(2, visitor.getTables().size()); + Assert.assertEquals(1, visitor.getColumns().size()); + Assert.assertEquals(1, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("runoob_tbl"))); + + Assert.assertTrue(visitor.getColumns().contains(new Column("car_tt", "runoob_id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlShowTest_7.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlShowTest_7.java new file mode 100644 index 0000000000..551c9c8e56 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlShowTest_7.java @@ -0,0 +1,57 @@ +/* + * 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; + +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 org.junit.Assert; + +import java.util.List; + +public class MySqlShowTest_7 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "show database partition status for mydb"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List stmtList = parser.parseStatementList(); + SQLStatement stmt = stmtList.get(0); + + String result = SQLUtils.toMySqlString(stmt); + assertEquals("SHOW DATABASE PARTITION STATUS FOR mydb", result); +// print(stmtList); + + assertEquals(1, stmtList.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()); + + assertEquals(0, visitor.getTables().size()); + assertEquals(0, visitor.getColumns().size()); + assertEquals(0, visitor.getConditions().size()); + +// assertTrue(visitor.getTables().containsKey(new TableStat.Name("t_basic_store"))); + + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_82_force_partition.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_82_force_partition.java new file mode 100644 index 0000000000..328d97f7d0 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_82_force_partition.java @@ -0,0 +1,105 @@ +/* + * 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.select; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.parser.SQLParserFeature; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.parser.SQLStatementParser; +import com.alibaba.druid.sql.visitor.SchemaStatVisitor; +import com.alibaba.druid.util.JdbcConstants; + +import java.util.List; + +public class MySqlSelectTest_82_force_partition extends MysqlTest { + + public void test_0() throws Exception { + String sql = "select\n" + + " app_key,device_id,brand \n" + + " \n" + + " force partition 'MASSDEVICE40'\n" + + " \n" + + " from ktvs_device_info\n" + + " \n" + + " \n" + + " \n" + + " WHERE ( app_key = ?\n" + + " \n" + + " \n" + + " \n" + + " and package_name = ?\n" + + " \n" + + " \n" + + " \n" + + " and app_version in\n" + + " (\n" + + " ?\n" + + " ) ) \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " order by gmt_modified desc"; + + System.out.println(sql); + + SQLStatementParser parser = SQLParserUtils.createSQLStatementParser(sql, JdbcConstants.MYSQL, SQLParserFeature.OptimizedForParameterized); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + + assertEquals(1, statementList.size()); + + SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.MYSQL); + stmt.accept(visitor); + { + String output = SQLUtils.toMySqlString(stmt); + assertEquals("SELECT app_key, device_id, brand\n" + + "FORCE PARTITION 'MASSDEVICE40'\n" + + "FROM ktvs_device_info\n" + + "WHERE app_key = ?\n" + + "\tAND package_name = ?\n" + + "\tAND app_version IN (?)\n" + + "ORDER BY gmt_modified DESC", // + output); + } + { + String output = SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); + assertEquals("select app_key, device_id, brand\n" + + "force partition 'MASSDEVICE40'\n" + + "from ktvs_device_info\n" + + "where app_key = ?\n" + + "\tand package_name = ?\n" + + "\tand app_version in (?)\n" + + "order by gmt_modified desc", // + output); + } + + { + String output = SQLUtils.toMySqlString(stmt, new SQLUtils.FormatOption(true, true, true)); + assertEquals("SELECT app_key, device_id, brand\n" + + "FORCE PARTITION 'MASSDEVICE40'\n" + + "FROM ktvs_device_info\n" + + "WHERE app_key = ?\n" + + "\tAND package_name = ?\n" + + "\tAND app_version IN (?)\n" + + "ORDER BY gmt_modified DESC", // + output); + } + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/update/MySqlUpdateTest_13_force_partition.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/update/MySqlUpdateTest_13_force_partition.java new file mode 100644 index 0000000000..23004ccf4f --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/update/MySqlUpdateTest_13_force_partition.java @@ -0,0 +1,75 @@ +/* + * 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.update; + +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.Column; +import com.alibaba.druid.wall.WallUtils; +import org.junit.Assert; + +import java.util.List; + +public class MySqlUpdateTest_13_force_partition extends MysqlTest { + + public void test_0() throws Exception { + String sql = "UPDATE force all partitions car_tt set gps_url=null WHERE id = ?"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List 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()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(2, visitor.getColumns().size()); + // Assert.assertEquals(2, visitor.getConditions().size()); + + Assert.assertTrue(visitor.containsTable("car_tt")); + + Assert.assertTrue(visitor.getColumns().contains(new Column("car_tt", "id"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("car_tt", "gps_url"))); + + { + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("UPDATE FORCE ALL PARTITIONS car_tt\n" + + "SET gps_url = NULL\n" + + "WHERE id = ?", // + output); + } + { + String output = SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); + Assert.assertEquals("update force all partitions car_tt\n" + + "set gps_url = null\n" + + "where id = ?", // + output); + } + + assertTrue(WallUtils.isValidateMySql(sql)); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/update/MySqlUpdateTest_14_force_partition.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/update/MySqlUpdateTest_14_force_partition.java new file mode 100644 index 0000000000..86dfb41087 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/update/MySqlUpdateTest_14_force_partition.java @@ -0,0 +1,75 @@ +/* + * 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.update; + +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.Column; +import com.alibaba.druid.wall.WallUtils; +import org.junit.Assert; + +import java.util.List; + +public class MySqlUpdateTest_14_force_partition extends MysqlTest { + + public void test_0() throws Exception { + String sql = "UPDATE force partition 'pt001' car_tt set gps_url=null WHERE id = ?"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + List 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()); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(2, visitor.getColumns().size()); + // Assert.assertEquals(2, visitor.getConditions().size()); + + Assert.assertTrue(visitor.containsTable("car_tt")); + + Assert.assertTrue(visitor.getColumns().contains(new Column("car_tt", "id"))); + Assert.assertTrue(visitor.getColumns().contains(new Column("car_tt", "gps_url"))); + + { + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("UPDATE FORCE PARTITION 'pt001' car_tt\n" + + "SET gps_url = NULL\n" + + "WHERE id = ?", // + output); + } + { + String output = SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); + Assert.assertEquals("update force partition 'pt001' car_tt\n" + + "set gps_url = null\n" + + "where id = ?", // + output); + } + + assertTrue(WallUtils.isValidateMySql(sql)); + } +}