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 0231cb823f..07dfa112ad 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 @@ -31,6 +31,8 @@ public class MySqlPartitionByHash extends MySqlObjectImpl implements SQLPartitio private SQLExpr partitionCount; + private boolean linear; + @Override public void accept0(MySqlASTVisitor visitor) { if (visitor.visit(this)) { @@ -48,13 +50,20 @@ public class MySqlPartitionByHash extends MySqlObjectImpl implements SQLPartitio this.partitionCount = partitionCount; } - public SQLExpr getExpr() { return expr; } - public void setExpr(SQLExpr expr) { this.expr = expr; } + + public boolean isLinear() { + return linear; + } + + public void setLinear(boolean linear) { + this.linear = linear; + } + } 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 cc91ff3271..338dd5ba88 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 @@ -32,6 +32,8 @@ public class MySqlPartitionByKey extends MySqlObjectImpl implements SQLPartition private SQLExpr partitionCount; + private boolean linear; + @Override public void accept0(MySqlASTVisitor visitor) { if (visitor.visit(this)) { @@ -57,4 +59,12 @@ public class MySqlPartitionByKey extends MySqlObjectImpl implements SQLPartition this.columns = columns; } + public boolean isLinear() { + return linear; + } + + public void setLinear(boolean linear) { + this.linear = linear; + } + } 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 e2b54a2073..3cb5452b45 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 @@ -355,10 +355,21 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { if (identifierEquals("PARTITION")) { lexer.nextToken(); accept(Token.BY); + + boolean linera = false; + if (identifierEquals("LINEAR")) { + lexer.nextToken(); + linera = true; + } 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()); @@ -379,6 +390,10 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { lexer.nextToken(); MySqlPartitionByHash clause = new MySqlPartitionByHash(); + if (linera) { + clause.setLinear(true); + } + accept(Token.LPAREN); clause.setExpr(this.exprParser.expr()); accept(Token.RPAREN); 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 f11d8a7f03..e7be50a415 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 @@ -1496,7 +1496,11 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV @Override public boolean visit(MySqlPartitionByKey x) { - print("PARTITION BY KEY ("); + if (x.isLinear()) { + print("PARTITION BY LINEAR KEY ("); + } else { + print("PARTITION BY KEY ("); + } printAndAccept(x.getColumns(), ", "); print(")"); @@ -1514,7 +1518,12 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV @Override public boolean visit(MySqlPartitionByHash x) { - print("PARTITION BY HASH ("); + if (x.isLinear()) { + print("PARTITION BY LINEAR HASH ("); + } else { + print("PARTITION BY HASH ("); + } + // x.getExpr().accept(this); print(")"); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest41.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest41.java new file mode 100644 index 0000000000..32c703e37c --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest41.java @@ -0,0 +1,65 @@ +/* + * 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 MySqlCreateTableTest41 extends MysqlTest { + + public void test_0() throws Exception { + String sql = "CREATE TABLE tk (col1 INT, col2 CHAR(5), col3 DATE)" + // + " PARTITION BY LINEAR KEY(col3)" + // + " PARTITIONS 5;"; // + + 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(3, visitor.getColumns().size()); + Assert.assertEquals(0, visitor.getConditions().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("tk"))); + + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("CREATE TABLE tk (" + // + "\n\tcol1 INT, " + // + "\n\tcol2 CHAR(5), " + // + "\n\tcol3 DATE" + // + "\n) PARTITION BY LINEAR KEY (col3) PARTITIONS 5", output); + + } +}