From 0528af320760c53bb213cc72e5d9d1cb84288233 Mon Sep 17 00:00:00 2001 From: wenshao Date: Thu, 15 Jun 2017 09:50:49 +0800 Subject: [PATCH] improved sql parser. --- .../druid/sql/ast/expr/SQLAggregateExpr.java | 5 ++ .../druid/sql/ast/expr/SQLFlashbackExpr.java | 15 ++++ .../sql/ast/statement/SQLTableSource.java | 4 ++ .../mysql/parser/MySqlCreateTableParser.java | 5 +- .../sql/dialect/mysql/parser/MySqlLexer.java | 5 +- .../mysql/visitor/MySqlOutputVisitor.java | 3 + .../ast/stmt/OracleSelectTableSource.java | 4 -- .../sql/parser/SQLCreateTableParser.java | 31 ++++---- .../sql/visitor/SQLASTOutputVisitor.java | 38 +++++----- .../bvt/pool/basic/TestDataSourceBasic2.java | 70 +++++++++---------- .../createTable/MySqlCreateTableTest43.java | 21 +++--- .../createTable/MySqlCreateTableTest44.java | 21 +++--- .../createTable/MySqlCreateTableTest45.java | 39 +++++------ .../createTable/MySqlCreateTableTest69.java | 30 ++++---- .../createTable/MySqlCreateTableTest77.java | 59 ++++++++++++++++ .../sql/mysql/select/MySqlSelectTest_28.java | 30 ++++---- .../create/OracleCreateTableTest38.java | 31 ++++---- .../create/OracleCreateTableTest43.java | 3 +- .../create/OracleCreateTableTest50.java | 35 +++++++++- .../create/OracleCreateTableTest69.java | 19 +++-- 20 files changed, 296 insertions(+), 172 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest77.java diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java index 493f10ed9a..ea2a64f674 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java @@ -19,6 +19,7 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.List; +import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLExprImpl; import com.alibaba.druid.sql.ast.SQLKeep; @@ -115,6 +116,10 @@ public class SQLAggregateExpr extends SQLExprImpl implements Serializable { this.ignoreNulls = ignoreNulls; } + public String toString() { + return SQLUtils.toSQLString(this); + } + @Override protected void accept0(SQLASTVisitor visitor) { diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLFlashbackExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLFlashbackExpr.java index 1be2f64002..96c8660410 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLFlashbackExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLFlashbackExpr.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.alibaba.druid.sql.ast.expr; import com.alibaba.druid.sql.ast.SQLExpr; diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSource.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSource.java index 587bc57a6f..7d832681f0 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSource.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSource.java @@ -17,6 +17,7 @@ package com.alibaba.druid.sql.ast.statement; import java.util.List; +import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLHint; import com.alibaba.druid.sql.ast.SQLObject; @@ -31,4 +32,7 @@ public interface SQLTableSource extends SQLObject { SQLTableSource clone(); String computeAlias(); + + SQLExpr getFlashback(); + void setFlashback(SQLExpr flashback); } 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 026a474daa..2154439042 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 @@ -72,10 +72,13 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { } public MySqlCreateTableStatement parseCrateTable(boolean acceptCreate) { + MySqlCreateTableStatement stmt = new MySqlCreateTableStatement(); if (acceptCreate) { + if (lexer.hasComment() && lexer.isKeepComments()) { + stmt.addBeforeComment(lexer.readAndResetComments()); + } accept(Token.CREATE); } - MySqlCreateTableStatement stmt = new MySqlCreateTableStatement(); if (identifierEquals("TEMPORARY")) { lexer.nextToken(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java index 3689ba158d..ee2d4a1819 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlLexer.java @@ -71,8 +71,7 @@ public class MySqlLexer extends Lexer { } public MySqlLexer(String input){ - super(input); - super.keywods = DEFAULT_MYSQL_KEYWORDS; + this(input, true, true); } public MySqlLexer(String input, boolean skipComment, boolean keepComments){ @@ -407,7 +406,7 @@ public class MySqlLexer extends Lexer { bufPos++; } - stringVal = subString(mark, bufPos + 1); + stringVal = subString(mark, bufPos); token = Token.LINE_COMMENT; commentCount++; if (keepComments) { 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 bde452f2cd..75b7628922 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 @@ -471,6 +471,9 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } public boolean visit(MySqlCreateTableStatement x) { + if (isPrettyFormat() && x.hasBeforeComment()) { + printlnComments(x.getBeforeCommentsDirect()); + } print0(ucase ? "CREATE " : "create "); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectTableSource.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectTableSource.java index 687bed0c2d..bd9ab34fc2 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectTableSource.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectTableSource.java @@ -23,8 +23,4 @@ public interface OracleSelectTableSource extends SQLTableSource { OracleSelectPivotBase getPivot(); void setPivot(OracleSelectPivotBase pivot); - - SQLExpr getFlashback(); - - void setFlashback(SQLExpr flashback); } 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 ff5e521749..458b27c5ae 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java @@ -27,11 +27,11 @@ import com.alibaba.druid.util.JdbcConstants; public class SQLCreateTableParser extends SQLDDLParser { - public SQLCreateTableParser(String sql){ + public SQLCreateTableParser(String sql) { super(sql); } - public SQLCreateTableParser(SQLExprParser exprParser){ + public SQLCreateTableParser(SQLExprParser exprParser) { super(exprParser); } @@ -40,22 +40,26 @@ public class SQLCreateTableParser extends SQLDDLParser { if (lexer.isKeepComments() && lexer.hasComment()) { comments = lexer.readAndResetComments(); } - + SQLCreateTableStatement stmt = parseCrateTable(true); if (comments != null) { stmt.addBeforeComment(comments); } - + return stmt; } public SQLCreateTableStatement parseCrateTable(boolean acceptCreate) { + SQLCreateTableStatement createTable = newCreateStatement(); + if (acceptCreate) { + if (lexer.hasComment() && lexer.isKeepComments()) { + createTable.addBeforeComment(lexer.readAndResetComments()); + } + accept(Token.CREATE); } - SQLCreateTableStatement createTable = newCreateStatement(); - if (identifierEquals("GLOBAL")) { lexer.nextToken(); @@ -82,21 +86,21 @@ public class SQLCreateTableParser extends SQLDDLParser { if (lexer.token() == Token.LPAREN) { lexer.nextToken(); - for (;;) { + for (; ; ) { Token token = lexer.token(); if (token == Token.IDENTIFIER && lexer.stringVal().equalsIgnoreCase("SUPPLEMENTAL") && JdbcConstants.ORACLE.equals(dbType)) { this.parseCreateTableSupplementalLogingProps(createTable); } else if (token == Token.IDENTIFIER // - || token == Token.LITERAL_ALIAS) { + || token == Token.LITERAL_ALIAS) { SQLColumnDefinition column = this.exprParser.parseColumn(); createTable.getTableElementList().add(column); } else if (token == Token.PRIMARY // - || token == Token.UNIQUE // - || token == Token.CHECK // - || token == Token.CONSTRAINT - || token == Token.FOREIGN) { + || token == Token.UNIQUE // + || token == Token.CHECK // + || token == Token.CONSTRAINT + || token == Token.FOREIGN) { SQLConstraint constraint = this.exprParser.parseConstaint(); constraint.setParent(createTable); createTable.getTableElementList().add((SQLTableElement) constraint); @@ -149,5 +153,4 @@ public class SQLCreateTableParser extends SQLDDLParser { protected SQLCreateTableStatement newCreateStatement() { return new SQLCreateTableStatement(getDbType()); } - -} +} \ No newline at end of file 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 a84acf27ff..8f39140342 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -3856,23 +3856,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet 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(')'); - } + printSQLPartitions(x.getPartitions()); return false; } @@ -3894,9 +3878,29 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet printPartitionsCountAndSubPartitions(x); + printSQLPartitions(x.getPartitions()); + return false; } + private void printSQLPartitions(List partitions) { + 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(')'); + } + } + protected void printPartitionsCountAndSubPartitions(SQLPartitionBy x) { if (x.getPartitionsCount() != null) { diff --git a/src/test/java/com/alibaba/druid/bvt/pool/basic/TestDataSourceBasic2.java b/src/test/java/com/alibaba/druid/bvt/pool/basic/TestDataSourceBasic2.java index 652103f573..feea42c1c5 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/basic/TestDataSourceBasic2.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/basic/TestDataSourceBasic2.java @@ -35,87 +35,87 @@ public class TestDataSourceBasic2 extends TestCase { dataSource.setUrl("jdbc:mock:xxx"); dataSource.setBreakAfterAcquireFailure(true); - Assert.assertEquals(true, dataSource.isBreakAfterAcquireFailure()); + assertEquals(true, dataSource.isBreakAfterAcquireFailure()); dataSource.setConnectionErrorRetryAttempts(234); - Assert.assertEquals(234, dataSource.getConnectionErrorRetryAttempts()); + assertEquals(234, dataSource.getConnectionErrorRetryAttempts()); dataSource.setMaxPoolPreparedStatementPerConnectionSize(234); - Assert.assertEquals(234, dataSource.getMaxPoolPreparedStatementPerConnectionSize()); + assertEquals(234, dataSource.getMaxPoolPreparedStatementPerConnectionSize()); dataSource.incrementDupCloseCount(); - Assert.assertEquals(1, dataSource.getDupCloseCount()); + assertEquals(1, dataSource.getDupCloseCount()); dataSource.setValidConnectionChecker(null); dataSource.setValidConnectionCheckerClassName(null); - Assert.assertEquals(null, dataSource.getValidConnectionChecker()); + assertEquals(null, dataSource.getValidConnectionChecker()); dataSource.addConnectionProperty("user", "ljw"); - Assert.assertEquals(1, dataSource.getConnectProperties().size()); + assertEquals(1, dataSource.getConnectProperties().size()); - Assert.assertEquals(0, dataSource.getConnectionInitSqls().size()); + assertEquals(0, dataSource.getConnectionInitSqls().size()); dataSource.setConnectionInitSqls(Arrays. asList("SELECT 1", null, "")); - Assert.assertEquals(1, dataSource.getConnectionInitSqls().size()); + assertEquals(1, dataSource.getConnectionInitSqls().size()); - Assert.assertEquals(30 * 1000, dataSource.getTimeBetweenConnectErrorMillis()); - Assert.assertEquals(234, dataSource.getMaxOpenPreparedStatements()); - Assert.assertEquals(300, dataSource.getRemoveAbandonedTimeout()); + assertEquals(30 * 1000, dataSource.getTimeBetweenConnectErrorMillis()); + assertEquals(234, dataSource.getMaxOpenPreparedStatements()); + assertEquals(300, dataSource.getRemoveAbandonedTimeout()); dataSource.setRemoveAbandonedTimeout(400); - Assert.assertEquals(400, dataSource.getRemoveAbandonedTimeout()); - Assert.assertEquals(400 * 1000, dataSource.getRemoveAbandonedTimeoutMillis()); - Assert.assertEquals(3, dataSource.getNumTestsPerEvictionRun()); + assertEquals(400, dataSource.getRemoveAbandonedTimeout()); + assertEquals(400 * 1000, dataSource.getRemoveAbandonedTimeoutMillis()); + assertEquals(3, dataSource.getNumTestsPerEvictionRun()); dataSource.setNumTestsPerEvictionRun(4); - Assert.assertEquals(4, dataSource.getNumTestsPerEvictionRun()); + assertEquals(4, dataSource.getNumTestsPerEvictionRun()); dataSource.setMaxWaitThreadCount(4); - Assert.assertEquals(4, dataSource.getMaxWaitThreadCount()); + assertEquals(4, dataSource.getMaxWaitThreadCount()); dataSource.setValidationQueryTimeout(4); - Assert.assertEquals(4, dataSource.getValidationQueryTimeout()); + assertEquals(4, dataSource.getValidationQueryTimeout()); dataSource.setAccessToUnderlyingConnectionAllowed(true); - Assert.assertEquals(true, dataSource.isAccessToUnderlyingConnectionAllowed()); + assertEquals(true, dataSource.isAccessToUnderlyingConnectionAllowed()); dataSource.setDefaultReadOnly(true); - Assert.assertEquals(Boolean.TRUE, dataSource.getDefaultReadOnly()); + assertEquals(Boolean.TRUE, dataSource.getDefaultReadOnly()); dataSource.setDefaultTransactionIsolation(10); - Assert.assertEquals(Integer.valueOf(10), dataSource.getDefaultTransactionIsolation()); + assertEquals(Integer.valueOf(10), dataSource.getDefaultTransactionIsolation()); dataSource.setDefaultCatalog("xxx"); - Assert.assertEquals("xxx", dataSource.getDefaultCatalog()); + assertEquals("xxx", dataSource.getDefaultCatalog()); dataSource.setPasswordCallbackClassName(null); dataSource.setUserCallback(null); - Assert.assertEquals(0, dataSource.getQueryTimeout()); + assertEquals(0, dataSource.getQueryTimeout()); dataSource.setQueryTimeout(10001); - Assert.assertEquals(10001, dataSource.getQueryTimeout()); + assertEquals(10001, dataSource.getQueryTimeout()); - Assert.assertEquals(-1, dataSource.getMaxWait()); + assertEquals(-1, dataSource.getMaxWait()); dataSource.setMaxWait(10001); - Assert.assertEquals(10001, dataSource.getMaxWait()); + assertEquals(10001, dataSource.getMaxWait()); - Assert.assertEquals(8, dataSource.getMaxIdle()); + assertEquals(8, dataSource.getMaxIdle()); dataSource.setMaxIdle(3); - Assert.assertEquals(3, dataSource.getMaxIdle()); + assertEquals(3, dataSource.getMaxIdle()); - Assert.assertEquals(0, dataSource.getLoginTimeout()); + assertEquals(0, dataSource.getLoginTimeout()); dataSource.setLoginTimeout(30); - Assert.assertEquals(30, dataSource.getLoginTimeout()); + assertEquals(30, dataSource.getLoginTimeout()); - Assert.assertEquals(null, dataSource.getUsername()); + assertEquals(null, dataSource.getUsername()); dataSource.setUsername("ljw"); - Assert.assertEquals("ljw", dataSource.getUsername()); + assertEquals("ljw", dataSource.getUsername()); - Assert.assertEquals(null, dataSource.getPassword()); + assertEquals(null, dataSource.getPassword()); dataSource.setPassword("xxx"); - Assert.assertEquals("xxx", dataSource.getPassword()); + assertEquals("xxx", dataSource.getPassword()); dataSource.setConnectProperties(new Properties()); - Assert.assertEquals(0, dataSource.getConnectProperties().size()); + assertEquals(0, dataSource.getConnectProperties().size()); dataSource.setConnectionProperties("a=1;b=2;c"); - Assert.assertEquals(3, dataSource.getConnectProperties().size()); + assertEquals(3, dataSource.getConnectProperties().size()); dataSource.setExceptionSorter((ExceptionSorter) null); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest43.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest43.java index 0f4605021b..bace2e0491 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest43.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest43.java @@ -62,17 +62,16 @@ public class MySqlCreateTableTest43 extends MysqlTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("client_firms"))); String output = SQLUtils.toMySqlString(stmt); - Assert.assertEquals("CREATE TABLE client_firms (" + // - "\n\tid INT," + // - "\n\tname VARCHAR(35)" + // - "\n)" - + "\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), " + // - "\n\tPARTITION r3 VALUES IN (4, 8, 12, 16, 20, 24)" + // - "\n);", output); + Assert.assertEquals("CREATE TABLE client_firms (\n" + + "\tid INT,\n" + + "\tname VARCHAR(35)\n" + + ")\n" + + "PARTITION BY LIST (id) (\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), \n" + + "\tPARTITION r3 VALUES IN (4, 8, 12, 16, 20, 24)\n" + + ");", output); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest44.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest44.java index b40013344a..03549c4789 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest44.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest44.java @@ -62,17 +62,16 @@ public class MySqlCreateTableTest44 extends MysqlTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("lc"))); String output = SQLUtils.toMySqlString(stmt); - Assert.assertEquals("CREATE TABLE lc (" + // - "\n\ta INT NULL," + // - "\n\tb INT NULL" + // - "\n)" + // - "\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)), " + // - "\n\tPARTITION p3 VALUES IN ((1, 3), (2, 2), (2, 3), (3, 2), (3, 3))" + // - "\n);", output); + Assert.assertEquals("CREATE TABLE lc (\n" + + "\ta INT NULL,\n" + + "\tb INT NULL\n" + + ")\n" + + "PARTITION BY LIST COLUMNS (a, b) (\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)), \n" + + "\tPARTITION p3 VALUES IN ((1, 3), (2, 2), (2, 3), (3, 2), (3, 3))\n" + + ");", output); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest45.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest45.java index 5fb6a42f04..18db0455f4 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest45.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest45.java @@ -68,26 +68,25 @@ public class MySqlCreateTableTest45 extends MysqlTest { Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("th"))); String output = SQLUtils.toMySqlString(stmt); - Assert.assertEquals("CREATE TABLE th (" + // - "\n\tid INT," + // - "\n\tname VARCHAR(30)," + // - "\n\tadate DATE" + // - "\n)" + // - "\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', " + // - "\n\tPARTITION p2000 VALUES IN (1996, 2000, 2004)" + // - "\n\t\tDATA DIRECTORY '/var/appdata/96/data'" + // - "\n\t\tINDEX DIRECTORY '/var/appdata/96/idx', " + // - "\n\tPARTITION p2001 VALUES IN (1997, 2001, 2005)" + // - "\n\t\tDATA DIRECTORY '/var/appdata/97/data'" + // - "\n\t\tINDEX DIRECTORY '/var/appdata/97/idx', " + // - "\n\tPARTITION p2002 VALUES IN (1998, 2002, 2006)" + // - "\n\t\tDATA DIRECTORY '/var/appdata/98/data'" + // - "\n\t\tINDEX DIRECTORY '/var/appdata/98/idx'" + // - "\n);", output); + Assert.assertEquals("CREATE TABLE th (\n" + + "\tid INT,\n" + + "\tname VARCHAR(30),\n" + + "\tadate DATE\n" + + ")\n" + + "PARTITION BY LIST (YEAR(adate)) (\n" + + "\tPARTITION p1999 VALUES IN (1995, 1999, 2003)\n" + + "\t\tDATA DIRECTORY '/var/appdata/95/data'\n" + + "\t\tINDEX DIRECTORY '/var/appdata/95/idx', \n" + + "\tPARTITION p2000 VALUES IN (1996, 2000, 2004)\n" + + "\t\tDATA DIRECTORY '/var/appdata/96/data'\n" + + "\t\tINDEX DIRECTORY '/var/appdata/96/idx', \n" + + "\tPARTITION p2001 VALUES IN (1997, 2001, 2005)\n" + + "\t\tDATA DIRECTORY '/var/appdata/97/data'\n" + + "\t\tINDEX DIRECTORY '/var/appdata/97/idx', \n" + + "\tPARTITION p2002 VALUES IN (1998, 2002, 2006)\n" + + "\t\tDATA DIRECTORY '/var/appdata/98/data'\n" + + "\t\tINDEX DIRECTORY '/var/appdata/98/idx'\n" + + ");", output); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest69.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest69.java index 44a7eb2e94..fd8a8cf15d 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest69.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest69.java @@ -44,26 +44,24 @@ public class MySqlCreateTableTest69 extends MysqlTest { { String output = SQLUtils.toMySqlString(stmt); - Assert.assertEquals("CREATE TABLE t1 (" - + "\n\ts1 INT," - + "\n\ts2 INT AS (EXP(s1)) SORTED" - + "\n)" - + "\nPARTITION BY LIST (s2)" - + "\n(" - + "\n\tPARTITION p1 VALUES IN (1)" - + "\n)", output); + Assert.assertEquals("CREATE TABLE t1 (\n" + + "\ts1 INT,\n" + + "\ts2 INT AS (EXP(s1)) SORTED\n" + + ")\n" + + "PARTITION BY LIST (s2) (\n" + + "\tPARTITION p1 VALUES IN (1)\n" + + ")", output); } { String output = SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); - Assert.assertEquals("create table t1 (" - + "\n\ts1 INT," - + "\n\ts2 INT as (EXP(s1)) sorted" - + "\n)" - + "\npartition by list (s2)" - + "\n(" - + "\n\tpartition p1 values in (1)" - + "\n)", output); + Assert.assertEquals("create table t1 (\n" + + "\ts1 INT,\n" + + "\ts2 INT as (EXP(s1)) sorted\n" + + ")\n" + + "partition by list (s2) (\n" + + "\tpartition p1 values in (1)\n" + + ")", output); } } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest77.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest77.java new file mode 100644 index 0000000000..6aee1f3b36 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/createTable/MySqlCreateTableTest77.java @@ -0,0 +1,59 @@ +/* + * Copyright 1999-2017 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.mysql.createTable; + +import com.alibaba.druid.sql.MysqlTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.mysql.parser.MySqlStatementParser; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat.Column; + +public class MySqlCreateTableTest77 extends MysqlTest { + + public void test_one() throws Exception { + String sql = "-- table-name-bean-name:some --\n" + + "CREATE TABLE `some_table` (\n" + + " `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键'\n" + + ")"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + SQLStatement stmt = parser.parseCreateTable(); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + stmt.accept(visitor); + + Column column = visitor.getColumn("some_table", "id"); + assertNotNull(column); + assertEquals("bigint", column.getDataType()); + + { + String output = SQLUtils.toMySqlString(stmt); + assertEquals("-- table-name-bean-name:some --\n" + + "CREATE TABLE `some_table` (\n" + + "\t`id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '主键'\n" + + ")", output); + } + + { + String output = SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); + assertEquals("-- table-name-bean-name:some --\n" + + "create table `some_table` (\n" + + "\t`id` bigint(20) unsigned not null auto_increment comment '主键'\n" + + ")", output); + } + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_28.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_28.java index ead7558e4a..aa0db71d9d 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_28.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_28.java @@ -17,8 +17,6 @@ package com.alibaba.druid.bvt.sql.mysql.select; import java.util.List; -import org.junit.Assert; - import com.alibaba.druid.sql.MysqlTest; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLStatement; @@ -40,7 +38,7 @@ public class MySqlSelectTest_28 extends MysqlTest { SQLStatement stmt = statementList.get(0); // print(statementList); - Assert.assertEquals(1, statementList.size()); + assertEquals(1, statementList.size()); MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); stmt.accept(visitor); @@ -50,25 +48,27 @@ public class MySqlSelectTest_28 extends MysqlTest { // System.out.println("coditions : " + visitor.getConditions()); // System.out.println("orderBy : " + visitor.getOrderByColumns()); - Assert.assertEquals(1, visitor.getTables().size()); - Assert.assertEquals(3, visitor.getColumns().size()); - Assert.assertEquals(1, visitor.getConditions().size()); - Assert.assertEquals(0, visitor.getOrderByColumns().size()); + assertEquals(1, visitor.getTables().size()); + assertEquals(3, visitor.getColumns().size()); + assertEquals(1, visitor.getConditions().size()); + assertEquals(0, visitor.getOrderByColumns().size()); { String output = SQLUtils.toMySqlString(stmt); - Assert.assertEquals("SELECT id, name" - + "\nFROM `t_0248` `i_trash`" - + "\nWHERE `gmt_create` < DATE_ADD(NOW(), INTERVAL -7 DAY)" - + "\nLIMIT 0, 1000", // + assertEquals("/* 0a7d0d8614637128401131809d4d9d/9// */\n" + + "SELECT id, name\n" + + "FROM `t_0248` `i_trash`\n" + + "WHERE `gmt_create` < DATE_ADD(NOW(), INTERVAL -7 DAY)\n" + + "LIMIT 0, 1000", // output); } { String output = SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); - Assert.assertEquals("select id, name" - + "\nfrom `t_0248` `i_trash`" - + "\nwhere `gmt_create` < DATE_ADD(NOW(), interval -7 day)" - + "\nlimit 0, 1000", // + assertEquals("/* 0a7d0d8614637128401131809d4d9d/9// */\n" + + "select id, name\n" + + "from `t_0248` `i_trash`\n" + + "where `gmt_create` < DATE_ADD(NOW(), interval -7 day)\n" + + "limit 0, 1000", // output); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest38.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest38.java index ccbab68634..0b6d14c5ca 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest38.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest38.java @@ -52,22 +52,21 @@ public class OracleCreateTableTest38 extends OracleTest { assertEquals(1, statementList.size()); - 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);",// + 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" + + ")\n" + + "PARTITION BY LIST (nls_territory) (\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(); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest43.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest43.java index 73617f0a31..b77b255c05 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest43.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest43.java @@ -66,8 +66,7 @@ public class OracleCreateTableTest43 extends OracleTest { "\tFLASH_CACHE DEFAULT\n" + "\tCELL_FLASH_CACHE DEFAULT\n" + ")\n" + - "PARTITION BY LIST (\"DNAME\")\n" + - "(\n" + + "PARTITION BY LIST (\"DNAME\") (\n" + "\tPARTITION \"PART02\" VALUES ('SMT', 'SALE')\n" + "\t\tPCTFREE 10\n" + "\t\tPCTUSED 40\n" + diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest50.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest50.java index c25180418f..f24a50e88c 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest50.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest50.java @@ -249,7 +249,40 @@ public class OracleCreateTableTest50 extends OracleTest { "STORAGE (\n" + "\tBUFFER_POOL DEFAULT\n" + ")\n" + - "PARTITION BY HASH (\"COMPANY_ID\")",// + "PARTITION BY HASH (\"COMPANY_ID\") (\n" + + "\tPARTITION \"PRODUCT_HASH_P1\"\n" + + "\t\tTABLESPACE \"APPDATA1M\", \n" + + "\tPARTITION \"PRODUCT_HASH_P2\"\n" + + "\t\tTABLESPACE \"APPDATA1M\", \n" + + "\tPARTITION \"PRODUCT_HASH_P3\"\n" + + "\t\tTABLESPACE \"APPDATA1M\", \n" + + "\tPARTITION \"PRODUCT_HASH_P4\"\n" + + "\t\tTABLESPACE \"APPDATA1M\", \n" + + "\tPARTITION \"PRODUCT_HASH_P5\"\n" + + "\t\tTABLESPACE \"APPDATA1M\", \n" + + "\tPARTITION \"PRODUCT_HASH_P6\"\n" + + "\t\tTABLESPACE \"APPDATA1M\", \n" + + "\tPARTITION \"PRODUCT_HASH_P7\"\n" + + "\t\tTABLESPACE \"APPDATA1M\", \n" + + "\tPARTITION \"PRODUCT_HASH_P8\"\n" + + "\t\tTABLESPACE \"APPDATA1M\", \n" + + "\tPARTITION \"PRODUCT_HASH_P9\"\n" + + "\t\tTABLESPACE \"APPDATA1M\", \n" + + "\tPARTITION \"PRODUCT_HASH_P10\"\n" + + "\t\tTABLESPACE \"APPDATA1M\", \n" + + "\tPARTITION \"PRODUCT_HASH_P11\"\n" + + "\t\tTABLESPACE \"APPDATA1M\", \n" + + "\tPARTITION \"PRODUCT_HASH_P12\"\n" + + "\t\tTABLESPACE \"APPDATA1M\", \n" + + "\tPARTITION \"PRODUCT_HASH_P13\"\n" + + "\t\tTABLESPACE \"APPDATA1M\", \n" + + "\tPARTITION \"PRODUCT_HASH_P14\"\n" + + "\t\tTABLESPACE \"APPDATA1M\", \n" + + "\tPARTITION \"PRODUCT_HASH_P15\"\n" + + "\t\tTABLESPACE \"APPDATA1M\", \n" + + "\tPARTITION \"PRODUCT_HASH_P16\"\n" + + "\t\tTABLESPACE \"APPDATA1M\"\n" + + ")",// SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest69.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest69.java index 66a82ebe24..77722b60b4 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest69.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateTableTest69.java @@ -46,12 +46,19 @@ public class OracleCreateTableTest69 extends OracleTest { assertEquals(1, statementList.size()); // -// assertEquals("CREATE TABLE HASH_TABLE (\n" + -// "\tCOL NUMBER(8),\n" + -// "\tINF VARCHAR2(100)\n" + -// ")\n" + -// "PARTITION BY HASH (COL)",// -// SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + assertEquals("CREATE TABLE HASH_TABLE (\n" + + "\tCOL NUMBER(8),\n" + + "\tINF VARCHAR2(100)\n" + + ")\n" + + "PARTITION BY HASH (COL) (\n" + + "\tPARTITION PART01\n" + + "\t\tTABLESPACE HASH_TS01, \n" + + "\tPARTITION PART02\n" + + "\t\tTABLESPACE HASH_TS02, \n" + + "\tPARTITION PART03\n" + + "\t\tTABLESPACE HASH_TS03\n" + + ")",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); // // SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.ORACLE); // stmt.accept(visitor);