diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByRange.java b/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByRange.java index 1c20a8aaeb..ebf50e5acb 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByRange.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLPartitionByRange.java @@ -29,6 +29,10 @@ public class SQLPartitionByRange extends SQLPartitionBy { // mysql protected SQLExpr expr; + public SQLPartitionByRange() { + + } + public List getColumns() { return columns; } 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 00b0db1fdf..1be67a4615 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -3933,9 +3933,11 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet print(')'); } - if (x.getInterval() != null) { - print0(ucase ? " INTERVAL " : " interval "); - x.getInterval().accept(this); + SQLExpr interval = x.getInterval(); + if (interval != null) { + print0(ucase ? " INTERVAL (" : " interval ("); + interval.accept(this); + print(')'); } printPartitionsCountAndSubPartitions(x); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest39.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest39.java index 085bf6b97e..e50645b523 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest39.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest39.java @@ -47,15 +47,15 @@ public class OracleCreateTableTest39 extends OracleTest { 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\tPARTITION p1 VALUES LESS THAN (5001)" - + "\n);",// + 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" + + ")\n" + + "PARTITION BY RANGE (credit_limit) INTERVAL (1000) (\n" + + "\tPARTITION p1 VALUES LESS THAN (5001)\n" + + ");",// SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest70.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest70.java new file mode 100644 index 0000000000..f08e1ca35c --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest70.java @@ -0,0 +1,67 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.oracle.create; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.util.JdbcConstants; + +import java.util.List; + +public class OracleCreateTableTest70 extends OracleTest { + + public void test_types() throws Exception { + String sql = // + " create table month_part (c1 number,c3 date)\n" + + "partition by range(c3)\n" + + "interval(numtoyminterval (1,'month'))\n" + + "(partition part1 values less than (to_date('2010-01-01','YYYY-MM-DD')),\n" + + "partition part2 values less than (to_date('2010-02-01','YYYY-MM-DD'))\n" + + ") "; + + List statementList = SQLUtils.parseStatements(sql, JdbcConstants.ORACLE); + SQLStatement stmt = statementList.get(0); + print(statementList); + + assertEquals(1, statementList.size()); +// + assertEquals("CREATE TABLE month_part (\n" + + "\tc1 number,\n" + + "\tc3 date\n" + + ")\n" + + "PARTITION BY RANGE (c3) INTERVAL (numtoyminterval(1, 'month')) (\n" + + "\tPARTITION part1 VALUES LESS THAN (to_date('2010-01-01', 'YYYY-MM-DD')),\n" + + "\tPARTITION part2 VALUES LESS THAN (to_date('2010-02-01', 'YYYY-MM-DD'))\n" + + ")",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); +// +// SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.ORACLE); +// 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()); +// +// assertEquals(1, visitor.getTables().size()); +// +// assertEquals(3, visitor.getColumns().size()); +// +// assertTrue(visitor.getColumns().contains(new TableStat.Column("JWGZPT.A", "XM"))); + } +}