diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnDefinition.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnDefinition.java index 1cc5d456b3..d85dcfddde 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnDefinition.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnDefinition.java @@ -15,29 +15,52 @@ */ package com.alibaba.druid.sql.ast.statement; +import java.util.ArrayList; +import java.util.List; + import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLObjectImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; -import java.util.ArrayList; -import java.util.List; - public class SQLColumnDefinition extends SQLObjectImpl implements SQLTableElement { protected SQLName name; protected SQLDataType dataType; protected SQLExpr defaultExpr; - protected final List constraints = new ArrayList(0); - protected SQLExpr comment; + protected final List constraints = new ArrayList(0); + protected SQLExpr comment; protected Boolean enable; + // for mysql + protected boolean autoIncrement = false; + protected SQLExpr onUpdate; + protected SQLExpr storage; + protected SQLExpr charsetExpr; + protected SQLExpr asExpr; + protected boolean sorted = false; + protected boolean virtual = false; + + protected Identity identity; + public SQLColumnDefinition(){ } + public Identity getIdentity() { + return identity; + } + + // for sqlserver + public void setIdentity(Identity identity) { + if (identity != null) { + identity.setParent(this); + } + this.identity = identity; + } + public Boolean getEnable() { return enable; } @@ -107,4 +130,108 @@ public class SQLColumnDefinition extends SQLObjectImpl implements SQLTableElemen this.comment = comment; } + public boolean isVirtual() { + return virtual; + } + + public void setVirtual(boolean virtual) { + this.virtual = virtual; + } + + public boolean isSorted() { + return sorted; + } + + public void setSorted(boolean sorted) { + this.sorted = sorted; + } + + public SQLExpr getCharsetExpr() { + return charsetExpr; + } + + public void setCharsetExpr(SQLExpr charsetExpr) { + if (charsetExpr != null) { + charsetExpr.setParent(this); + } + this.charsetExpr = charsetExpr; + } + + public SQLExpr getAsExpr() { + return asExpr; + } + + public void setAsExpr(SQLExpr asExpr) { + if (charsetExpr != null) { + charsetExpr.setParent(this); + } + this.asExpr = asExpr; + } + + public boolean isAutoIncrement() { + return autoIncrement; + } + + public void setAutoIncrement(boolean autoIncrement) { + this.autoIncrement = autoIncrement; + } + + public SQLExpr getOnUpdate() { + return onUpdate; + } + + public void setOnUpdate(SQLExpr onUpdate) { + this.onUpdate = onUpdate; + } + + public SQLExpr getStorage() { + return storage; + } + + public void setStorage(SQLExpr storage) { + this.storage = storage; + } + + public static class Identity extends SQLObjectImpl { + + private Integer seed; + private Integer increment; + + private boolean notForReplication; + + public Identity(){ + + } + + public Integer getSeed() { + return seed; + } + + public void setSeed(Integer seed) { + this.seed = seed; + } + + public Integer getIncrement() { + return increment; + } + + public void setIncrement(Integer increment) { + this.increment = increment; + } + + public boolean isNotForReplication() { + return notForReplication; + } + + public void setNotForReplication(boolean notForReplication) { + this.notForReplication = notForReplication; + } + + @Override + public void accept0(SQLASTVisitor visitor) { + visitor.visit(this); + visitor.endVisit(this); + } + + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSQLColumnDefinition.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSQLColumnDefinition.java deleted file mode 100644 index 74b03b0518..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSQLColumnDefinition.java +++ /dev/null @@ -1,67 +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.mysql.ast.statement; - -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; - -public class MySqlSQLColumnDefinition extends SQLColumnDefinition { - - private boolean autoIncrement = false; - - private SQLExpr onUpdate; - - private SQLExpr storage; - - private SQLExpr charsetExpr; - - - public MySqlSQLColumnDefinition(){ - - } - - public SQLExpr getCharsetExpr() { - return charsetExpr; - } - - public void setCharsetExpr(SQLExpr charsetExpr) { - this.charsetExpr = charsetExpr; - } - - public boolean isAutoIncrement() { - return autoIncrement; - } - - public void setAutoIncrement(boolean autoIncrement) { - this.autoIncrement = autoIncrement; - } - - public SQLExpr getOnUpdate() { - return onUpdate; - } - - public void setOnUpdate(SQLExpr onUpdate) { - this.onUpdate = onUpdate; - } - - public SQLExpr getStorage() { - return storage; - } - - public void setStorage(SQLExpr storage) { - this.storage = storage; - } -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java index 06f8db560c..9d73826a26 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java @@ -20,8 +20,8 @@ import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLOrderBy; import com.alibaba.druid.sql.ast.SQLOrderingSpecification; -import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr; import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; +import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; @@ -45,11 +45,10 @@ import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExtractExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalUnit; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlMatchAgainstExpr; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOrderingExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlMatchAgainstExpr.SearchModifier; +import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOrderingExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlUserName; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSQLColumnDefinition; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit; import com.alibaba.druid.sql.parser.Lexer; @@ -517,7 +516,7 @@ public class MySqlExprParser extends SQLExprParser { } public SQLColumnDefinition parseColumn() { - MySqlSQLColumnDefinition column = new MySqlSQLColumnDefinition(); + SQLColumnDefinition column = new SQLColumnDefinition(); column.setName(name()); column.setDataType(parseDataType()); @@ -529,7 +528,7 @@ public class MySqlExprParser extends SQLExprParser { lexer.nextToken(); accept(Token.UPDATE); SQLExpr expr = this.expr(); - ((MySqlSQLColumnDefinition) column).setOnUpdate(expr); + column.setOnUpdate(expr); } if (identifierEquals("CHARSET")) { lexer.nextToken(); @@ -541,14 +540,12 @@ public class MySqlExprParser extends SQLExprParser { charSetCollateExpr.setCollate(lexer.stringVal()); lexer.nextToken(); } - ((MySqlSQLColumnDefinition) column).setCharsetExpr(charSetCollateExpr); + column.setCharsetExpr(charSetCollateExpr); return parseColumnRest(column); } if (identifierEquals("AUTO_INCREMENT")) { lexer.nextToken(); - if (column instanceof MySqlSQLColumnDefinition) { - ((MySqlSQLColumnDefinition) column).setAutoIncrement(true); - } + column.setAutoIncrement(true); return parseColumnRest(column); } @@ -563,9 +560,25 @@ public class MySqlExprParser extends SQLExprParser { if (identifierEquals("STORAGE")) { lexer.nextToken(); SQLExpr expr = expr(); - if (column instanceof MySqlSQLColumnDefinition) { - ((MySqlSQLColumnDefinition) column).setStorage(expr); - } + column.setStorage(expr); + } + + if (lexer.token() == Token.AS) { + lexer.nextToken(); + accept(Token.LPAREN); + SQLExpr expr = expr(); + column.setAsExpr(expr); + accept(Token.RPAREN); + } + + if (identifierEquals("STORED")) { + lexer.nextToken(); + column.setSorted(true); + } + + if (identifierEquals("VIRTUAL")) { + lexer.nextToken(); + column.setVirtual(true); } super.parseColumnRest(column); 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 c952f67b05..53f5ca6a2b 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 @@ -103,7 +103,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRenameTableStateme import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlReplaceStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlResetStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlRollbackStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSQLColumnDefinition; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.Limit; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSetCharSetStatement; @@ -295,19 +294,13 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } public boolean visit(SQLColumnDefinition x) { - MySqlSQLColumnDefinition mysqlColumn = null; - - if (x instanceof MySqlSQLColumnDefinition) { - mysqlColumn = (MySqlSQLColumnDefinition) x; - } - x.getName().accept(this); print(' '); x.getDataType().accept(this); - if (mysqlColumn != null && mysqlColumn.getCharsetExpr() != null) { + if (x.getCharsetExpr() != null) { print0(ucase ? " CHARSET " : " charset "); - mysqlColumn.getCharsetExpr().accept(this); + x.getCharsetExpr().accept(this); } for (SQLColumnConstraint item : x.getConstraints()) { @@ -324,18 +317,18 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } } - if (mysqlColumn != null && mysqlColumn.getStorage() != null) { + if (x.getStorage() != null) { print0(ucase ? " STORAGE " : " storage "); - mysqlColumn.getStorage().accept(this); + x.getStorage().accept(this); } - if (mysqlColumn != null && mysqlColumn.getOnUpdate() != null) { + if (x.getOnUpdate() != null) { print0(ucase ? " ON UPDATE " : " on update "); - mysqlColumn.getOnUpdate().accept(this); + x.getOnUpdate().accept(this); } - if (mysqlColumn != null && mysqlColumn.isAutoIncrement()) { + if (x.isAutoIncrement()) { print0(ucase ? " AUTO_INCREMENT" : " auto_increment"); } @@ -343,6 +336,16 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV print0(ucase ? " COMMENT " : " comment "); x.getComment().accept(this); } + + if (x.getAsExpr() != null) { + print0(ucase ? " AS (" : " as ("); + x.getAsExpr().accept(this); + print(')'); + } + + if (x.isSorted()) { + print0(ucase ? " SORTED" : " sorted"); + } return false; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/SQLServerColumnDefinition.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/SQLServerColumnDefinition.java deleted file mode 100644 index 6ff10884f9..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/SQLServerColumnDefinition.java +++ /dev/null @@ -1,100 +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.sqlserver.ast; - -import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; -import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitor; -import com.alibaba.druid.sql.visitor.SQLASTVisitor; - -public class SQLServerColumnDefinition extends SQLColumnDefinition implements SQLServerObject { - - private Identity identity; - - public SQLServerColumnDefinition(){ - - } - - public Identity getIdentity() { - return identity; - } - - public void setIdentity(Identity identity) { - if (identity != null) { - identity.setParent(this); - } - this.identity = identity; - } - - @Override - protected void accept0(SQLASTVisitor visitor) { - this.accept0((SQLServerASTVisitor) visitor); - } - - @Override - public void accept0(SQLServerASTVisitor visitor) { - if (visitor.visit(this)) { - this.acceptChild(visitor, name); - this.acceptChild(visitor, dataType); - this.acceptChild(visitor, defaultExpr); - this.acceptChild(visitor, constraints); - this.acceptChild(visitor, identity); - } - visitor.endVisit(this); - } - - public static class Identity extends SQLServerObjectImpl { - - private Integer seed; - private Integer increment; - - private boolean notForReplication; - - public Identity(){ - - } - - public Integer getSeed() { - return seed; - } - - public void setSeed(Integer seed) { - this.seed = seed; - } - - public Integer getIncrement() { - return increment; - } - - public void setIncrement(Integer increment) { - this.increment = increment; - } - - public boolean isNotForReplication() { - return notForReplication; - } - - public void setNotForReplication(boolean notForReplication) { - this.notForReplication = notForReplication; - } - - @Override - public void accept0(SQLServerASTVisitor visitor) { - visitor.visit(this); - visitor.endVisit(this); - } - - } -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerExprParser.java index 505bd58fd3..11e34336aa 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerExprParser.java @@ -26,7 +26,6 @@ import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; import com.alibaba.druid.sql.ast.statement.SQLSelectItem; -import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerColumnDefinition; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerOutput; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerTop; import com.alibaba.druid.sql.dialect.sqlserver.ast.expr.SQLServerObjectReferenceExpr; @@ -192,7 +191,7 @@ public class SQLServerExprParser extends SQLExprParser { } public SQLColumnDefinition createColumnDefinition() { - SQLColumnDefinition column = new SQLServerColumnDefinition(); + SQLColumnDefinition column = new SQLColumnDefinition(); return column; } @@ -206,7 +205,7 @@ public class SQLServerExprParser extends SQLExprParser { SQLIntegerExpr increment = (SQLIntegerExpr) this.primary(); accept(Token.RPAREN); - SQLServerColumnDefinition.Identity identity = new SQLServerColumnDefinition.Identity(); + SQLColumnDefinition.Identity identity = new SQLColumnDefinition.Identity(); identity.setSeed((Integer) seed.getNumber()); identity.setIncrement((Integer) increment.getNumber()); @@ -223,8 +222,7 @@ public class SQLServerExprParser extends SQLExprParser { } } - SQLServerColumnDefinition sqlSreverColumn = (SQLServerColumnDefinition) column; - sqlSreverColumn.setIdentity(identity); + column.setIdentity(identity); } return super.parseColumnRest(column); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitor.java index eca77bd87a..5772b89671 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitor.java @@ -15,7 +15,6 @@ */ package com.alibaba.druid.sql.dialect.sqlserver.visitor; -import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerColumnDefinition; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerOutput; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelect; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; @@ -55,14 +54,6 @@ public interface SQLServerASTVisitor extends SQLASTVisitor { void endVisit(SQLServerUpdateStatement x); - boolean visit(SQLServerColumnDefinition x); - - void endVisit(SQLServerColumnDefinition x); - - boolean visit(SQLServerColumnDefinition.Identity x); - - void endVisit(SQLServerColumnDefinition.Identity x); - boolean visit(SQLServerExecStatement x); void endVisit(SQLServerExecStatement x); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitorAdapter.java index 4d24ffe090..6e98b56a88 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitorAdapter.java @@ -15,7 +15,6 @@ */ package com.alibaba.druid.sql.dialect.sqlserver.visitor; -import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerColumnDefinition; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerOutput; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelect; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; @@ -85,26 +84,6 @@ public class SQLServerASTVisitorAdapter extends SQLASTVisitorAdapter implements } - @Override - public boolean visit(SQLServerColumnDefinition.Identity x) { - return true; - } - - @Override - public void endVisit(SQLServerColumnDefinition.Identity x) { - - } - - @Override - public boolean visit(SQLServerColumnDefinition x) { - return true; - } - - @Override - public void endVisit(SQLServerColumnDefinition x) { - - } - @Override public boolean visit(SQLServerExecStatement x) { return true; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java index 5a08027a6d..449f19dae3 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java @@ -24,8 +24,6 @@ import com.alibaba.druid.sql.ast.statement.SQLColumnConstraint; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; import com.alibaba.druid.sql.ast.statement.SQLGrantStatement; -import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerColumnDefinition; -import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerColumnDefinition.Identity; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerOutput; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelect; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; @@ -275,22 +273,7 @@ public class SQLServerOutputVisitor extends SQLASTOutputVisitor implements SQLSe } @Override - public boolean visit(Identity x) { - print0(ucase ? "IDENTITY (" : "identity ("); - print(x.getSeed()); - print0(", "); - print(x.getIncrement()); - print(')'); - return false; - } - - @Override - public void endVisit(Identity x) { - - } - - @Override - public boolean visit(SQLServerColumnDefinition x) { + public boolean visit(SQLColumnDefinition x) { x.getName().accept(this); if (x.getDataType() != null) { @@ -321,18 +304,6 @@ public class SQLServerOutputVisitor extends SQLASTOutputVisitor implements SQLSe return false; } - @Override - public void endVisit(SQLServerColumnDefinition x) { - - } - - public boolean visit(SQLColumnDefinition x) { - if (x instanceof SQLServerColumnDefinition) { - return visit((SQLServerColumnDefinition) x); - } - return super.visit(x); - } - @Override public boolean visit(SQLServerExecStatement x) { print0(ucase ? "EXEC " : "exec "); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerSchemaStatVisitor.java index e51b0a010e..50f88d5d57 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerSchemaStatVisitor.java @@ -19,11 +19,8 @@ import java.util.Map; import com.alibaba.druid.sql.ast.SQLDeclareItem; import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; -import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerColumnDefinition; -import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerColumnDefinition.Identity; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerOutput; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelect; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; @@ -116,26 +113,6 @@ public class SQLServerSchemaStatVisitor extends SchemaStatVisitor implements SQL } - @Override - public boolean visit(Identity x) { - return false; - } - - @Override - public void endVisit(Identity x) { - - } - - @Override - public boolean visit(SQLServerColumnDefinition x) { - return visit((SQLColumnDefinition) x); - } - - @Override - public void endVisit(SQLServerColumnDefinition x) { - - } - @Override public boolean visit(SQLServerExecStatement x) { return false; 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 48bdc3cdd9..8578498a4b 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java @@ -16,7 +16,6 @@ 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; 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 fd9cd81469..b90a5c7015 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -1083,6 +1083,16 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab return false; } + + @Override + public boolean visit(SQLColumnDefinition.Identity x) { + print0(ucase ? "IDENTITY (" : "identity ("); + print(x.getSeed()); + print0(", "); + print(x.getIncrement()); + print(')'); + return false; + } protected void visitColumnDefault(SQLColumnDefinition x) { print0(ucase ? " DEFAULT " : " default "); 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 d457186c52..aadb16a3e3 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java @@ -286,6 +286,10 @@ public interface SQLASTVisitor { boolean visit(SQLColumnDefinition x); void endVisit(SQLColumnDefinition x); + + boolean visit(SQLColumnDefinition.Identity x); + + void endVisit(SQLColumnDefinition.Identity x); boolean visit(SQLDataType 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 9a67949170..f6c61e33a1 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java @@ -372,6 +372,13 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { public void endVisit(SQLColumnDefinition x) { } + + public boolean visit(SQLColumnDefinition.Identity x) { + return true; + } + + public void endVisit(SQLColumnDefinition.Identity x) { + } public boolean visit(SQLDataType x) { return true; diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest69.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest69.java new file mode 100644 index 0000000000..bd41e3ee9a --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest69.java @@ -0,0 +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.bvt.sql.mysql; + +import org.junit.Assert; +import org.junit.Test; + +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; + +public class MySqlCreateTableTest69 extends MysqlTest { + + @Test + public void test_one() throws Exception { + String sql = "CREATE TABLE t1 (" + + " s1 INT," + + " s2 INT AS (EXP(s1)) STORED" + + ")" + + "PARTITION BY LIST (s2) (" + + " PARTITION p1 VALUES IN (1)" + + ");"; + + MySqlStatementParser parser = new MySqlStatementParser(sql); + SQLStatement stmt = parser.parseCreateTable(); + + MySqlSchemaStatVisitor visitor = new MySqlSchemaStatVisitor(); + stmt.accept(visitor); + + 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); + + } +}