mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
improved sql parser.
This commit is contained in:
@@ -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) {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
+4
-1
@@ -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();
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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 ");
|
||||
|
||||
|
||||
-4
@@ -23,8 +23,4 @@ public interface OracleSelectTableSource extends SQLTableSource {
|
||||
OracleSelectPivotBase getPivot();
|
||||
|
||||
void setPivot(OracleSelectPivotBase pivot);
|
||||
|
||||
SQLExpr getFlashback();
|
||||
|
||||
void setFlashback(SQLExpr flashback);
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -3856,23 +3856,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet
|
||||
|
||||
printPartitionsCountAndSubPartitions(x);
|
||||
|
||||
List<SQLPartition> 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<SQLPartition> 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) {
|
||||
|
||||
|
||||
@@ -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.<Object> 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);
|
||||
|
||||
|
||||
+10
-11
@@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+10
-11
@@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+19
-20
@@ -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);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+14
-16
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
+15
-16
@@ -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();
|
||||
|
||||
@@ -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" +
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user