From 229d548abce52787d39c221e19c21560f8b57193 Mon Sep 17 00:00:00 2001 From: wenshao Date: Sun, 28 Apr 2013 22:54:07 +0800 Subject: [PATCH] improve mysql ddl parser --- .../ast/statement/MySqlPartitionByHash.java | 8 +- .../ast/statement/MySqlPartitionByKey.java | 5 +- .../ast/statement/MySqlPartitionByRange.java | 73 +++++++++++++++ .../statement/MySqlPartitioningClause.java | 22 +++++ .../ast/statement/MySqlPartitioningDef.java | 75 +++++++++++++++ .../mysql/parser/MySqlCreateTableParser.java | 93 +++++++++++++++++-- .../mysql/visitor/MySqlASTVisitor.java | 20 +++- .../mysql/visitor/MySqlASTVisitorAdapter.java | 44 +++++++++ .../mysql/visitor/MySqlOutputVisitor.java | 84 +++++++++++++++++ .../mysql/visitor/MySqlSchemaStatVisitor.java | 44 +++++++++ .../bvt/sql/mysql/MySqlCreateTableTest42.java | 76 +++++++++++++++ 11 files changed, 525 insertions(+), 19 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitionByRange.java create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitioningClause.java create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitioningDef.java create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest42.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitionByHash.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitionByHash.java index 07dfa112ad..6823c77dcb 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitionByHash.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitionByHash.java @@ -15,15 +15,10 @@ */ package com.alibaba.druid.sql.dialect.mysql.ast.statement; -import java.util.List; - import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLName; -import com.alibaba.druid.sql.ast.SQLPartitioningClause; -import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; -public class MySqlPartitionByHash extends MySqlObjectImpl implements SQLPartitioningClause { +public class MySqlPartitionByHash extends MySqlPartitioningClause { private static final long serialVersionUID = 1L; @@ -38,6 +33,7 @@ public class MySqlPartitionByHash extends MySqlObjectImpl implements SQLPartitio if (visitor.visit(this)) { acceptChild(visitor, expr); acceptChild(visitor, partitionCount); + acceptChild(visitor, getPartitions()); } visitor.endVisit(this); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitionByKey.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitionByKey.java index 338dd5ba88..257ae1382e 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitionByKey.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitionByKey.java @@ -20,11 +20,9 @@ import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; -import com.alibaba.druid.sql.ast.SQLPartitioningClause; -import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; -public class MySqlPartitionByKey extends MySqlObjectImpl implements SQLPartitioningClause { +public class MySqlPartitionByKey extends MySqlPartitioningClause { private static final long serialVersionUID = 1L; @@ -39,6 +37,7 @@ public class MySqlPartitionByKey extends MySqlObjectImpl implements SQLPartition if (visitor.visit(this)) { acceptChild(visitor, columns); acceptChild(visitor, partitionCount); + acceptChild(visitor, getPartitions()); } visitor.endVisit(this); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitionByRange.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitionByRange.java new file mode 100644 index 0000000000..134a36b6d1 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitionByRange.java @@ -0,0 +1,73 @@ +/* + * Copyright 1999-2011 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 java.util.ArrayList; +import java.util.List; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; + +public class MySqlPartitionByRange extends MySqlPartitioningClause { + + private static final long serialVersionUID = 1L; + + private SQLExpr expr; + + private List columns = new ArrayList(); + + private SQLExpr partitionCount; + + @Override + public void accept0(MySqlASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, expr); + acceptChild(visitor, columns); + acceptChild(visitor, partitionCount); + acceptChild(visitor, getPartitions()); + } + visitor.endVisit(this); + } + + public SQLExpr getExpr() { + return expr; + } + + public void setExpr(SQLExpr expr) { + if (expr != null) { + expr.setParent(this); + } + this.expr = expr; + } + + public SQLExpr getPartitionCount() { + return partitionCount; + } + + public void setPartitionCount(SQLExpr partitionCount) { + this.partitionCount = partitionCount; + } + + public List getColumns() { + return columns; + } + + public void setColumns(List columns) { + this.columns = columns; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitioningClause.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitioningClause.java new file mode 100644 index 0000000000..652a5710fc --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitioningClause.java @@ -0,0 +1,22 @@ +package com.alibaba.druid.sql.dialect.mysql.ast.statement; + +import java.util.ArrayList; +import java.util.List; + +import com.alibaba.druid.sql.ast.SQLPartitioningClause; +import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl; + +@SuppressWarnings("serial") +public abstract class MySqlPartitioningClause extends MySqlObjectImpl implements SQLPartitioningClause { + + private List partitions = new ArrayList(); + + public List getPartitions() { + return partitions; + } + + public void setPartitions(List partitions) { + this.partitions = partitions; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitioningDef.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitioningDef.java new file mode 100644 index 0000000000..75cf6ef78d --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitioningDef.java @@ -0,0 +1,75 @@ +package com.alibaba.druid.sql.dialect.mysql.ast.statement; + +import java.util.ArrayList; +import java.util.List; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; + +@SuppressWarnings("serial") +public class MySqlPartitioningDef extends MySqlObjectImpl { + + private SQLName name; + + private Values values; + + @Override + public void accept0(MySqlASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, name); + acceptChild(visitor, values); + } + visitor.endVisit(this); + } + + public Values getValues() { + return values; + } + + public void setValues(Values values) { + this.values = values; + } + + public SQLName getName() { + return name; + } + + public void setName(SQLName name) { + this.name = name; + } + + public static abstract class Values extends MySqlObjectImpl { + + private final List items = new ArrayList(); + + public List getItems() { + return items; + } + } + + public static class LessThanValues extends Values { + + @Override + public void accept0(MySqlASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, getItems()); + } + visitor.endVisit(this); + } + + } + + public static class InValues extends Values { + + @Override + public void accept0(MySqlASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, getItems()); + } + visitor.endVisit(this); + } + + } +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java index 3cb5452b45..a7a30a9f48 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java @@ -27,6 +27,9 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStateme import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement.TableSpaceOption; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByHash; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByKey; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByRange; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitioningClause; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitioningDef; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlTableIndex; import com.alibaba.druid.sql.parser.ParserException; import com.alibaba.druid.sql.parser.SQLCreateTableParser; @@ -314,17 +317,17 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { if (lexer.token() == Token.EQ) { lexer.nextToken(); } - + stmt.getTableOptions().put("STATS_AUTO_RECALC", this.exprParser.expr()); continue; } - + if (identifierEquals("STATS_PERSISTENT")) { lexer.nextToken(); if (lexer.token() == Token.EQ) { lexer.nextToken(); } - + stmt.getTableOptions().put("STATS_PERSISTENT", this.exprParser.expr()); continue; } @@ -356,6 +359,8 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { lexer.nextToken(); accept(Token.BY); + MySqlPartitioningClause partitionClause; + boolean linera = false; if (identifierEquals("LINEAR")) { lexer.nextToken(); @@ -365,11 +370,11 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { if (lexer.token() == Token.KEY) { MySqlPartitionByKey clause = new MySqlPartitionByKey(); lexer.nextToken(); - + if (linera) { clause.setLinear(true); } - + accept(Token.LPAREN); for (;;) { clause.getColumns().add(this.exprParser.name()); @@ -380,7 +385,8 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { break; } accept(Token.RPAREN); - stmt.setPartitioning(clause); + + partitionClause = clause; if (identifierEquals("PARTITIONS")) { lexer.nextToken(); @@ -389,23 +395,92 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { } else if (identifierEquals("HASH")) { lexer.nextToken(); MySqlPartitionByHash clause = new MySqlPartitionByHash(); - + if (linera) { clause.setLinear(true); } - + accept(Token.LPAREN); clause.setExpr(this.exprParser.expr()); accept(Token.RPAREN); - stmt.setPartitioning(clause); + partitionClause = clause; if (identifierEquals("PARTITIONS")) { lexer.nextToken(); clause.setPartitionCount(this.exprParser.expr()); } + + } else if (identifierEquals("RANGE")) { + lexer.nextToken(); + MySqlPartitionByRange clause = new MySqlPartitionByRange(); + + if (lexer.token() == Token.LPAREN) { + lexer.nextToken(); + clause.setExpr(this.exprParser.expr()); + accept(Token.RPAREN); + } else { + acceptIdentifier("COLUMNS"); + accept(Token.LPAREN); + for (;;) { + clause.getColumns().add(this.exprParser.name()); + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + break; + } + accept(Token.RPAREN); + } + partitionClause = clause; + + if (identifierEquals("PARTITIONS")) { + lexer.nextToken(); + clause.setPartitionCount(this.exprParser.expr()); + } + // } else { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } + + if (lexer.token() == Token.LPAREN) { + lexer.nextToken(); + for (;;) { + acceptIdentifier("PARTITION"); + + MySqlPartitioningDef partitionDef = new MySqlPartitioningDef(); + + partitionDef.setName(this.exprParser.name()); + + if (lexer.token() == Token.VALUES) { + lexer.nextToken(); + if (lexer.token() == Token.IN) { + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + } else { + acceptIdentifier("LESS"); + acceptIdentifier("THAN"); + + MySqlPartitioningDef.LessThanValues values = new MySqlPartitioningDef.LessThanValues(); + + accept(Token.LPAREN); + this.exprParser.exprList(values.getItems()); + accept(Token.RPAREN); + partitionDef.setValues(values); + } + } + + partitionClause.getPartitions().add(partitionDef); + + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } else { + break; + } + } + accept(Token.RPAREN); + } + + stmt.setPartitioning(partitionClause); } break; 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 68ff64f268..661f4f0d43 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 @@ -60,6 +60,8 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadXmlStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLockTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByHash; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByKey; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByRange; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitioningDef; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPrepareStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRenameTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlReplaceStatement; @@ -549,4 +551,20 @@ public interface MySqlASTVisitor extends SQLASTVisitor { boolean visit(MySqlPartitionByHash x); void endVisit(MySqlPartitionByHash x); -} // + + boolean visit(MySqlPartitionByRange x); + + void endVisit(MySqlPartitionByRange x); + + boolean visit(MySqlPartitioningDef x); + + void endVisit(MySqlPartitioningDef x); + + boolean visit(MySqlPartitioningDef.LessThanValues x); + + void endVisit(MySqlPartitioningDef.LessThanValues x); + + boolean visit(MySqlPartitioningDef.InValues x); + + void endVisit(MySqlPartitioningDef.InValues 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 408385db90..eb16148f28 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 @@ -62,6 +62,10 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadXmlStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLockTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByHash; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByKey; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByRange; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitioningDef; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitioningDef.InValues; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitioningDef.LessThanValues; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPrepareStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRenameTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlReplaceStatement; @@ -1215,4 +1219,44 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements public void endVisit(MySqlPartitionByHash x) { } + + @Override + public boolean visit(MySqlPartitionByRange x) { + return true; + } + + @Override + public void endVisit(MySqlPartitionByRange x) { + + } + + @Override + public boolean visit(MySqlPartitioningDef x) { + return true; + } + + @Override + public void endVisit(MySqlPartitioningDef x) { + + } + + @Override + public boolean visit(LessThanValues x) { + return true; + } + + @Override + public void endVisit(LessThanValues x) { + + } + + @Override + public boolean visit(InValues x) { + return true; + } + + @Override + public void endVisit(InValues 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 e7be50a415..f1487bd228 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 @@ -82,6 +82,9 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadXmlStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLockTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByHash; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByKey; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByRange; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitioningDef.InValues; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitioningDef.LessThanValues; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPrepareStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRenameTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlReplaceStatement; @@ -91,6 +94,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSQLColumnDefinitio import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectGroupBy; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitioningDef; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetCharSetStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetNamesStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetTransactionIsolationLevelStatement; @@ -1510,6 +1514,43 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } return false; } + + @Override + public void endVisit(MySqlPartitionByRange x) { + + } + + @Override + public boolean visit(MySqlPartitionByRange x) { + print("PARTITION BY RANGE ("); + printAndAccept(x.getColumns(), ", "); + print(")"); + + if (x.getPartitionCount() != null) { + print(" PARTITIONS "); + x.getPartitionCount().accept(this); + } + + List partitions = x.getPartitions(); + int partitionsSize = partitions.size(); + if (partitionsSize > 0) { + print("("); + incrementIndent(); + for (int i = 0; i < partitionsSize; ++i) { + println(); + partitions.get(i).accept(this); + if (i != partitionsSize - 1) { + print(", "); + } + } + decrementIndent(); + println(); + print(")"); + } + return false; + } + + //MySqlPartitionByRange @Override public void endVisit(MySqlPartitionByHash x) { @@ -1531,6 +1572,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV print(" PARTITIONS "); x.getPartitionCount().accept(this); } + return false; } @@ -2905,4 +2947,46 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV public void endVisit(TableSpaceOption x) { } + + @Override + public boolean visit(MySqlPartitioningDef x) { + print("PARTITION "); + x.getName().accept(this); + if (x.getValues() != null) { + print(' '); + x.getValues().accept(this); + } + return false; + } + + @Override + public void endVisit(MySqlPartitioningDef x) { + + } + + @Override + public boolean visit(LessThanValues x) { + print("VALUES LESS THAN ("); + printAndAccept(x.getItems(), ", "); + print(')'); + return false; + } + + @Override + public void endVisit(LessThanValues x) { + + } + + @Override + public boolean visit(InValues x) { + print("VALUES IN ("); + printAndAccept(x.getItems(), ", "); + print(')'); + return false; + } + + @Override + public void endVisit(InValues x) { + + } } // 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 c7d9586141..3334963161 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 @@ -75,6 +75,10 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadXmlStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLockTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByHash; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByKey; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByRange; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitioningDef; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitioningDef.InValues; +import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitioningDef.LessThanValues; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPrepareStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRenameTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlReplaceStatement; @@ -1299,4 +1303,44 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS } + @Override + public boolean visit(MySqlPartitionByRange x) { + return false; + } + + @Override + public void endVisit(MySqlPartitionByRange x) { + + } + + @Override + public boolean visit(MySqlPartitioningDef x) { + return false; + } + + @Override + public void endVisit(MySqlPartitioningDef x) { + + } + + @Override + public boolean visit(LessThanValues x) { + return false; + } + + @Override + public void endVisit(LessThanValues x) { + + } + + @Override + public boolean visit(InValues x) { + return false; + } + + @Override + public void endVisit(InValues x) { + + } + } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest42.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest42.java new file mode 100644 index 0000000000..bb0d3b656f --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest42.java @@ -0,0 +1,76 @@ +/* + * Copyright 1999-2011 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; + +public class MySqlCreateTableTest42 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "CREATE TABLE rc (" + // + " a INT NOT NULL, " + // + " b INT NOT NULL" + // + ")" + // + "PARTITION BY RANGE COLUMNS(a,b) (" + // + " PARTITION p0 VALUES LESS THAN (10,5)," + // + " PARTITION p1 VALUES LESS THAN (20,10)," + // + " PARTITION p2 VALUES LESS THAN (MAXVALUE,15)," + // + " PARTITION p3 VALUES LESS THAN (MAXVALUE,MAXVALUE)" + // + ");"; // + + 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(0, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("rc"))); + + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("CREATE TABLE rc (" + // + "\n\ta INT NOT NULL, " + // + "\n\tb INT NOT NULL" + // + "\n) PARTITION BY RANGE (a, b)(" + // + "\n\tPARTITION p0 VALUES LESS THAN (10, 5), " + // + "\n\tPARTITION p1 VALUES LESS THAN (20, 10), " + // + "\n\tPARTITION p2 VALUES LESS THAN (MAXVALUE, 15), " + // + "\n\tPARTITION p3 VALUES LESS THAN (MAXVALUE, MAXVALUE)" + // + "\n)", output); + + } +}