sql paser refactor SQLColumnDefinition

This commit is contained in:
高铁
2016-02-27 10:48:09 +08:00
parent c9c6117897
commit e86a34c07d
15 changed files with 255 additions and 287 deletions
@@ -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<SQLColumnConstraint> constraints = new ArrayList<SQLColumnConstraint>(0);
protected SQLExpr comment;
protected final List<SQLColumnConstraint> constraints = new ArrayList<SQLColumnConstraint>(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);
}
}
}
@@ -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;
}
}
@@ -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);
@@ -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;
}
@@ -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);
}
}
}
@@ -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);
@@ -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);
@@ -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;
@@ -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 ");
@@ -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;
@@ -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;
@@ -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 ");
@@ -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);
@@ -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;