diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitioningDef.java b/src/main/java/com/alibaba/druid/sql/ast/SQLPartition.java similarity index 68% rename from src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitioningDef.java rename to src/main/java/com/alibaba/druid/sql/ast/SQLPartition.java index fe45127214..73595e52bd 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitioningDef.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLPartition.java @@ -13,44 +13,68 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alibaba.druid.sql.dialect.mysql.ast.statement; +package com.alibaba.druid.sql.ast; 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; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; -public class MySqlPartitioningDef extends MySqlObjectImpl { +public class SQLPartition extends SQLObjectImpl { - private SQLName name; + protected SQLName name; - private Values values; + protected SQLExpr subPartitionsCount; - private SQLExpr dataDirectory; - private SQLExpr indexDirectory; - private SQLName tableSpace; - private SQLExpr maxRows; - private SQLExpr minRows; - private SQLExpr engine; - private SQLExpr comment; + protected List subPartitions = new ArrayList(); - @Override - public void accept0(MySqlASTVisitor visitor) { - if (visitor.visit(this)) { - acceptChild(visitor, name); - acceptChild(visitor, values); - acceptChild(visitor, dataDirectory); - acceptChild(visitor, indexDirectory); - acceptChild(visitor, tableSpace); - acceptChild(visitor, maxRows); - acceptChild(visitor, minRows); - acceptChild(visitor, engine); - acceptChild(visitor, comment); + protected SQLPartitionValue values; + + // for mysql + protected SQLExpr dataDirectory; + protected SQLExpr indexDirectory; + protected SQLName tableSpace; + protected SQLExpr maxRows; + protected SQLExpr minRows; + protected SQLExpr engine; + protected SQLExpr comment; + + + public SQLName getName() { + return name; + } + + public void setName(SQLName name) { + if (name != null) { + name.setParent(this); } - visitor.endVisit(this); + this.name = name; + } + + public SQLExpr getSubPartitionsCount() { + return subPartitionsCount; + } + + public void setSubPartitionsCount(SQLExpr subPartitionsCount) { + if (subPartitionsCount != null) { + subPartitionsCount.setParent(this); + } + this.subPartitionsCount = subPartitionsCount; + } + + public SQLPartitionValue getValues() { + return values; + } + + public void setValues(SQLPartitionValue values) { + if (values != null) { + values.setParent(this); + } + this.values = values; + } + + public List getSubPartitions() { + return subPartitions; } public SQLExpr getIndexDirectory() { @@ -75,24 +99,7 @@ public class MySqlPartitioningDef extends MySqlObjectImpl { this.dataDirectory = dataDirectory; } - public Values getValues() { - return values; - } - - public void setValues(Values values) { - this.values = values; - } - - public SQLName getName() { - return name; - } - - public void setName(SQLName name) { - if (name != null) { - name.setParent(this); - } - this.name = name; - } + public SQLName getTableSpace() { return tableSpace; @@ -148,37 +155,19 @@ public class MySqlPartitioningDef extends MySqlObjectImpl { } this.comment = comment; } - - public static abstract class Values extends MySqlObjectImpl { - - private final List items = new ArrayList(); - - public List getItems() { - return items; + + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, name); + acceptChild(visitor, values); + acceptChild(visitor, dataDirectory); + acceptChild(visitor, indexDirectory); + acceptChild(visitor, tableSpace); + acceptChild(visitor, maxRows); + acceptChild(visitor, minRows); + acceptChild(visitor, engine); + acceptChild(visitor, comment); } - } - - 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); - } - + visitor.endVisit(this); } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitionByClause.java b/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionBy.java similarity index 56% rename from src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitionByClause.java rename to src/main/java/com/alibaba/druid/sql/ast/SQLPartitionBy.java index f7f2f70572..a3872793d6 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitionByClause.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionBy.java @@ -13,31 +13,36 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alibaba.druid.sql.dialect.mysql.ast.statement; +package com.alibaba.druid.sql.ast; import java.util.ArrayList; import java.util.List; -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLPartitioningClause; -import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl; +public abstract class SQLPartitionBy extends SQLObjectImpl { -public abstract class MySqlPartitionByClause extends MySqlObjectImpl implements SQLPartitioningClause { + protected SQLSubPartitionBy subPartitionBy; - private List partitions = new ArrayList(); + protected SQLExpr partitionsCount; - protected SQLExpr partitionsCount; + protected boolean linear; - protected boolean linear; + protected List partitions = new ArrayList(); - protected MySqlSubPartitionByClause subPartitionBy; + protected List storeIn = new ArrayList(); - public List getPartitions() { + public List getPartitions() { return partitions; } - public void setPartitions(List partitions) { - this.partitions = partitions; + public SQLSubPartitionBy getSubPartitionBy() { + return subPartitionBy; + } + + public void setSubPartitionBy(SQLSubPartitionBy subPartitionBy) { + if (subPartitionBy != null) { + subPartitionBy.setParent(this); + } + this.subPartitionBy = subPartitionBy; } public SQLExpr getPartitionsCount() { @@ -45,6 +50,9 @@ public abstract class MySqlPartitionByClause extends MySqlObjectImpl implements } public void setPartitionsCount(SQLExpr partitionsCount) { + if (partitionsCount != null) { + partitionsCount.setParent(this); + } this.partitionsCount = partitionsCount; } @@ -56,12 +64,7 @@ public abstract class MySqlPartitionByClause extends MySqlObjectImpl implements this.linear = linear; } - public MySqlSubPartitionByClause getSubPartitionBy() { - return subPartitionBy; + public List getStoreIn() { + return storeIn; } - - public void setSubPartitionBy(MySqlSubPartitionByClause subPartitionBy) { - this.subPartitionBy = subPartitionBy; - } - } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitionByHash.java b/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByHash.java similarity index 75% rename from src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitionByHash.java rename to src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByHash.java index b23db9aebc..a75dae22b2 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitionByHash.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByHash.java @@ -1,54 +1,57 @@ -/* - * Copyright 1999-2101 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.dialect.mysql.ast.statement; - -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; - -public class MySqlPartitionByHash extends MySqlPartitionByClause { - - private SQLExpr expr; - - // for aliyun ads - private boolean key; - - @Override - public void accept0(MySqlASTVisitor visitor) { - if (visitor.visit(this)) { - acceptChild(visitor, expr); - acceptChild(visitor, partitionsCount); - acceptChild(visitor, getPartitions()); - acceptChild(visitor, subPartitionBy); - } - visitor.endVisit(this); - } - - public SQLExpr getExpr() { - return expr; - } - - public void setExpr(SQLExpr expr) { - this.expr = expr; - } - - public boolean isKey() { - return key; - } - - public void setKey(boolean key) { - this.key = key; - } -} +/* + * Copyright 1999-2101 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.sql.ast; + +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLPartitionByHash extends SQLPartitionBy { + + protected SQLExpr expr; + + // for aliyun ads + protected boolean key; + + public SQLExpr getExpr() { + return expr; + } + + public void setExpr(SQLExpr expr) { + if (expr != null) { + expr.setParent(this); + } + this.expr = expr; + } + + public boolean isKey() { + return key; + } + + public void setKey(boolean key) { + this.key = key; + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, expr); + acceptChild(visitor, partitionsCount); + acceptChild(visitor, getPartitions()); + acceptChild(visitor, subPartitionBy); + } + visitor.endVisit(this); + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitionByList.java b/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByList.java similarity index 69% rename from src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitionByList.java rename to src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByList.java index 08b7bb42e3..0445294a88 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitionByList.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByList.java @@ -1,62 +1,56 @@ -/* - * Copyright 1999-2101 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.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 MySqlPartitionByList extends MySqlPartitionByClause { - - private SQLExpr expr; - - private List columns = new ArrayList(); - - @Override - public void accept0(MySqlASTVisitor visitor) { - if (visitor.visit(this)) { - acceptChild(visitor, expr); - acceptChild(visitor, columns); - acceptChild(visitor, partitionsCount); - acceptChild(visitor, getPartitions()); - acceptChild(visitor, subPartitionBy); - } - visitor.endVisit(this); - } - - public SQLExpr getExpr() { - return expr; - } - - public void setExpr(SQLExpr expr) { - if (expr != null) { - expr.setParent(this); - } - this.expr = expr; - } - - public List getColumns() { - return columns; - } - - public void setColumns(List columns) { - this.columns = columns; - } - -} +/* + * Copyright 1999-2101 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.sql.ast; + +import java.util.ArrayList; +import java.util.List; + +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLPartitionByList extends SQLPartitionBy { + + protected SQLExpr expr; + + protected List columns = new ArrayList(); + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, expr); + acceptChild(visitor, columns); + acceptChild(visitor, partitionsCount); + acceptChild(visitor, getPartitions()); + acceptChild(visitor, subPartitionBy); + } + visitor.endVisit(this); + } + + public SQLExpr getExpr() { + return expr; + } + + public void setExpr(SQLExpr expr) { + if (expr != null) { + expr.setParent(this); + } + this.expr = expr; + } + + public List getColumns() { + return columns; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitionByRange.java b/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByRange.java similarity index 62% rename from src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitionByRange.java rename to src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByRange.java index 9710917dae..0bef4844ae 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPartitionByRange.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByRange.java @@ -1,62 +1,75 @@ -/* - * Copyright 1999-2101 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.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 MySqlPartitionByClause { - - private SQLExpr expr; - - private List columns = new ArrayList(); - - @Override - public void accept0(MySqlASTVisitor visitor) { - if (visitor.visit(this)) { - acceptChild(visitor, expr); - acceptChild(visitor, columns); - acceptChild(visitor, partitionsCount); - acceptChild(visitor, getPartitions()); - acceptChild(visitor, subPartitionBy); - } - visitor.endVisit(this); - } - - public SQLExpr getExpr() { - return expr; - } - - public void setExpr(SQLExpr expr) { - if (expr != null) { - expr.setParent(this); - } - this.expr = expr; - } - - public List getColumns() { - return columns; - } - - public void setColumns(List columns) { - this.columns = columns; - } - -} +/* + * Copyright 1999-2101 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.sql.ast; + +import java.util.ArrayList; +import java.util.List; + +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLPartitionByRange extends SQLPartitionBy { + + protected List columns = new ArrayList(); + + protected SQLExpr interval; + + // mysql + protected SQLExpr expr; + + public List getColumns() { + return columns; + } + + public void setColumns(List columns) { + this.columns = columns; + } + + public SQLExpr getInterval() { + return interval; + } + + public void setInterval(SQLExpr interval) { + if (interval != null) { + interval.setParent(this); + } + + this.interval = interval; + } + + public SQLExpr getExpr() { + return expr; + } + + public void setExpr(SQLExpr expr) { + if (expr != null) { + expr.setParent(this); + } + this.expr = expr; + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, columns); + acceptChild(visitor, expr); + acceptChild(visitor, interval); + acceptChild(visitor, storeIn); + acceptChild(visitor, partitions); + } + visitor.endVisit(this); + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionValue.java b/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionValue.java new file mode 100644 index 0000000000..cecef5c3f3 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionValue.java @@ -0,0 +1,54 @@ +/* + * Copyright 1999-2101 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.sql.ast; + +import java.util.ArrayList; +import java.util.List; + +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLPartitionValue extends SQLObjectImpl { + + protected Operator operator; + protected final List items = new ArrayList(); + + public SQLPartitionValue(Operator operator){ + super(); + this.operator = operator; + } + + public List getItems() { + return items; + } + + public Operator getOperator() { + return operator; + } + + public static enum Operator { + LessThan, // + In, // + List + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, getItems()); + } + visitor.endVisit(this); + } +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/OracleRangeValuesClause.java b/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartition.java similarity index 59% rename from src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/OracleRangeValuesClause.java rename to src/main/java/com/alibaba/druid/sql/ast/SQLSubPartition.java index 01928fb658..ce0193b0a8 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/OracleRangeValuesClause.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartition.java @@ -1,56 +1,57 @@ -/* - * Copyright 1999-2101 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.dialect.oracle.ast.clause; - -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.oracle.ast.OracleSQLObjectImpl; -import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; - -public class OracleRangeValuesClause extends OracleSQLObjectImpl { - - private SQLName name; - private List values = new ArrayList(); - - @Override - public void accept0(OracleASTVisitor visitor) { - if (visitor.visit(this)) { - acceptChild(visitor, name); - acceptChild(visitor, values); - } - visitor.endVisit(this); - } - - public SQLName getName() { - return name; - } - - public void setName(SQLName name) { - this.name = name; - } - - public List getValues() { - return values; - } - - public void setValues(List values) { - this.values = values; - } - -} +/* + * Copyright 1999-2101 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.sql.ast; + +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLSubPartition extends SQLObjectImpl { + + protected SQLName name; + + protected SQLPartitionValue values; + + public SQLName getName() { + return name; + } + + public void setName(SQLName name) { + if (name != null) { + name.setParent(this); + } + this.name = name; + } + + public SQLPartitionValue getValues() { + return values; + } + + public void setValues(SQLPartitionValue values) { + if (values != null) { + values.setParent(this); + } + this.values = values; + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, name); + acceptChild(visitor, values); + } + visitor.endVisit(this); + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSubPartitionByClause.java b/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionBy.java similarity index 66% rename from src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSubPartitionByClause.java rename to src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionBy.java index 8a12bf48b1..d0bdee07eb 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSubPartitionByClause.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionBy.java @@ -13,29 +13,31 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alibaba.druid.sql.dialect.mysql.ast.statement; +package com.alibaba.druid.sql.ast; import java.util.ArrayList; import java.util.List; -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLPartitioningClause; import com.alibaba.druid.sql.ast.statement.SQLAssignItem; -import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl; -public abstract class MySqlSubPartitionByClause extends MySqlObjectImpl implements SQLPartitioningClause { +public abstract class SQLSubPartitionBy extends SQLObjectImpl { - protected SQLExpr subPartitionsCount; + protected SQLExpr subPartitionsCount; + protected boolean linear; - protected boolean linear; + protected List options = new ArrayList(); - protected List options = new ArrayList(); + protected List subPartitionTemplate = new ArrayList(); public SQLExpr getSubPartitionsCount() { return subPartitionsCount; } public void setSubPartitionsCount(SQLExpr subPartitionsCount) { + if (subPartitionsCount != null) { + subPartitionsCount.setParent(this); + } + this.subPartitionsCount = subPartitionsCount; } @@ -51,4 +53,8 @@ public abstract class MySqlSubPartitionByClause extends MySqlObjectImpl implemen return options; } + public List getSubPartitionTemplate() { + return subPartitionTemplate; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSubPartitionByHash.java b/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionByHash.java similarity index 72% rename from src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSubPartitionByHash.java rename to src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionByHash.java index 9de090b962..6310cf1ea1 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSubPartitionByHash.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionByHash.java @@ -1,54 +1,55 @@ -/* - * Copyright 1999-2101 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.dialect.mysql.ast.statement; - -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; - -public class MySqlSubPartitionByHash extends MySqlSubPartitionByClause { - - private SQLExpr expr; - - // for aliyun ads - private boolean key; - - @Override - public void accept0(MySqlASTVisitor visitor) { - if (visitor.visit(this)) { - acceptChild(visitor, expr); - acceptChild(visitor, subPartitionsCount); - } - visitor.endVisit(this); - } - - public SQLExpr getExpr() { - return expr; - } - - public void setExpr(SQLExpr expr) { - this.expr = expr; - } - - public boolean isKey() { - return key; - } - - public void setKey(boolean key) { - this.key = key; - } - - -} +/* + * Copyright 1999-2101 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.sql.ast; + +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLSubPartitionByHash extends SQLSubPartitionBy { + + protected SQLExpr expr; + + // for aliyun ads + private boolean key; + + public SQLExpr getExpr() { + return expr; + } + + public void setExpr(SQLExpr expr) { + if (expr != null) { + expr.setParent(this); + } + this.expr = expr; + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, expr); + acceptChild(visitor, subPartitionsCount); + } + visitor.endVisit(this); + } + + public boolean isKey() { + return key; + } + + public void setKey(boolean key) { + this.key = key; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionByList.java b/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionByList.java new file mode 100644 index 0000000000..050105fcd5 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionByList.java @@ -0,0 +1,44 @@ +/* + * Copyright 1999-2101 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.sql.ast; + +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLSubPartitionByList extends SQLSubPartitionBy { + + protected SQLName column; + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, column); + acceptChild(visitor, subPartitionsCount); + } + visitor.endVisit(this); + } + + public SQLName getColumn() { + return column; + } + + public void setColumn(SQLName column) { + if (column != null) { + column.setParent(this); + } + this.column = column; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLPartitioningClause.java b/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionByRange.java similarity index 63% rename from src/main/java/com/alibaba/druid/sql/ast/SQLPartitioningClause.java rename to src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionByRange.java index 9547c1a3f0..5a88501c9b 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLPartitioningClause.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLSubPartitionByRange.java @@ -1,22 +1,34 @@ -/* - * Copyright 1999-2101 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.ast; - - - -public interface SQLPartitioningClause extends SQLObject { - -} +/* + * Copyright 1999-2101 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.sql.ast; + +import java.util.ArrayList; +import java.util.List; + +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLSubPartitionByRange extends SQLSubPartitionBy { + private List columns = new ArrayList(); + + public List getColumns() { + return columns; + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + + } +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java index 7a6a7b2532..845406657b 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java @@ -24,7 +24,7 @@ import com.alibaba.druid.sql.ast.SQLCommentHint; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLObject; -import com.alibaba.druid.sql.ast.SQLPartitioningClause; +import com.alibaba.druid.sql.ast.SQLPartitionBy; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; import com.alibaba.druid.sql.ast.statement.SQLSelect; @@ -37,7 +37,7 @@ public class MySqlCreateTableStatement extends SQLCreateTableStatement implement private Map tableOptions = new LinkedHashMap(); - private SQLPartitioningClause partitioning; + private SQLPartitionBy partitioning; private List hints = new ArrayList(); @@ -78,11 +78,11 @@ public class MySqlCreateTableStatement extends SQLCreateTableStatement implement this.tableOptions = tableOptions; } - public SQLPartitioningClause getPartitioning() { + public SQLPartitionBy getPartitioning() { return partitioning; } - public void setPartitioning(SQLPartitioningClause partitioning) { + public void setPartitioning(SQLPartitionBy partitioning) { this.partitioning = partitioning; } 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 12640b2ca0..9df5924298 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 @@ -19,12 +19,24 @@ import java.util.ArrayList; import java.util.List; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLPartitionBy; +import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObject; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; -public class MySqlPartitionByKey extends MySqlPartitionByClause { +public class MySqlPartitionByKey extends SQLPartitionBy implements MySqlObject { private List columns = new ArrayList(); + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor instanceof MySqlASTVisitor) { + accept0((MySqlASTVisitor) visitor); + } else { + throw new IllegalArgumentException("not support visitor type : " + visitor.getClass().getName()); + } + } + @Override public void accept0(MySqlASTVisitor visitor) { if (visitor.visit(this)) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSubPartitionByKey.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSubPartitionByKey.java index 75e4fdbb41..0b3bc2a8dc 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSubPartitionByKey.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSubPartitionByKey.java @@ -19,12 +19,24 @@ import java.util.ArrayList; import java.util.List; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLSubPartitionBy; +import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObject; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; -public class MySqlSubPartitionByKey extends MySqlSubPartitionByClause { +public class MySqlSubPartitionByKey extends SQLSubPartitionBy implements MySqlObject { private List columns = new ArrayList(); + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor instanceof MySqlASTVisitor) { + accept0((MySqlASTVisitor) visitor); + } else { + throw new IllegalArgumentException("not support visitor type : " + visitor.getClass().getName()); + } + } + @Override public void accept0(MySqlASTVisitor visitor) { if (visitor.visit(this)) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSubPartitionByList.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSubPartitionByList.java index 72682b3229..ab306f5721 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSubPartitionByList.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSubPartitionByList.java @@ -19,15 +19,27 @@ import java.util.ArrayList; import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLSubPartitionBy; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; +import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObject; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; -public class MySqlSubPartitionByList extends MySqlSubPartitionByClause { +public class MySqlSubPartitionByList extends SQLSubPartitionBy implements MySqlObject { private SQLExpr expr; private List columns = new ArrayList(); + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor instanceof MySqlASTVisitor) { + accept0((MySqlASTVisitor) visitor); + } else { + throw new IllegalArgumentException("not support visitor type : " + visitor.getClass().getName()); + } + } + @Override public void accept0(MySqlASTVisitor visitor) { if (visitor.visit(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 d2b757d4c8..ae12008649 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 @@ -19,6 +19,14 @@ import com.alibaba.druid.sql.ast.SQLDataTypeImpl; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLOrderingSpecification; +import com.alibaba.druid.sql.ast.SQLPartition; +import com.alibaba.druid.sql.ast.SQLPartitionBy; +import com.alibaba.druid.sql.ast.SQLPartitionByHash; +import com.alibaba.druid.sql.ast.SQLPartitionByList; +import com.alibaba.druid.sql.ast.SQLPartitionByRange; +import com.alibaba.druid.sql.ast.SQLPartitionValue; +import com.alibaba.druid.sql.ast.SQLSubPartitionBy; +import com.alibaba.druid.sql.ast.SQLSubPartitionByHash; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; import com.alibaba.druid.sql.ast.statement.SQLAssignItem; @@ -36,14 +44,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOrderingExpr; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement.TableSpaceOption; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByClause; -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.MySqlPartitionByList; -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.MySqlSubPartitionByClause; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByHash; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByKey; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByList; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlTableIndex; @@ -350,7 +351,7 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { stmt.getTableOptions().put("STATS_PERSISTENT", this.exprParser.expr()); continue; } - + if (identifierEquals("STATS_SAMPLE_PAGES")) { lexer.nextToken(); if (lexer.token() == Token.EQ) { @@ -360,7 +361,7 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { stmt.getTableOptions().put("STATS_SAMPLE_PAGES", this.exprParser.expr()); continue; } - + if (lexer.token() == Token.UNION) { lexer.nextToken(); if (lexer.token() == Token.EQ) { @@ -388,10 +389,10 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { stmt.getTableOptions().put("TABLESPACE", option); continue; } - + if (identifierEquals("TABLEGROUP")) { lexer.nextToken(); - + SQLName tableGroup = this.exprParser.name(); stmt.setTableGroup(tableGroup); continue; @@ -409,7 +410,7 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { lexer.nextToken(); accept(Token.BY); - MySqlPartitionByClause partitionClause; + SQLPartitionBy partitionClause; boolean linera = false; if (identifierEquals("LINEAR")) { @@ -441,12 +442,12 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { partitionClauseRest(clause); } else if (identifierEquals("HASH")) { lexer.nextToken(); - MySqlPartitionByHash clause = new MySqlPartitionByHash(); + SQLPartitionByHash clause = new SQLPartitionByHash(); if (linera) { clause.setLinear(true); } - + if (lexer.token() == Token.KEY) { lexer.nextToken(); clause.setKey(true); @@ -460,33 +461,14 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { partitionClauseRest(clause); } 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); - } + SQLPartitionByRange clause = partitionByRange(); partitionClause = clause; partitionClauseRest(clause); } else if (identifierEquals("LIST")) { lexer.nextToken(); - MySqlPartitionByList clause = new MySqlPartitionByList(); + SQLPartitionByList clause = new SQLPartitionByList(); if (lexer.token() == Token.LPAREN) { lexer.nextToken(); @@ -517,38 +499,14 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { for (;;) { acceptIdentifier("PARTITION"); - MySqlPartitioningDef partitionDef = new MySqlPartitioningDef(); + SQLPartition partitionDef = new SQLPartition(); partitionDef.setName(this.exprParser.name()); - if (lexer.token() == Token.VALUES) { - lexer.nextToken(); - if (lexer.token() == Token.IN) { - lexer.nextToken(); - MySqlPartitioningDef.InValues values = new MySqlPartitioningDef.InValues(); - - accept(Token.LPAREN); - this.exprParser.exprList(values.getItems(), values); - accept(Token.RPAREN); - partitionDef.setValues(values); - } else { - acceptIdentifier("LESS"); - acceptIdentifier("THAN"); - - MySqlPartitioningDef.LessThanValues values = new MySqlPartitioningDef.LessThanValues(); - - if (identifierEquals("MAXVALUE")) { - SQLIdentifierExpr maxValue = new SQLIdentifierExpr(lexer.stringVal()); - lexer.nextToken(); - maxValue.setParent(values); - values.getItems().add(maxValue); - } else { - accept(Token.LPAREN); - this.exprParser.exprList(values.getItems(), values); - accept(Token.RPAREN); - } - partitionDef.setValues(values); - } + + SQLPartitionValue values = parsePartitionValues(); + if (values != null) { + partitionDef.setValues(values); } for (;;) { @@ -589,17 +547,16 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { SQLExpr minRows = this.exprParser.primary(); partitionDef.setMaxRows(minRows); } else if (identifierEquals("ENGINE") || // - (storage = (lexer.token() == Token.STORAGE || identifierEquals("STORAGE"))) - ) { + (storage = (lexer.token() == Token.STORAGE || identifierEquals("STORAGE")))) { if (storage) { lexer.nextToken(); } acceptIdentifier("ENGINE"); - + if (lexer.token() == Token.EQ) { lexer.nextToken(); } - + SQLName engine = this.exprParser.name(); partitionDef.setEngine(engine); } else if (lexer.token() == Token.COMMENT) { @@ -627,7 +584,7 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { } stmt.setPartitioning(partitionClause); - + continue; } @@ -637,7 +594,7 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { if (lexer.token() == (Token.ON)) { throw new ParserException("TODO"); } - + if (lexer.token() == (Token.AS)) { lexer.nextToken(); } @@ -646,46 +603,71 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { SQLSelect query = new MySqlSelectParser(this.exprParser).select(); stmt.setSelect(query); } - + while (lexer.token() == (Token.HINT)) { this.exprParser.parseHints(stmt.getOptionHints()); } return stmt; } - protected void partitionClauseRest(MySqlPartitionByClause clause) { + protected SQLPartitionByRange partitionByRange() { + acceptIdentifier("RANGE"); + + SQLPartitionByRange clause = new SQLPartitionByRange(); + + 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); + } + return clause; + } + + protected void partitionClauseRest(SQLPartitionBy clause) { if (identifierEquals("PARTITIONS")) { lexer.nextToken(); - + SQLIntegerExpr countExpr = new SQLIntegerExpr(lexer.integerValue()); accept(Token.LITERAL_INT); clause.setPartitionsCount(countExpr); } - + if (identifierEquals("PARTITION")) { lexer.nextToken(); - + if (identifierEquals("NUM")) { lexer.nextToken(); } - + clause.setPartitionsCount(this.exprParser.expr()); - + clause.putAttribute("ads.partition", Boolean.TRUE); } - + if (identifierEquals("SUBPARTITION")) { lexer.nextToken(); accept(Token.BY); - - MySqlSubPartitionByClause subPartitionByClause = null; - + + SQLSubPartitionBy subPartitionByClause = null; + boolean linear = false; if (identifierEquals("LINEAR")) { lexer.nextToken(); linear = true; } - + if (lexer.token() == Token.KEY) { MySqlSubPartitionByKey subPartitionKey = new MySqlSubPartitionByKey(); lexer.nextToken(); @@ -709,12 +691,12 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { } else if (identifierEquals("HASH")) { lexer.nextToken(); - MySqlSubPartitionByHash subPartitionHash = new MySqlSubPartitionByHash(); + SQLSubPartitionByHash subPartitionHash = new SQLSubPartitionByHash(); if (linear) { clause.setLinear(true); } - + if (lexer.token() == Token.KEY) { lexer.nextToken(); subPartitionHash.setKey(true); @@ -732,16 +714,16 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { if (lexer.token() == Token.LPAREN) { lexer.nextToken(); SQLExpr expr = this.exprParser.expr(); - + if (expr instanceof SQLIdentifierExpr && (identifierEquals("bigint") || identifierEquals("long"))) { String dataType = lexer.stringVal(); lexer.nextToken(); - + SQLColumnDefinition column = this.exprParser.createColumnDefinition(); - column.setName((SQLIdentifierExpr)expr); + column.setName((SQLIdentifierExpr) expr); column.setDataType(new SQLDataTypeImpl(dataType)); subPartitionList.getColumns().add(column); - + subPartitionList.putAttribute("ads.subPartitionList", Boolean.TRUE); } else { subPartitionList.setExpr(expr); @@ -762,23 +744,23 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { } subPartitionByClause = subPartitionList; } - + if (identifierEquals("SUBPARTITION")) { lexer.nextToken(); acceptIdentifier("OPTIONS"); accept(Token.LPAREN); - + SQLAssignItem option = this.exprParser.parseAssignItem(); accept(Token.RPAREN); - + option.setParent(subPartitionByClause); - + subPartitionByClause.getOptions().add(option); } - + if (subPartitionByClause != null) { subPartitionByClause.setLinear(linear); - + clause.setSubPartitionBy(subPartitionByClause); } } @@ -834,11 +816,11 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { MySqlKey key = new MySqlKey(); key.setHasConstaint(hasConstaint); -// if (identifierEquals("USING")) { -// lexer.nextToken(); -// key.setIndexType(lexer.stringVal()); -// lexer.nextToken(); -// } + // if (identifierEquals("USING")) { + // lexer.nextToken(); + // key.setIndexType(lexer.stringVal()); + // lexer.nextToken(); + // } if (lexer.token() == Token.IDENTIFIER) { SQLName indexName = this.exprParser.name(); @@ -846,8 +828,8 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { key.setIndexName(indexName); } } - - //5.5语法 USING BTREE 放在index 名字后 + + // 5.5语法 USING BTREE 放在index 名字后 if (identifierEquals("USING")) { lexer.nextToken(); key.setIndexType(lexer.stringVal()); @@ -864,7 +846,7 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { lexer.nextToken(); expr = new MySqlOrderingExpr(expr, SQLOrderingSpecification.DESC); } - + key.getColumns().add(expr); if (!(lexer.token() == (Token.COMMA))) { 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 5e82033647..6d3b15aeeb 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 @@ -64,11 +64,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadDataInFileStat 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.MySqlOptimizeStatement; -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.MySqlPartitionByList; -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; @@ -122,7 +118,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowTriggersStatem import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowVariantsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowWarningsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStartTransactionStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByHash; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByKey; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByList; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlTableIndex; @@ -513,30 +508,6 @@ public interface MySqlASTVisitor extends SQLASTVisitor { void endVisit(MySqlCreateTableStatement.TableSpaceOption x); - boolean visit(MySqlPartitionByHash x); - - void endVisit(MySqlPartitionByHash x); - - boolean visit(MySqlPartitionByRange x); - - void endVisit(MySqlPartitionByRange x); - - boolean visit(MySqlPartitionByList x); - - void endVisit(MySqlPartitionByList 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); - boolean visit(MySqlAnalyzeStatement x); void endVisit(MySqlAnalyzeStatement x); @@ -608,10 +579,6 @@ public interface MySqlASTVisitor extends SQLASTVisitor { void endVisit(MySqlAlterTableAlterColumn x); - boolean visit(MySqlSubPartitionByHash x); - - void endVisit(MySqlSubPartitionByHash x); - boolean visit(MySqlSubPartitionByKey x); void endVisit(MySqlSubPartitionByKey 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 2117ac0e2a..6afc9d8ec9 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 @@ -66,13 +66,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadDataInFileStat 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.MySqlOptimizeStatement; -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.MySqlPartitionByList; -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; @@ -127,7 +121,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowTriggersStatem import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowVariantsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowWarningsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStartTransactionStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByHash; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByKey; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByList; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlTableIndex; @@ -1106,66 +1099,6 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements MySq } - @Override - public boolean visit(MySqlPartitionByHash x) { - return true; - } - - @Override - 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) { - - } - - @Override - public boolean visit(MySqlPartitionByList x) { - return true; - } - - @Override - public void endVisit(MySqlPartitionByList x) { - - } - @Override public boolean visit(MySqlAnalyzeStatement x) { return true; @@ -1346,15 +1279,6 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements MySq public void endVisit(MySqlSubPartitionByKey x) { } - - @Override - public boolean visit(MySqlSubPartitionByHash x) { - return true; - } - - @Override - public void endVisit(MySqlSubPartitionByHash x) { - } @Override public boolean visit(MySqlSubPartitionByList 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 8dc1b9368a..c952f67b05 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 @@ -26,9 +26,9 @@ import com.alibaba.druid.sql.ast.SQLOrderBy; import com.alibaba.druid.sql.ast.SQLParameter; import com.alibaba.druid.sql.ast.SQLSetQuantifier; import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.SQLSubPartitionBy; import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; -import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLMethodInvokeExpr; import com.alibaba.druid.sql.ast.expr.SQLNullExpr; import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; @@ -97,14 +97,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadDataInFileStat 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.MySqlOptimizeStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlPartitionByClause; -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.MySqlPartitionByList; -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; @@ -160,8 +153,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowTriggersStatem import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowVariantsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowWarningsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStartTransactionStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByClause; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByHash; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByKey; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByList; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlTableIndex; @@ -665,7 +656,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV boolean subPartitionOption = false; if (x.getParent() != null) { - subPartitionOption = x.getParent().getParent() instanceof MySqlSubPartitionByClause; + subPartitionOption = x.getParent().getParent() instanceof SQLSubPartitionBy; } if (!subPartitionOption) { @@ -1546,130 +1537,11 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV return false; } - @Override - public void endVisit(MySqlPartitionByRange x) { - } - - @Override - public boolean visit(MySqlPartitionByRange x) { - print0(ucase ? "PARTITION BY RANGE" : "partition by range"); - if (x.getExpr() != null) { - print0(" ("); - x.getExpr().accept(this); - print(')'); - } else { - print0(ucase ? " COLUMNS (" : " columns ("); - printAndAccept(x.getColumns(), ", "); - print(')'); - } - - printPartitionsCountAndSubPartitions(x); - - List partitions = x.getPartitions(); - int partitionsSize = partitions.size(); - if (partitionsSize > 0) { - print0(" ("); - incrementIndent(); - for (int i = 0; i < partitionsSize; ++i) { - println(); - partitions.get(i).accept(this); - if (i != partitionsSize - 1) { - print0(", "); - } - } - decrementIndent(); - println(); - print(')'); - } - return false; - } - - @Override - public void endVisit(MySqlPartitionByList x) { - - } - - @Override - public boolean visit(MySqlPartitionByList x) { - print0(ucase ? "PARTITION BY LIST " : "partition by list "); - if (x.getExpr() != null) { - print('('); - x.getExpr().accept(this); - print0(") "); - } else { - print0(ucase ? "COLUMNS (" : "columns ("); - printAndAccept(x.getColumns(), ", "); - print0(") "); - } - - printPartitionsCountAndSubPartitions(x); - - 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) { - print0(", "); - } - } - decrementIndent(); - println(); - print(')'); - } - return false; - } + // - @Override - public void endVisit(MySqlPartitionByHash x) { - - } - - @Override - public boolean visit(MySqlPartitionByHash x) { - if (x.isLinear()) { - print0(ucase ? "PARTITION BY LINEAR HASH " : "partition by linear hash "); - } else { - print0(ucase ? "PARTITION BY HASH " : "partition by hash "); - } - - if (x.isKey()) { - print0(ucase ? "KEY" : "key"); - } - - print('('); - x.getExpr().accept(this); - print(')'); - - printPartitionsCountAndSubPartitions(x); - - return false; - } - - protected void printPartitionsCountAndSubPartitions(MySqlPartitionByClause x) { - if (x.getPartitionsCount() != null) { - - if (Boolean.TRUE.equals(x.getAttribute("ads.partition"))) { - print0(ucase ? " PARTITION NUM " : " partition num "); - } else { - print0(ucase ? " PARTITIONS " : " partitions "); - } - - x.getPartitionsCount().accept(this); - } - - if (x.getSubPartitionBy() != null) { - println(); - x.getSubPartitionBy().accept(this); - } - } - @Override public void endVisit(MySqlSelectQueryBlock x) { @@ -2986,97 +2858,6 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } - @Override - public boolean visit(MySqlPartitioningDef x) { - print0(ucase ? "PARTITION " : "partition "); - x.getName().accept(this); - if (x.getValues() != null) { - print(' '); - x.getValues().accept(this); - } - - if (x.getDataDirectory() != null) { - incrementIndent(); - println(); - print0(ucase ? "DATA DIRECTORY " : "data directory "); - x.getDataDirectory().accept(this); - decrementIndent(); - } - - if (x.getIndexDirectory() != null) { - incrementIndent(); - println(); - print0(ucase ? "INDEX DIRECTORY " : "index directory "); - x.getIndexDirectory().accept(this); - decrementIndent(); - } - - if (x.getTableSpace() != null) { - print0(ucase ? " TABLESPACE " : " tablespace "); - x.getTableSpace().accept(this); - } - - if (x.getEngine() != null) { - print0(ucase ? " STORAGE ENGINE " : " storage engine "); - x.getEngine().accept(this); - } - - if (x.getMaxRows() != null) { - print0(ucase ? " MAX_ROWS " : " max_rows "); - x.getMaxRows().accept(this); - } - - if (x.getMinRows() != null) { - print0(ucase ? " MIN_ROWS " : " min_rows "); - x.getMinRows().accept(this); - } - - if (x.getComment() != null) { - print0(ucase ? " COMMENT " : " comment "); - x.getComment().accept(this); - } - - return false; - } - - @Override - public void endVisit(MySqlPartitioningDef x) { - - } - - @Override - public boolean visit(LessThanValues x) { - if (x.getItems().size() == 1 && x.getItems().get(0) instanceof SQLIdentifierExpr) { - SQLIdentifierExpr ident = (SQLIdentifierExpr) x.getItems().get(0); - if ("MAXVALUE".equalsIgnoreCase(ident.getName())) { - print0(ucase ? "VALUES LESS THAN MAXVALUE" : "values less than maxvalue"); - return false; - } - } - print0(ucase ? "VALUES LESS THAN (" : "values less than ("); - printAndAccept(x.getItems(), ", "); - print(')'); - return false; - } - - @Override - public void endVisit(LessThanValues x) { - - } - - @Override - public boolean visit(InValues x) { - print0(ucase ? "VALUES IN (" : "values in ("); - printAndAccept(x.getItems(), ", "); - print(')'); - return false; - } - - @Override - public void endVisit(InValues x) { - - } - protected void visitAggreateRest(SQLAggregateExpr aggregateExpr) { { SQLOrderBy value = (SQLOrderBy) aggregateExpr.getAttribute("ORDER BY"); @@ -3566,35 +3347,6 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } - @Override - public boolean visit(MySqlSubPartitionByHash x) { - if (x.isLinear()) { - print0(ucase ? "SUBPARTITION BY LINEAR HASH " : "subpartition by linear hash "); - } else { - print0(ucase ? "SUBPARTITION BY HASH " : "subpartition by hash "); - } - - if (x.isKey()) { - print0(ucase ? "KEY" : "key"); - } - - print('('); - x.getExpr().accept(this); - print(')'); - - if (x.getSubPartitionsCount() != null) { - print0(ucase ? " PARTITIONS " : " partitions "); - x.getSubPartitionsCount().accept(this); - } - - return false; - } - - @Override - public void endVisit(MySqlSubPartitionByHash x) { - - } - @Override public boolean visit(MySqlSubPartitionByKey x) { if (x.isLinear()) { 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 21a689ec8b..44163b27b8 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 @@ -80,13 +80,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlLoadDataInFileStat 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.MySqlOptimizeStatement; -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.MySqlPartitionByList; -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; @@ -141,7 +135,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowTriggersStatem import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowVariantsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlShowWarningsStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStartTransactionStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByHash; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByKey; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSubPartitionByList; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlTableIndex; @@ -1201,67 +1194,6 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public void endVisit(TableSpaceOption x) { - - } - - @Override - public boolean visit(MySqlPartitionByHash x) { - return false; - } - - @Override - public void endVisit(MySqlPartitionByHash x) { - - } - - @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) { - - } - - @Override - public boolean visit(MySqlPartitionByList x) { - return false; - } - - @Override - public void endVisit(MySqlPartitionByList x) { - } @Override @@ -1321,9 +1253,9 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public void endVisit(MySqlOrderingExpr x) { - + } - + @Override public boolean visit(MySqlAlterTableAlterColumn x) { return false; @@ -1331,115 +1263,115 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public void endVisit(MySqlAlterTableAlterColumn x) { - + } /** * support procedure */ - @Override - public boolean visit(MySqlWhileStatement x) { - accept(x.getStatements()); - return false; - } + @Override + public boolean visit(MySqlWhileStatement x) { + accept(x.getStatements()); + return false; + } - @Override - public void endVisit(MySqlWhileStatement x) { - - } + @Override + public void endVisit(MySqlWhileStatement x) { - @Override - public boolean visit(MySqlCaseStatement x) { - accept(x.getWhenList()); - return false; - } + } - @Override - public void endVisit(MySqlCaseStatement x) { - - } + @Override + public boolean visit(MySqlCaseStatement x) { + accept(x.getWhenList()); + return false; + } - @Override - public boolean visit(MySqlDeclareStatement x) { + @Override + public void endVisit(MySqlCaseStatement x) { + + } + + @Override + public boolean visit(MySqlDeclareStatement x) { for (SQLDeclareItem item : x.getVarList()) { item.setParent(x); - SQLName var = (SQLName)item.getName(); + SQLName var = (SQLName) item.getName(); this.variants.put(var.toString(), var); } - - return false; - } - @Override - public void endVisit(MySqlDeclareStatement x) { - - } + return false; + } - @Override - public boolean visit(MySqlSelectIntoStatement x) { - return false; - } + @Override + public void endVisit(MySqlDeclareStatement x) { - @Override - public void endVisit(MySqlSelectIntoStatement x) { - - } + } - @Override - public boolean visit(MySqlWhenStatement x) { - accept(x.getStatements()); - return false; - } + @Override + public boolean visit(MySqlSelectIntoStatement x) { + return false; + } - @Override - public void endVisit(MySqlWhenStatement x) { - - } + @Override + public void endVisit(MySqlSelectIntoStatement x) { - @Override - public boolean visit(MySqlLeaveStatement x) { - return false; - } + } - @Override - public void endVisit(MySqlLeaveStatement x) { - - } + @Override + public boolean visit(MySqlWhenStatement x) { + accept(x.getStatements()); + return false; + } - @Override - public boolean visit(MySqlIterateStatement x) { - return false; - } + @Override + public void endVisit(MySqlWhenStatement x) { - @Override - public void endVisit(MySqlIterateStatement x) { - - } + } - @Override - public boolean visit(MySqlRepeatStatement x) { - accept(x.getStatements()); - return false; - } + @Override + public boolean visit(MySqlLeaveStatement x) { + return false; + } - @Override - public void endVisit(MySqlRepeatStatement x) { - - } + @Override + public void endVisit(MySqlLeaveStatement x) { - @Override - public boolean visit(MySqlCursorDeclareStatement x) { - accept(x.getSelect()); - return false; - } + } - @Override - public void endVisit(MySqlCursorDeclareStatement x) { - - } - - @Override + @Override + public boolean visit(MySqlIterateStatement x) { + return false; + } + + @Override + public void endVisit(MySqlIterateStatement x) { + + } + + @Override + public boolean visit(MySqlRepeatStatement x) { + accept(x.getStatements()); + return false; + } + + @Override + public void endVisit(MySqlRepeatStatement x) { + + } + + @Override + public boolean visit(MySqlCursorDeclareStatement x) { + accept(x.getSelect()); + return false; + } + + @Override + public void endVisit(MySqlCursorDeclareStatement x) { + + } + + @Override public boolean visit(MySqlUpdateTableSource x) { if (x.getUpdate() != null) { return this.visit(x.getUpdate()); @@ -1452,16 +1384,6 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS } - @Override - public boolean visit(MySqlSubPartitionByHash x) { - return false; - } - - @Override - public void endVisit(MySqlSubPartitionByHash x) { - - } - @Override public boolean visit(MySqlSubPartitionByKey x) { return false; @@ -1469,16 +1391,16 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public void endVisit(MySqlSubPartitionByKey x) { - + } - + @Override public boolean visit(MySqlSubPartitionByList x) { return false; } - + @Override public void endVisit(MySqlSubPartitionByList x) { - + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/OraclePartitionByRangeClause.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/OraclePartitionByRangeClause.java deleted file mode 100644 index e1fb2f9bc2..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/OraclePartitionByRangeClause.java +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright 1999-2101 Alibaba Group Holding Ltd. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.alibaba.druid.sql.dialect.oracle.ast.clause; - -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.ast.SQLPartitioningClause; -import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; -import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; - -public class OraclePartitionByRangeClause extends OracleSQLObjectImpl implements SQLPartitioningClause { - - private List columns = new ArrayList(); - - private SQLExpr interval; - private List storeIn = new ArrayList(); - - private List ranges = new ArrayList(); - - @Override - public void accept0(OracleASTVisitor visitor) { - if (visitor.visit(this)) { - acceptChild(visitor, columns); - acceptChild(visitor, interval); - acceptChild(visitor, storeIn); - acceptChild(visitor, ranges); - } - visitor.endVisit(this); - } - - public List getRanges() { - return ranges; - } - - public void setRanges(List ranges) { - this.ranges = ranges; - } - - public List getStoreIn() { - return storeIn; - } - - public void setStoreIn(List storeIn) { - this.storeIn = storeIn; - } - - public SQLExpr getInterval() { - return interval; - } - - public void setInterval(SQLExpr interval) { - this.interval = interval; - } - - public List getColumns() { - return columns; - } - - public void setColumns(List columns) { - this.columns = columns; - } - -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateTableStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateTableStatement.java index 0940c20441..d98d32349e 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleCreateTableStatement.java @@ -17,7 +17,7 @@ package com.alibaba.druid.sql.dialect.oracle.ast.stmt; 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.ast.SQLPartitionBy; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleLobStorageClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; @@ -53,7 +53,7 @@ public class OracleCreateTableStatement extends SQLCreateTableStatement implemen private Boolean cache; - private SQLPartitioningClause partitioning; + private SQLPartitionBy partitioning; private DeferredSegmentCreation deferredSegmentCreation; @@ -77,11 +77,11 @@ public class OracleCreateTableStatement extends SQLCreateTableStatement implemen this.deferredSegmentCreation = deferredSegmentCreation; } - public SQLPartitioningClause getPartitioning() { + public SQLPartitionBy getPartitioning() { return partitioning; } - public void setPartitioning(SQLPartitioningClause partitioning) { + public void setPartitioning(SQLPartitionBy partitioning) { this.partitioning = partitioning; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleCreateTableParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleCreateTableParser.java index 6bbcb0208d..a814d5102e 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleCreateTableParser.java @@ -17,9 +17,18 @@ package com.alibaba.druid.sql.dialect.oracle.parser; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLPartition; +import com.alibaba.druid.sql.ast.SQLPartitionBy; +import com.alibaba.druid.sql.ast.SQLPartitionByHash; +import com.alibaba.druid.sql.ast.SQLPartitionByList; +import com.alibaba.druid.sql.ast.SQLPartitionByRange; +import com.alibaba.druid.sql.ast.SQLPartitionValue; +import com.alibaba.druid.sql.ast.SQLSubPartition; +import com.alibaba.druid.sql.ast.SQLSubPartitionBy; +import com.alibaba.druid.sql.ast.SQLSubPartitionByHash; +import com.alibaba.druid.sql.ast.SQLSubPartitionByList; +import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleLobStorageClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OraclePartitionByRangeClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleRangeValuesClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement.DeferredSegmentCreation; @@ -135,86 +144,23 @@ public class OracleCreateTableParser extends SQLCreateTableParser { continue; } else if (identifierEquals("PARTITION")) { lexer.nextToken(); + accept(Token.BY); if (identifierEquals("RANGE")) { - lexer.nextToken(); - accept(Token.LPAREN); - OraclePartitionByRangeClause clause = new OraclePartitionByRangeClause(); - for (;;) { - SQLName column = this.exprParser.name(); - clause.getColumns().add(column); - - if (lexer.token() == Token.COMMA) { - lexer.nextToken(); - continue; - } - - break; - } - accept(Token.RPAREN); - - if (identifierEquals("INTERVAL")) { - lexer.nextToken(); - clause.setInterval(this.exprParser.expr()); - } - - if (lexer.token() == Token.STORE) { - lexer.nextToken(); - accept(Token.IN); - accept(Token.LPAREN); - for (;;) { - SQLName tablespace = this.exprParser.name(); - clause.getStoreIn().add(tablespace); - - if (lexer.token() == Token.COMMA) { - lexer.nextToken(); - continue; - } - - break; - } - accept(Token.RPAREN); - } - - accept(Token.LPAREN); - - for (;;) { - acceptIdentifier("PARTITION"); - OracleRangeValuesClause range = new OracleRangeValuesClause(); - range.setName(this.exprParser.name()); - - accept(Token.VALUES); - acceptIdentifier("LESS"); - acceptIdentifier("THAN"); - - accept(Token.LPAREN); - for (;;) { - SQLExpr rangeValue = this.exprParser.expr(); - range.getValues().add(rangeValue); - - if (lexer.token() == Token.COMMA) { - lexer.nextToken(); - continue; - } - - break; - } - accept(Token.RPAREN); - - clause.getRanges().add(range); - - if (lexer.token() == Token.COMMA) { - lexer.nextToken(); - continue; - } - - break; - } - - accept(Token.RPAREN); - - stmt.setPartitioning(clause); + SQLPartitionByRange partitionByRange = partitionByRange(); + partitionClauseRest(partitionByRange); + stmt.setPartitioning(partitionByRange); + continue; + } else if (identifierEquals("HASH")) { + SQLPartitionByHash partitionByHash = partitionByHash(); + partitionClauseRest(partitionByHash); + stmt.setPartitioning(partitionByHash); + continue; + } else if (identifierEquals("LIST")) { + SQLPartitionByList partitionByList = partitionByList(); + partitionClauseRest(partitionByList); + stmt.setPartitioning(partitionByList); continue; } else { throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); @@ -233,4 +179,214 @@ public class OracleCreateTableParser extends SQLCreateTableParser { return stmt; } + protected SQLPartitionByList partitionByList() { + acceptIdentifier("LIST"); + SQLPartitionByList partitionByList = new SQLPartitionByList(); + + accept(Token.LPAREN); + partitionByList.setExpr(this.exprParser.expr()); + accept(Token.RPAREN); + + parsePartitionByRest(partitionByList); + + return partitionByList; + } + + protected SQLPartitionByHash partitionByHash() { + acceptIdentifier("HASH"); + SQLPartitionByHash partitionByHash = new SQLPartitionByHash(); + + if (lexer.token() == Token.KEY) { + lexer.nextToken(); + partitionByHash.setKey(true); + } + + accept(Token.LPAREN); + partitionByHash.setExpr(this.exprParser.expr()); + accept(Token.RPAREN); + return partitionByHash; + } + + protected SQLPartitionByRange partitionByRange() { + acceptIdentifier("RANGE"); + accept(Token.LPAREN); + SQLPartitionByRange clause = new SQLPartitionByRange(); + for (;;) { + SQLName column = this.exprParser.name(); + clause.getColumns().add(column); + + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + + break; + } + accept(Token.RPAREN); + + if (lexer.token() == Token.INTERVAL) { + lexer.nextToken(); + accept(Token.LPAREN); + clause.setInterval(this.exprParser.expr()); + accept(Token.RPAREN); + } + + parsePartitionByRest(clause); + + return clause; + } + + protected void parsePartitionByRest(SQLPartitionBy clause) { + if (lexer.token() == Token.STORE) { + lexer.nextToken(); + accept(Token.IN); + accept(Token.LPAREN); + for (;;) { + SQLName tablespace = this.exprParser.name(); + clause.getStoreIn().add(tablespace); + + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + + break; + } + accept(Token.RPAREN); + } + + if (identifierEquals("SUBPARTITION")) { + SQLSubPartitionBy subPartitionBy = subPartitionBy(); + clause.setSubPartitionBy(subPartitionBy); + } + + accept(Token.LPAREN); + + for (;;) { + acceptIdentifier("PARTITION"); + SQLPartition range = new SQLPartition(); + range.setName(this.exprParser.name()); + + SQLPartitionValue values = parsePartitionValues(); + if (values != null) { + range.setValues(values); + } + + if (lexer.token() == Token.LPAREN) { + lexer.nextToken(); + + for (;;) { + SQLSubPartition subPartition = parseSubPartition(); + + range.getSubPartitions().add(subPartition); + + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + + break; + } + + accept(Token.RPAREN); + } else if (identifierEquals("SUBPARTITIONS")) { + lexer.nextToken(); + SQLExpr subPartitionsCount = this.exprParser.primary(); + range.setSubPartitionsCount(subPartitionsCount); + } + + clause.getPartitions().add(range); + + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + + break; + } + + accept(Token.RPAREN); + } + + protected SQLSubPartition parseSubPartition() { + acceptIdentifier("SUBPARTITION"); + + SQLSubPartition subPartition = new SQLSubPartition(); + SQLName name = this.exprParser.name(); + subPartition.setName(name); + + SQLPartitionValue values = parsePartitionValues(); + if (values != null) { + subPartition.setValues(values); + } + + return subPartition; + } + + protected void partitionClauseRest(SQLPartitionBy clause) { + if (identifierEquals("PARTITIONS")) { + lexer.nextToken(); + + SQLIntegerExpr countExpr = new SQLIntegerExpr(lexer.integerValue()); + accept(Token.LITERAL_INT); + clause.setPartitionsCount(countExpr); + } + + if (lexer.token() == Token.STORE) { + lexer.nextToken(); + accept(Token.IN); + accept(Token.LPAREN); + this.exprParser.names(clause.getStoreIn(), clause); + accept(Token.RPAREN); + } + } + + protected SQLSubPartitionBy subPartitionBy() { + lexer.nextToken(); + accept(Token.BY); + + if (identifierEquals("HASH")) { + lexer.nextToken(); + accept(Token.LPAREN); + + SQLSubPartitionByHash byHash = new SQLSubPartitionByHash(); + SQLExpr expr = this.exprParser.expr(); + byHash.setExpr(expr); + accept(Token.RPAREN); + + return byHash; + } else if (identifierEquals("LIST")) { + lexer.nextToken(); + accept(Token.LPAREN); + + SQLSubPartitionByList byList = new SQLSubPartitionByList(); + SQLName column = this.exprParser.name(); + byList.setColumn(column); + accept(Token.RPAREN); + + if (identifierEquals("SUBPARTITION")) { + lexer.nextToken(); + acceptIdentifier("TEMPLATE"); + accept(Token.LPAREN); + + for (;;) { + SQLSubPartition subPartition = parseSubPartition(); + subPartition.setParent(byList); + byList.getSubPartitionTemplate().add(subPartition); + + if (lexer.token() == Token.COMMA) { + lexer.nextToken(); + continue; + } + break; + } + accept(Token.RPAREN); + } + + return byList; + } + + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java index e05e6464c4..9a1e16913c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java @@ -25,8 +25,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause.Vers import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleLobStorageClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OraclePartitionByRangeClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleRangeValuesClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleWithSubqueryEntry; @@ -476,14 +474,6 @@ public interface OracleASTVisitor extends SQLASTVisitor { void endVisit(OracleCreateSequenceStatement x); - boolean visit(OracleRangeValuesClause x); - - void endVisit(OracleRangeValuesClause x); - - boolean visit(OraclePartitionByRangeClause x); - - void endVisit(OraclePartitionByRangeClause x); - boolean visit(OracleExitStatement x); void endVisit(OracleExitStatement x); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java index f1d97ea33a..4859f0a3d0 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java @@ -33,8 +33,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.QueryPartitio import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ReturnRowsClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleLobStorageClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OraclePartitionByRangeClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleRangeValuesClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleWithSubqueryEntry; @@ -1065,26 +1063,6 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora } - @Override - public boolean visit(OracleRangeValuesClause x) { - return true; - } - - @Override - public void endVisit(OracleRangeValuesClause x) { - - } - - @Override - public boolean visit(OraclePartitionByRangeClause x) { - return true; - } - - @Override - public void endVisit(OraclePartitionByRangeClause x) { - - } - @Override public boolean visit(OracleExitStatement x) { return true; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java index 7d68d8f326..a39ff01d61 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java @@ -66,8 +66,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ReferenceMode import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ReturnRowsClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleLobStorageClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OraclePartitionByRangeClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleRangeValuesClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleWithSubqueryEntry; @@ -156,10 +154,14 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUnique; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUpdateStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUsingIndexClause; import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; +import com.alibaba.druid.util.JdbcConstants; public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleASTVisitor { private final boolean printPostSemi; + { + this.dbType = JdbcConstants.ORACLE; + } public OracleOutputVisitor(Appendable appender){ this(appender, true); @@ -2776,59 +2778,6 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS } - @Override - public boolean visit(OracleRangeValuesClause x) { - print0(ucase ? "PARTITION " : "partition "); - x.getName().accept(this); - print0(ucase ? " VALUES LESS THAN (" : " values less than ("); - printAndAccept(x.getValues(), ", "); - print(')'); - return false; - } - - @Override - public void endVisit(OracleRangeValuesClause x) { - - } - - @Override - public boolean visit(OraclePartitionByRangeClause x) { - print0(ucase ? "PARTITION BY RANGE (" : "partition by range ("); - printAndAccept(x.getColumns(), ", "); - print(')'); - - if (x.getInterval() != null) { - print0(ucase ? " INTERVAL " : " interval "); - x.getInterval().accept(this); - } - - if (x.getStoreIn().size() > 0) { - print0(ucase ? " STORE IN (" : " store in ("); - printAndAccept(x.getStoreIn(), ", "); - print(')'); - } - - println(); - print('('); - incrementIndent(); - for (int i = 0, size = x.getRanges().size(); i < size; ++i) { - if (i != 0) { - print(','); - } - println(); - x.getRanges().get(i).accept(this); - } - decrementIndent(); - println(); - print(')'); - return false; - } - - @Override - public void endVisit(OraclePartitionByRangeClause x) { - - } - @Override public boolean visit(OracleExitStatement x) { print0(ucase ? "EXIT" : "exit"); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java index c531e8fc23..7fd8330cc5 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java @@ -55,8 +55,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.QueryPartitio import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ReturnRowsClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleLobStorageClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OraclePartitionByRangeClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleRangeValuesClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleWithSubqueryEntry; @@ -1458,26 +1456,6 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle } - @Override - public boolean visit(OracleRangeValuesClause x) { - return false; - } - - @Override - public void endVisit(OracleRangeValuesClause x) { - - } - - @Override - public boolean visit(OraclePartitionByRangeClause x) { - return false; - } - - @Override - public void endVisit(OraclePartitionByRangeClause x) { - - } - @Override public boolean visit(OracleExitStatement x) { return true; diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java index 842af158f8..48bdc3cdd9 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java @@ -16,6 +16,9 @@ package com.alibaba.druid.sql.parser; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLPartition; +import com.alibaba.druid.sql.ast.SQLPartitionValue; +import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLConstraint; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; @@ -90,7 +93,7 @@ public class SQLCreateTableParser extends SQLDDLParser { if (lexer.token() == Token.COMMA) { lexer.nextToken(); - + if (lexer.token() == Token.RPAREN) { // compatible for sql server break; } @@ -126,4 +129,45 @@ public class SQLCreateTableParser extends SQLDDLParser { protected SQLCreateTableStatement newCreateStatement() { return new SQLCreateTableStatement(getDbType()); } + + protected SQLPartitionValue parsePartitionValues() { + if (lexer.token() != Token.VALUES) { + return null; + } + lexer.nextToken(); + + SQLPartitionValue values = null; + + if (lexer.token() == Token.IN) { + lexer.nextToken(); + values = new SQLPartitionValue(SQLPartitionValue.Operator.In); + + accept(Token.LPAREN); + this.exprParser.exprList(values.getItems(), values); + accept(Token.RPAREN); + } else if (identifierEquals("LESS")) { + lexer.nextToken(); + acceptIdentifier("THAN"); + + values = new SQLPartitionValue(SQLPartitionValue.Operator.LessThan); + + if (identifierEquals("MAXVALUE")) { + SQLIdentifierExpr maxValue = new SQLIdentifierExpr(lexer.stringVal()); + lexer.nextToken(); + maxValue.setParent(values); + values.getItems().add(maxValue); + } else { + accept(Token.LPAREN); + this.exprParser.exprList(values.getItems(), values); + accept(Token.RPAREN); + } + } else if (lexer.token() == Token.LPAREN) { + values = new SQLPartitionValue(SQLPartitionValue.Operator.List); + lexer.nextToken(); + this.exprParser.exprList(values.getItems(), values); + accept(Token.RPAREN); + } + + return values; + } } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index d0030a8c57..fd9cd81469 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -34,8 +34,17 @@ import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLOrderBy; import com.alibaba.druid.sql.ast.SQLOver; import com.alibaba.druid.sql.ast.SQLParameter; +import com.alibaba.druid.sql.ast.SQLPartition; +import com.alibaba.druid.sql.ast.SQLPartitionBy; +import com.alibaba.druid.sql.ast.SQLPartitionByHash; +import com.alibaba.druid.sql.ast.SQLPartitionByList; +import com.alibaba.druid.sql.ast.SQLPartitionByRange; +import com.alibaba.druid.sql.ast.SQLPartitionValue; import com.alibaba.druid.sql.ast.SQLSetQuantifier; import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.SQLSubPartition; +import com.alibaba.druid.sql.ast.SQLSubPartitionByHash; +import com.alibaba.druid.sql.ast.SQLSubPartitionByList; import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; import com.alibaba.druid.sql.ast.expr.SQLAllExpr; @@ -2673,6 +2682,31 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab return false; } + @Override + public boolean visit(SQLPartitionValue x) { + if (x.getOperator() == SQLPartitionValue.Operator.LessThan // + && (!JdbcConstants.ORACLE.equals(getDbType())) + && x.getItems().size() == 1 // + && x.getItems().get(0) instanceof SQLIdentifierExpr) { + SQLIdentifierExpr ident = (SQLIdentifierExpr) x.getItems().get(0); + if ("MAXVALUE".equalsIgnoreCase(ident.getName())) { + print0(ucase ? "VALUES LESS THAN MAXVALUE" : "values less than maxvalue"); + return false; + } + } + + if (x.getOperator() == SQLPartitionValue.Operator.LessThan) { + print0(ucase ? "VALUES LESS THAN (" : "values less than ("); + } else if (x.getOperator() == SQLPartitionValue.Operator.In) { + print0(ucase ? "VALUES IN (" : "values in ("); + } else { + print(ucase ? "VALUES (" : "values ("); + } + printAndAccept(x.getItems(), ", "); + print(')'); + return false; + } + public String getDbType() { return dbType; } @@ -2684,4 +2718,273 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab public void setUppCase(boolean val) { this.ucase = val; } + + @Override + public boolean visit(SQLPartition x) { + print0(ucase ? "PARTITION " : "partition "); + x.getName().accept(this); + if (x.getValues() != null) { + print(' '); + x.getValues().accept(this); + } + + if (x.getDataDirectory() != null) { + incrementIndent(); + println(); + print0(ucase ? "DATA DIRECTORY " : "data directory "); + x.getDataDirectory().accept(this); + decrementIndent(); + } + + if (x.getIndexDirectory() != null) { + incrementIndent(); + println(); + print0(ucase ? "INDEX DIRECTORY " : "index directory "); + x.getIndexDirectory().accept(this); + decrementIndent(); + } + + if (x.getTableSpace() != null) { + print0(ucase ? " TABLESPACE " : " tablespace "); + x.getTableSpace().accept(this); + } + + if (x.getEngine() != null) { + print0(ucase ? " STORAGE ENGINE " : " storage engine "); + x.getEngine().accept(this); + } + + if (x.getMaxRows() != null) { + print0(ucase ? " MAX_ROWS " : " max_rows "); + x.getMaxRows().accept(this); + } + + if (x.getMinRows() != null) { + print0(ucase ? " MIN_ROWS " : " min_rows "); + x.getMinRows().accept(this); + } + + if (x.getComment() != null) { + print0(ucase ? " COMMENT " : " comment "); + x.getComment().accept(this); + } + + if (x.getSubPartitionsCount() != null) { + incrementIndent(); + println(); + print0(ucase ? "SUBPARTITIONS " : "subpartitions "); + x.getSubPartitionsCount().accept(this); + decrementIndent(); + } + + if (x.getSubPartitions().size() > 0) { + println(); + print('('); + incrementIndent(); + for (int i = 0; i < x.getSubPartitions().size(); ++i) { + if (i != 0) { + print(','); + } + println(); + x.getSubPartitions().get(i).accept(this); + } + decrementIndent(); + println(); + print(')'); + } + + return false; + } + + @Override + public boolean visit(SQLPartitionByRange x) { + print0(ucase ? "PARTITION BY RANGE" : "partition by range"); + if (x.getExpr() != null) { + print0(" ("); + x.getExpr().accept(this); + print(')'); + } else { + if (JdbcConstants.MYSQL.equals(getDbType())) { + print0(ucase ? " COLUMNS (" : " columns ("); + } else { + print0(" ("); + } + printAndAccept(x.getColumns(), ", "); + print(')'); + } + + if (x.getInterval() != null) { + print0(ucase ? " INTERVAL " : " interval "); + x.getInterval().accept(this); + } + + printPartitionsCountAndSubPartitions(x); + + println(); + print('('); + incrementIndent(); + for (int i = 0, size = x.getPartitions().size(); i < size; ++i) { + if (i != 0) { + print(','); + } + println(); + x.getPartitions().get(i).accept(this); + } + decrementIndent(); + println(); + print(')'); + + return false; + } + + @Override + public boolean visit(SQLPartitionByList x) { + print0(ucase ? "PARTITION BY LIST " : "partition by list "); + if (x.getExpr() != null) { + print('('); + x.getExpr().accept(this); + print0(")"); + } else { + print0(ucase ? "COLUMNS (" : "columns ("); + printAndAccept(x.getColumns(), ", "); + print0(")"); + } + + printPartitionsCountAndSubPartitions(x); + + List partitions = x.getPartitions(); + int partitionsSize = partitions.size(); + if (partitionsSize > 0) { + println(); + incrementIndent(); + print('('); + for (int i = 0; i < partitionsSize; ++i) { + println(); + partitions.get(i).accept(this); + if (i != partitionsSize - 1) { + print0(", "); + } + } + decrementIndent(); + println(); + print(')'); + } + return false; + } + + @Override + public boolean visit(SQLPartitionByHash x) { + if (x.isLinear()) { + print0(ucase ? "PARTITION BY LINEAR HASH " : "partition by linear hash "); + } else { + print0(ucase ? "PARTITION BY HASH " : "partition by hash "); + } + + if (x.isKey()) { + print0(ucase ? "KEY" : "key"); + } + + print('('); + x.getExpr().accept(this); + print(')'); + + printPartitionsCountAndSubPartitions(x); + + return false; + } + + protected void printPartitionsCountAndSubPartitions(SQLPartitionBy x) { + if (x.getPartitionsCount() != null) { + + if (Boolean.TRUE.equals(x.getAttribute("ads.partition"))) { + print0(ucase ? " PARTITION NUM " : " partition num "); + } else { + print0(ucase ? " PARTITIONS " : " partitions "); + } + + x.getPartitionsCount().accept(this); + } + + if (x.getSubPartitionBy() != null) { + println(); + x.getSubPartitionBy().accept(this); + } + + if (x.getStoreIn().size() > 0) { + println(); + print0(ucase ? "STORE IN (" : "store in ("); + printAndAccept(x.getStoreIn(), ", "); + print(')'); + } + } + + @Override + public boolean visit(SQLSubPartitionByHash x) { + if (x.isLinear()) { + print0(ucase ? "SUBPARTITION BY LINEAR HASH " : "subpartition by linear hash "); + } else { + print0(ucase ? "SUBPARTITION BY HASH " : "subpartition by hash "); + } + + if (x.isKey()) { + print0(ucase ? "KEY" : "key"); + } + + print('('); + x.getExpr().accept(this); + print(')'); + + if (x.getSubPartitionsCount() != null) { + print0(ucase ? " SUBPARTITIONS " : " subpartitions "); + x.getSubPartitionsCount().accept(this); + } + + return false; + } + + @Override + public boolean visit(SQLSubPartitionByList x) { + if (x.isLinear()) { + print0(ucase ? "SUBPARTITION BY LINEAR HASH " : "subpartition by linear hash "); + } else { + print0(ucase ? "SUBPARTITION BY HASH " : "subpartition by hash "); + } + + print('('); + x.getColumn().accept(this); + print(')'); + + if (x.getSubPartitionsCount() != null) { + print0(ucase ? " SUBPARTITIONS " : " subpartitions "); + x.getSubPartitionsCount().accept(this); + } + + if (x.getSubPartitionTemplate().size() > 0) { + incrementIndent(); + println(); + print0(ucase ? "SUBPARTITION TEMPLATE (" : "subpartition template ("); + incrementIndent(); + println(); + printlnAndAccept(x.getSubPartitionTemplate(), ","); + decrementIndent(); + println(); + print(')'); + decrementIndent(); + } + + return false; + } + + @Override + public boolean visit(SQLSubPartition x) { + print0(ucase ? "SUBPARTITION " : "subpartition "); + x.getName().accept(this); + + if (x.getValues() != null) { + print(' '); + x.getValues().accept(this); + } + + return false; + } } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java index 6bdbbfa98b..d457186c52 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java @@ -22,6 +22,14 @@ import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLOrderBy; import com.alibaba.druid.sql.ast.SQLOver; import com.alibaba.druid.sql.ast.SQLParameter; +import com.alibaba.druid.sql.ast.SQLPartition; +import com.alibaba.druid.sql.ast.SQLPartitionByHash; +import com.alibaba.druid.sql.ast.SQLPartitionByList; +import com.alibaba.druid.sql.ast.SQLPartitionByRange; +import com.alibaba.druid.sql.ast.SQLPartitionValue; +import com.alibaba.druid.sql.ast.SQLSubPartition; +import com.alibaba.druid.sql.ast.SQLSubPartitionByHash; +import com.alibaba.druid.sql.ast.SQLSubPartitionByList; import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; import com.alibaba.druid.sql.ast.expr.SQLAllExpr; @@ -686,4 +694,36 @@ public interface SQLASTVisitor { boolean visit(SQLDeclareItem x); void endVisit(SQLDeclareItem x); + + boolean visit(SQLPartitionValue x); + + void endVisit(SQLPartitionValue x); + + boolean visit(SQLPartition x); + + void endVisit(SQLPartition x); + + boolean visit(SQLPartitionByRange x); + + void endVisit(SQLPartitionByRange x); + + boolean visit(SQLPartitionByHash x); + + void endVisit(SQLPartitionByHash x); + + boolean visit(SQLPartitionByList x); + + void endVisit(SQLPartitionByList x); + + boolean visit(SQLSubPartition x); + + void endVisit(SQLSubPartition x); + + boolean visit(SQLSubPartitionByHash x); + + void endVisit(SQLSubPartitionByHash x); + + boolean visit(SQLSubPartitionByList x); + + void endVisit(SQLSubPartitionByList x); } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java index 7f81012b68..9a67949170 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java @@ -23,6 +23,14 @@ import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLOrderBy; import com.alibaba.druid.sql.ast.SQLOver; import com.alibaba.druid.sql.ast.SQLParameter; +import com.alibaba.druid.sql.ast.SQLPartition; +import com.alibaba.druid.sql.ast.SQLPartitionByHash; +import com.alibaba.druid.sql.ast.SQLPartitionByList; +import com.alibaba.druid.sql.ast.SQLPartitionByRange; +import com.alibaba.druid.sql.ast.SQLPartitionValue; +import com.alibaba.druid.sql.ast.SQLSubPartition; +import com.alibaba.druid.sql.ast.SQLSubPartitionByHash; +import com.alibaba.druid.sql.ast.SQLSubPartitionByList; import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; import com.alibaba.druid.sql.ast.expr.SQLAllExpr; @@ -1375,5 +1383,85 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { @Override public void endVisit(SQLDeclareItem x) { } + + @Override + public boolean visit(SQLPartitionValue x) { + return true; + } + + @Override + public void endVisit(SQLPartitionValue x) { + + } + + @Override + public boolean visit(SQLPartition x) { + return true; + } + + @Override + public void endVisit(SQLPartition x) { + + } + + @Override + public boolean visit(SQLPartitionByRange x) { + return true; + } + + @Override + public void endVisit(SQLPartitionByRange x) { + + } + + @Override + public boolean visit(SQLPartitionByHash x) { + return true; + } + + @Override + public void endVisit(SQLPartitionByHash x) { + + } + + @Override + public boolean visit(SQLPartitionByList x) { + return true; + } + + @Override + public void endVisit(SQLPartitionByList x) { + + } + + @Override + public boolean visit(SQLSubPartition x) { + return true; + } + + @Override + public void endVisit(SQLSubPartition x) { + + } + + @Override + public boolean visit(SQLSubPartitionByHash x) { + return true; + } + + @Override + public void endVisit(SQLSubPartitionByHash x) { + + } + + @Override + public boolean visit(SQLSubPartitionByList x) { + return true; + } + + @Override + public void endVisit(SQLSubPartitionByList x) { + + } } 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 1851502712..0a6de9ea32 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -30,6 +30,13 @@ import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLOrderBy; import com.alibaba.druid.sql.ast.SQLOrderingSpecification; import com.alibaba.druid.sql.ast.SQLParameter; +import com.alibaba.druid.sql.ast.SQLPartition; +import com.alibaba.druid.sql.ast.SQLPartitionByHash; +import com.alibaba.druid.sql.ast.SQLPartitionByList; +import com.alibaba.druid.sql.ast.SQLPartitionByRange; +import com.alibaba.druid.sql.ast.SQLPartitionValue; +import com.alibaba.druid.sql.ast.SQLSubPartition; +import com.alibaba.druid.sql.ast.SQLSubPartitionByHash; import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; import com.alibaba.druid.sql.ast.expr.SQLArrayExpr; @@ -1460,4 +1467,39 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { public boolean visit(SQLDeclareItem x) { return false; } + + @Override + public boolean visit(SQLPartitionByHash x) { + return false; + } + + @Override + public boolean visit(SQLPartitionByRange x) { + return false; + } + + @Override + public boolean visit(SQLPartitionByList x) { + return false; + } + + @Override + public boolean visit(SQLPartition x) { + return false; + } + + @Override + public boolean visit(SQLSubPartition x) { + return false; + } + + @Override + public boolean visit(SQLSubPartitionByHash x) { + return false; + } + + @Override + public boolean visit(SQLPartitionValue x) { + return false; + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlASTVisitorAdapterTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlASTVisitorAdapterTest.java index e864c0af36..0c93eacadf 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlASTVisitorAdapterTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlASTVisitorAdapterTest.java @@ -30,13 +30,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlInsertStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlKillStatement; 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.MySqlPartitionByList; -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; @@ -184,11 +178,5 @@ public class MySqlASTVisitorAdapterTest extends TestCase { new MySqlAlterTableDiscardTablespace().accept(adapter); new MySqlAlterTableImportTablespace().accept(adapter); new TableSpaceOption().accept(adapter); - new MySqlPartitionByHash ().accept(adapter); - new MySqlPartitionByRange ().accept(adapter); - new MySqlPartitioningDef ().accept(adapter); - new LessThanValues ().accept(adapter); - new InValues ().accept(adapter); - new MySqlPartitionByList ().accept(adapter); } } 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 index 32b53b8839..3e89f43e42 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest42.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest42.java @@ -66,10 +66,11 @@ public class MySqlCreateTableTest42 extends MysqlTest { "\n\ta INT NOT NULL, " + // "\n\tb INT NOT NULL" + // "\n)" - + "\nPARTITION BY RANGE COLUMNS (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), " + // + + "\nPARTITION BY RANGE COLUMNS (a, b)" + + "\n(" + // + "\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); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest43.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest43.java index df9e84efe4..d9fc146104 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest43.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest43.java @@ -66,7 +66,8 @@ public class MySqlCreateTableTest43 extends MysqlTest { "\n\tid INT, " + // "\n\tname VARCHAR(35)" + // "\n)" - + "\nPARTITION BY LIST (id) (" + // + + "\nPARTITION BY LIST (id)" + + "\n(" + // "\n\tPARTITION r0 VALUES IN (1, 5, 9, 13, 17, 21), " + // "\n\tPARTITION r1 VALUES IN (2, 6, 10, 14, 18, 22), " + // "\n\tPARTITION r2 VALUES IN (3, 7, 11, 15, 19, 23), " + // diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest44.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest44.java index b3c9d39bc0..15d3b0d742 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest44.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest44.java @@ -66,7 +66,8 @@ public class MySqlCreateTableTest44 extends MysqlTest { "\n\ta INT NULL, " + // "\n\tb INT NULL" + // "\n)" + // - "\nPARTITION BY LIST COLUMNS (a, b) (" + // + "\nPARTITION BY LIST COLUMNS (a, b)" + + "\n(" + // "\n\tPARTITION p0 VALUES IN ((0, 0), (NULL, NULL)), " + // "\n\tPARTITION p1 VALUES IN ((0, 1), (0, 2), (0, 3), (1, 1), (1, 2)), " + // "\n\tPARTITION p2 VALUES IN ((1, 0), (2, 0), (2, 1), (3, 0), (3, 1)), " + // diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest45.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest45.java index bbdcc39f82..5ba235bce9 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest45.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest45.java @@ -73,7 +73,8 @@ public class MySqlCreateTableTest45 extends MysqlTest { "\n\tname VARCHAR(30), " + // "\n\tadate DATE" + // "\n)" + // - "\nPARTITION BY LIST (YEAR(adate)) (" + // + "\nPARTITION BY LIST (YEAR(adate))" + // + "\n(" + // "\n\tPARTITION p1999 VALUES IN (1995, 1999, 2003)" + // "\n\t\tDATA DIRECTORY '/var/appdata/95/data'" + // "\n\t\tINDEX DIRECTORY '/var/appdata/95/idx', " + // diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest67.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest67.java index 0835650bc2..a6943a0bf1 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest67.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest67.java @@ -46,9 +46,10 @@ public class MySqlCreateTableTest67 extends MysqlTest { + "\n\ta INT NOT NULL, " + "\n\tPRIMARY KEY (a)" + "\n) ENGINE = InnoDB TABLESPACE ts1" - + "\nPARTITION BY RANGE (a) PARTITIONS 3 (" - + "\n\tPARTITION P1 VALUES LESS THAN (2), " - + "\n\tPARTITION P2 VALUES LESS THAN (4) TABLESPACE ts2, " + + "\nPARTITION BY RANGE (a) PARTITIONS 3" + + "\n(" + + "\n\tPARTITION P1 VALUES LESS THAN (2)," + + "\n\tPARTITION P2 VALUES LESS THAN (4) TABLESPACE ts2," + "\n\tPARTITION P3 VALUES LESS THAN (6) TABLESPACE ts3" + "\n)", output); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest68.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest68.java index b3dcfa5d21..ce66d8a50c 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest68.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest68.java @@ -52,12 +52,13 @@ public class MySqlCreateTableTest68 extends MysqlTest { + "\n\tyear_col INT, " + "\n\tsome_data INT" + "\n)" - + "\nPARTITION BY RANGE (year_col) (" - + "\n\tPARTITION p0 VALUES LESS THAN (1991), " - + "\n\tPARTITION p1 VALUES LESS THAN (1995), " - + "\n\tPARTITION p2 VALUES LESS THAN (1999), " - + "\n\tPARTITION p3 VALUES LESS THAN (2002), " - + "\n\tPARTITION p4 VALUES LESS THAN (2006), " + + "\nPARTITION BY RANGE (year_col)" + + "\n(" + + "\n\tPARTITION p0 VALUES LESS THAN (1991)," + + "\n\tPARTITION p1 VALUES LESS THAN (1995)," + + "\n\tPARTITION p2 VALUES LESS THAN (1999)," + + "\n\tPARTITION p3 VALUES LESS THAN (2002)," + + "\n\tPARTITION p4 VALUES LESS THAN (2006)," + "\n\tPARTITION p5 VALUES LESS THAN MAXVALUE" + "\n)", output); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest36.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest36.java new file mode 100644 index 0000000000..a334659608 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest36.java @@ -0,0 +1,124 @@ +/* + * Copyright 1999-2101 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +public class OracleCreateTableTest36 extends OracleTest { + + public void test_types() throws Exception { + String sql = // + "CREATE TABLE composite_sales" + + " ( prod_id NUMBER(6)" + + " , cust_id NUMBER" + + " , time_id DATE" + + " , channel_id CHAR(1)" + + " , promo_id NUMBER(6)" + + " , quantity_sold NUMBER(3)" + + " , amount_sold NUMBER(10,2)" + + " ) " + + "PARTITION BY RANGE (time_id)" + + "SUBPARTITION BY HASH (channel_id)" + + " (PARTITION SALES_Q1_1998 VALUES LESS THAN (TO_DATE('01-APR-1998','DD-MON-YYYY'))," + + " PARTITION SALES_Q2_1998 VALUES LESS THAN (TO_DATE('01-JUL-1998','DD-MON-YYYY'))," + + " PARTITION SALES_Q3_1998 VALUES LESS THAN (TO_DATE('01-OCT-1998','DD-MON-YYYY'))," + + " PARTITION SALES_Q4_1998 VALUES LESS THAN (TO_DATE('01-JAN-1999','DD-MON-YYYY'))," + + " PARTITION SALES_Q1_1999 VALUES LESS THAN (TO_DATE('01-APR-1999','DD-MON-YYYY'))," + + " PARTITION SALES_Q2_1999 VALUES LESS THAN (TO_DATE('01-JUL-1999','DD-MON-YYYY'))," + + " PARTITION SALES_Q3_1999 VALUES LESS THAN (TO_DATE('01-OCT-1999','DD-MON-YYYY'))," + + " PARTITION SALES_Q4_1999 VALUES LESS THAN (TO_DATE('01-JAN-2000','DD-MON-YYYY'))," + + " PARTITION SALES_Q1_2000 VALUES LESS THAN (TO_DATE('01-APR-2000','DD-MON-YYYY'))," + + " PARTITION SALES_Q2_2000 VALUES LESS THAN (TO_DATE('01-JUL-2000','DD-MON-YYYY'))" + + " SUBPARTITIONS 8," + + " PARTITION SALES_Q3_2000 VALUES LESS THAN (TO_DATE('01-OCT-2000','DD-MON-YYYY'))" + + " (SUBPARTITION ch_c," + + " SUBPARTITION ch_i," + + " SUBPARTITION ch_p," + + " SUBPARTITION ch_s," + + " SUBPARTITION ch_t)," + + " PARTITION SALES_Q4_2000 VALUES LESS THAN (MAXVALUE)" + + " SUBPARTITIONS 4)" + + ";"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("CREATE TABLE composite_sales (" + + "\n\tprod_id NUMBER(6)," + + "\n\tcust_id NUMBER," + + "\n\ttime_id DATE," + + "\n\tchannel_id CHAR(1)," + + "\n\tpromo_id NUMBER(6)," + + "\n\tquantity_sold NUMBER(3)," + + "\n\tamount_sold NUMBER(10, 2)" + + "\n)" + + "\nPARTITION BY RANGE (time_id)" + + "\nSUBPARTITION BY HASH (channel_id)" + + "\n(" + + "\n\tPARTITION SALES_Q1_1998 VALUES LESS THAN (TO_DATE('01-APR-1998', 'DD-MON-YYYY'))," + + "\n\tPARTITION SALES_Q2_1998 VALUES LESS THAN (TO_DATE('01-JUL-1998', 'DD-MON-YYYY'))," + + "\n\tPARTITION SALES_Q3_1998 VALUES LESS THAN (TO_DATE('01-OCT-1998', 'DD-MON-YYYY'))," + + "\n\tPARTITION SALES_Q4_1998 VALUES LESS THAN (TO_DATE('01-JAN-1999', 'DD-MON-YYYY'))," + + "\n\tPARTITION SALES_Q1_1999 VALUES LESS THAN (TO_DATE('01-APR-1999', 'DD-MON-YYYY'))," + + "\n\tPARTITION SALES_Q2_1999 VALUES LESS THAN (TO_DATE('01-JUL-1999', 'DD-MON-YYYY'))," + + "\n\tPARTITION SALES_Q3_1999 VALUES LESS THAN (TO_DATE('01-OCT-1999', 'DD-MON-YYYY'))," + + "\n\tPARTITION SALES_Q4_1999 VALUES LESS THAN (TO_DATE('01-JAN-2000', 'DD-MON-YYYY'))," + + "\n\tPARTITION SALES_Q1_2000 VALUES LESS THAN (TO_DATE('01-APR-2000', 'DD-MON-YYYY'))," + + "\n\tPARTITION SALES_Q2_2000 VALUES LESS THAN (TO_DATE('01-JUL-2000', 'DD-MON-YYYY'))" + + "\n\t\tSUBPARTITIONS 8," + + "\n\tPARTITION SALES_Q3_2000 VALUES LESS THAN (TO_DATE('01-OCT-2000', 'DD-MON-YYYY'))" + + "\n\t(" + + "\n\t\tSUBPARTITION ch_c," + + "\n\t\tSUBPARTITION ch_i," + + "\n\t\tSUBPARTITION ch_p," + + "\n\t\tSUBPARTITION ch_s," + + "\n\t\tSUBPARTITION ch_t" + + "\n\t)," + + "\n\tPARTITION SALES_Q4_2000 VALUES LESS THAN (MAXVALUE)" + + "\n\t\tSUBPARTITIONS 4" + + "\n)",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertEquals(7, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("composite_sales", "prod_id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest37.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest37.java new file mode 100644 index 0000000000..122f905489 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest37.java @@ -0,0 +1,96 @@ +/* + * Copyright 1999-2101 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +public class OracleCreateTableTest37 extends OracleTest { + + public void test_types() throws Exception { + String sql = // + "CREATE TABLE hash_products " + + " ( product_id NUMBER(6) PRIMARY KEY" + + " , product_name VARCHAR2(50) " + + " , product_description VARCHAR2(2000) " + + " , category_id NUMBER(2) " + + " , weight_class NUMBER(1) " + + " , warranty_period INTERVAL YEAR TO MONTH " + + " , supplier_id NUMBER(6) " + + " , product_status VARCHAR2(20) " + + " , list_price NUMBER(8,2) " + + " , min_price NUMBER(8,2) " + + " , catalog_url VARCHAR2(50) " + + " , CONSTRAINT product_status_lov_demo " + + " CHECK (product_status in ('orderable' " + + " ,'planned' " + + " ,'under development' " + + " ,'obsolete') " + + ") ) " + + " PARTITION BY HASH (product_id) " + + " PARTITIONS 4 " + + " STORE IN (tbs_01, tbs_02, tbs_03, tbs_04);"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("CREATE TABLE hash_products (" + + "\n\tproduct_id NUMBER(6) PRIMARY KEY," + + "\n\tproduct_name VARCHAR2(50)," + + "\n\tproduct_description VARCHAR2(2000)," + + "\n\tcategory_id NUMBER(2)," + + "\n\tweight_class NUMBER(1)," + + "\n\twarranty_period INTERVAL YEAR TO MONTH," + + "\n\tsupplier_id NUMBER(6)," + + "\n\tproduct_status VARCHAR2(20)," + + "\n\tlist_price NUMBER(8, 2)," + + "\n\tmin_price NUMBER(8, 2)," + + "\n\tcatalog_url VARCHAR2(50)," + + "\n\tCONSTRAINT product_status_lov_demo CHECK (product_status IN ('orderable', 'planned', 'under development', 'obsolete'))" + + "\n)" + + "\nPARTITION BY HASH (product_id) PARTITIONS 4" + + "\nSTORE IN (tbs_01, tbs_02, tbs_03, tbs_04)",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertEquals(11, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("hash_products", "product_id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest38.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest38.java new file mode 100644 index 0000000000..7f0805fa91 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest38.java @@ -0,0 +1,88 @@ +/* + * Copyright 1999-2101 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +public class OracleCreateTableTest38 extends OracleTest { + + public void test_types() throws Exception { + String sql = // + "CREATE TABLE list_customers " + + " ( customer_id NUMBER(6)" + + " , cust_first_name VARCHAR2(20) " + + " , cust_last_name VARCHAR2(20)" + + " , cust_address CUST_ADDRESS_TYP" + + " , nls_territory VARCHAR2(30)" + + " , cust_email VARCHAR2(40))" + + " PARTITION BY LIST (nls_territory) (" + + " PARTITION asia VALUES ('CHINA', 'THAILAND')," + + " PARTITION europe VALUES ('GERMANY', 'ITALY', 'SWITZERLAND')," + + " PARTITION west VALUES ('AMERICA')," + + " PARTITION east VALUES ('INDIA')," + + " PARTITION rest VALUES (DEFAULT));"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("CREATE TABLE list_customers (" + + "\n\tcustomer_id NUMBER(6)," + + "\n\tcust_first_name VARCHAR2(20)," + + "\n\tcust_last_name VARCHAR2(20)," + + "\n\tcust_address CUST_ADDRESS_TYP," + + "\n\tnls_territory VARCHAR2(30)," + + "\n\tcust_email VARCHAR2(40)" + + "\n)" + + "\nPARTITION BY LIST (nls_territory)" + + "\n(" + + "\n\tPARTITION asia VALUES ('CHINA', 'THAILAND'), " + + "\n\tPARTITION europe VALUES ('GERMANY', 'ITALY', 'SWITZERLAND'), " + + "\n\tPARTITION west VALUES ('AMERICA'), " + + "\n\tPARTITION east VALUES ('INDIA'), " + + "\n\tPARTITION rest VALUES (DEFAULT)" + + "\n)",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertEquals(6, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("list_customers", "customer_id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest39.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest39.java new file mode 100644 index 0000000000..7a7fa33372 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest39.java @@ -0,0 +1,77 @@ +/* + * Copyright 1999-2101 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +public class OracleCreateTableTest39 extends OracleTest { + + public void test_types() throws Exception { + String sql = // + "CREATE TABLE customers_demo (" + + " customer_id number(6)," + + " cust_first_name varchar2(20)," + + " cust_last_name varchar2(20)," + + " credit_limit number(9,2))" + + "PARTITION BY RANGE (credit_limit)" + + "INTERVAL (1000)" + + "(PARTITION p1 VALUES LESS THAN (5001));"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("CREATE TABLE customers_demo (" + + "\n\tcustomer_id number(6)," + + "\n\tcust_first_name varchar2(20)," + + "\n\tcust_last_name varchar2(20)," + + "\n\tcredit_limit number(9, 2)" + + "\n)" + + "\nPARTITION BY RANGE (credit_limit) INTERVAL 1000" + + "\n(" + + "\n\tPARTITION p1 VALUES LESS THAN (5001)" + + "\n)",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertEquals(4, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("customers_demo", "customer_id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest40.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest40.java new file mode 100644 index 0000000000..16b138421f --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest40.java @@ -0,0 +1,95 @@ +/* + * Copyright 1999-2101 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.oracle; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +public class OracleCreateTableTest40 extends OracleTest { + + public void test_types() throws Exception { + String sql = // + "CREATE TABLE customers_part (" + + " customer_id NUMBER(6)," + + " cust_first_name VARCHAR2(20)," + + " cust_last_name VARCHAR2(20)," + + " nls_territory VARCHAR2(30)," + + " credit_limit NUMBER(9,2)) " + + " PARTITION BY RANGE (credit_limit)" + + " SUBPARTITION BY LIST (nls_territory)" + + " SUBPARTITION TEMPLATE " + + " (SUBPARTITION east VALUES " + + " ('CHINA', 'JAPAN', 'INDIA', 'THAILAND')," + + " SUBPARTITION west VALUES " + + " ('AMERICA', 'GERMANY', 'ITALY', 'SWITZERLAND')," + + " SUBPARTITION other VALUES (DEFAULT))" + + " (PARTITION p1 VALUES LESS THAN (1000)," + + " PARTITION p2 VALUES LESS THAN (2500)," + + " PARTITION p3 VALUES LESS THAN (MAXVALUE));"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("CREATE TABLE customers_part (" + + "\n\tcustomer_id NUMBER(6)," + + "\n\tcust_first_name VARCHAR2(20)," + + "\n\tcust_last_name VARCHAR2(20)," + + "\n\tnls_territory VARCHAR2(30)," + + "\n\tcredit_limit NUMBER(9, 2)" + + "\n)" + + "\nPARTITION BY RANGE (credit_limit)" + + "\nSUBPARTITION BY HASH (nls_territory)" + + "\n\tSUBPARTITION TEMPLATE (" + + "\n\t\tSUBPARTITION east VALUES ('CHINA', 'JAPAN', 'INDIA', 'THAILAND')," + + "\n\t\tSUBPARTITION west VALUES ('AMERICA', 'GERMANY', 'ITALY', 'SWITZERLAND')," + + "\n\t\tSUBPARTITION other VALUES (DEFAULT)" + + "\n\t)" + + "\n(" + + "\n\tPARTITION p1 VALUES LESS THAN (1000)," + + "\n\tPARTITION p2 VALUES LESS THAN (2500)," + + "\n\tPARTITION p3 VALUES LESS THAN (MAXVALUE)" + + "\n)",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertEquals(5, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("customers_part", "customer_id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java index 1ba0be7ecd..c841839fb5 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java @@ -26,8 +26,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ModelRulesCla import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.QueryPartitionClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.ModelClause.ReturnRowsClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleErrorLoggingClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OraclePartitionByRangeClause; -import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleRangeValuesClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleReturningClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleWithSubqueryEntry; @@ -132,8 +130,6 @@ public class OracleASTVisitorAdapterTest extends TestCase { new OracleAlterTablespaceAddDataFile().accept(adapter); new OracleAlterTablespaceStatement().accept(adapter); new OracleCreateSequenceStatement().accept(adapter); - new OracleRangeValuesClause().accept(adapter); - new OraclePartitionByRangeClause().accept(adapter); new SQLLoopStatement().accept(adapter); new OracleIntervalExpr().accept(adapter); new OracleDeleteStatement().accept(adapter);