mysql parser alter table support

This commit is contained in:
温少
2012-05-23 10:00:42 +08:00
parent 1e37332858
commit 58b82281fa
16 changed files with 176 additions and 64 deletions
@@ -14,7 +14,6 @@ import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource;
import com.alibaba.druid.sql.ast.statement.SQLSelectItem;
@@ -111,11 +110,6 @@ public class MSSQLServerMappingVisitor extends SQLServerASTVisitorAdapter implem
return MappingVisitorUtils.visit(this, x);
}
@Override
public boolean visit(SQLVariantRefExpr x) {
return MappingVisitorUtils.visit(this, x);
}
@Override
public boolean visit(SQLAllColumnExpr x) {
return MappingVisitorUtils.visit(this, x);
@@ -30,7 +30,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock.L
public class MappingVisitorUtils {
private static final String MAPPING_VAR_INDEX = "mapping.varIndex";
private static final String MAPPING_VALUE = "mapping.value";
private static final String MAPPING_PROPERTY = "mapping.property";
private static final String MAPPING_ENTITY = "mapping.entity";
@@ -252,14 +251,9 @@ public class MappingVisitorUtils {
}
if (expr instanceof SQLVariantRefExpr) {
Map<String, Object> attributes = expr.getAttributes();
Integer varIndex = (Integer) attributes.get(MAPPING_VAR_INDEX);
if (varIndex == null) {
varIndex = visitor.getAndIncrementVariantIndex();
expr.putAttribute(MAPPING_VAR_INDEX, varIndex);
}
int varIndex = ((SQLVariantRefExpr) expr).getIndex();
if (visitor.getParameters().size() > varIndex) {
if (varIndex != -1 && visitor.getParameters().size() > varIndex) {
Object parameter = visitor.getParameters().get(varIndex);
expr.putAttribute(MAPPING_VALUE, parameter);
}
@@ -371,16 +365,6 @@ public class MappingVisitorUtils {
return false;
}
public static boolean visit(MappingVisitor visitor, SQLVariantRefExpr x) {
Map<String, Object> attributes = x.getAttributes();
Integer varIndex = (Integer) attributes.get(MAPPING_VAR_INDEX);
if (varIndex == null) {
varIndex = visitor.getAndIncrementVariantIndex();
x.putAttribute(MAPPING_VAR_INDEX, varIndex);
}
return false;
}
public static boolean visit(MappingVisitor visitor, MySqlSelectQueryBlock x) {
Integer maxLimit = visitor.getEngine().getMaxLimit();
@@ -14,7 +14,6 @@ import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource;
import com.alibaba.druid.sql.ast.statement.SQLSelectItem;
@@ -110,11 +109,6 @@ public class MySqlMappingVisitor extends MySqlASTVisitorAdapter implements Mappi
public boolean visit(SQLBinaryOpExpr x) {
return MappingVisitorUtils.visit(this, x);
}
@Override
public boolean visit(SQLVariantRefExpr x) {
return MappingVisitorUtils.visit(this, x);
}
@Override
public boolean visit(SQLAllColumnExpr x) {
@@ -14,7 +14,6 @@ import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr;
import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource;
import com.alibaba.druid.sql.ast.statement.SQLSelectItem;
@@ -113,11 +112,6 @@ public class OracleMappingVisitor extends OracleASTVisitorAdapter implements Map
return MappingVisitorUtils.visit(this, x);
}
@Override
public boolean visit(SQLVariantRefExpr x) {
return MappingVisitorUtils.visit(this, x);
}
@Override
public boolean visit(SQLAllColumnExpr x) {
return MappingVisitorUtils.visit(this, x);
@@ -26,10 +26,12 @@ public class SQLVariantRefExpr extends SQLExprImpl {
private boolean global = false;
private int index = -1;
public SQLVariantRefExpr(String name){
this.name = name;
}
public SQLVariantRefExpr(String name, boolean global){
this.name = name;
this.global = global;
@@ -39,6 +41,14 @@ public class SQLVariantRefExpr extends SQLExprImpl {
}
public int getIndex() {
return index;
}
public void setIndex(int index) {
this.index = index;
}
public String getName() {
return this.name;
}
@@ -0,0 +1,40 @@
package com.alibaba.druid.sql.dialect.mysql.ast.statement;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddIndex;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObject;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class MySqlAlterTableAddUnique extends SQLAlterTableAddIndex implements SQLAlterTableItem, MySqlObject {
private static final long serialVersionUID = 1L;
private String using;
public String getUsing() {
return using;
}
public void setUsing(String using) {
this.using = using;
}
@Override
protected void accept0(SQLASTVisitor visitor) {
if (visitor instanceof MySqlASTVisitor) {
accept0((MySqlASTVisitor) visitor);
} else {
throw new IllegalArgumentException("not support visitor type : " + visitor.getClass().getName());
}
}
public void accept0(MySqlASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, getName());
acceptChild(visitor, getItems());
}
visitor.endVisit(this);
}
}
@@ -42,6 +42,7 @@ import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.CobarShowStatus;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddColumn;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddIndex;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddUnique;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableChangeColumn;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption;
@@ -2065,10 +2066,14 @@ public class MySqlStatementParser extends SQLStatementParser {
} else if (lexer.token() == Token.INDEX) {
lexer.nextToken();
MySqlAlterTableAddIndex item = new MySqlAlterTableAddIndex();
item.setName(this.exprParser.name());
accept(Token.LPAREN);
if (lexer.token() == Token.LPAREN) {
lexer.nextToken();
} else {
item.setName(this.exprParser.name());
accept(Token.LPAREN);
}
for (;;) {
SQLSelectOrderByItem column = this.exprParser.parseSelectOrderByItem();
item.getItems().add(column);
@@ -2082,7 +2087,28 @@ public class MySqlStatementParser extends SQLStatementParser {
stmt.getItems().add(item);
} else if (lexer.token() == Token.UNIQUE) {
throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal());
lexer.nextToken();
MySqlAlterTableAddUnique item = new MySqlAlterTableAddUnique();
if (lexer.token() == Token.LPAREN) {
lexer.nextToken();
} else {
item.setName(this.exprParser.name());
accept(Token.LPAREN);
}
for (;;) {
SQLSelectOrderByItem column = this.exprParser.parseSelectOrderByItem();
item.getItems().add(column);
if (lexer.token() == Token.COMMA) {
lexer.nextToken();
continue;
}
break;
}
accept(Token.RPAREN);
stmt.getItems().add(item);
} else if (lexer.token() == Token.KEY) {
throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal());
} else if (lexer.token() == Token.CONSTRAINT) {
@@ -31,6 +31,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlUserName;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.CobarShowStatus;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddColumn;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddIndex;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddUnique;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableChangeColumn;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption;
@@ -510,4 +511,8 @@ public interface MySqlASTVisitor extends SQLASTVisitor {
boolean visit(MySqlCharExpr x);
void endVisit(MySqlCharExpr x);
boolean visit(MySqlAlterTableAddUnique x);
void endVisit(MySqlAlterTableAddUnique x);
}
@@ -16,6 +16,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlUserName;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.CobarShowStatus;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddColumn;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddIndex;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddUnique;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableChangeColumn;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption;
@@ -1105,11 +1106,21 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements
@Override
public boolean visit(MySqlCharExpr x) {
return false;
return true;
}
@Override
public void endVisit(MySqlCharExpr x) {
}
@Override
public boolean visit(MySqlAlterTableAddUnique x) {
return true;
}
@Override
public void endVisit(MySqlAlterTableAddUnique x) {
}
}
@@ -48,6 +48,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlUserName;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.CobarShowStatus;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddColumn;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddIndex;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddUnique;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableChangeColumn;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption;
@@ -163,7 +164,6 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
}
print("SELECT ");
for (SQLCommentHint hint : x.getHints()) {
hint.accept(this);
@@ -2548,8 +2548,11 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
print("INDEX ");
x.getName().accept(this);
print(" (");
if (x.getName() != null) {
x.getName().accept(this);
print(' ');
}
print("(");
printAndAccept(x.getItems(), ", ");
print(")");
@@ -2563,6 +2566,36 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
@Override
public void endVisit(MySqlAlterTableAddIndex x) {
}
@Override
public boolean visit(MySqlAlterTableAddUnique x) {
print("ADD ");
if (x.getType() != null) {
print(x.getType());
print(" ");
}
print("UNIQUE ");
if (x.getName() != null) {
x.getName().accept(this);
print(' ');
}
print("(");
printAndAccept(x.getItems(), ", ");
print(")");
if (x.getUsing() != null) {
print(" USING ");
print(x.getUsing());
}
return false;
}
@Override
public void endVisit(MySqlAlterTableAddUnique x) {
}
@Override
@@ -2592,7 +2625,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
@Override
public void endVisit(MySqlHelpStatement x) {
}
@Override
@@ -2603,6 +2636,6 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
@Override
public void endVisit(MySqlCharExpr x) {
}
}
@@ -27,6 +27,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlUserName;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.CobarShowStatus;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddColumn;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddIndex;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableAddUnique;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableChangeColumn;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption;
@@ -1177,4 +1178,14 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
public void endVisit(MySqlCharExpr x) {
}
@Override
public boolean visit(MySqlAlterTableAddUnique x) {
return false;
}
@Override
public void endVisit(MySqlAlterTableAddUnique x) {
}
}
@@ -82,6 +82,8 @@ public class Lexer {
*/
private boolean allowComment = true;
private int varIndex = -1;
public Lexer(String input){
this(input, true);
}
@@ -93,6 +95,10 @@ public class Lexer {
public void setAllowComment(boolean allowComment) {
this.allowComment = allowComment;
}
public int nextVarIndex() {
return ++varIndex;
}
private static class SavePoint {
@@ -185,7 +191,7 @@ public class Lexer {
public final Token token() {
return token;
}
public String info() {
return this.token + " " + this.stringVal();
}
@@ -507,11 +513,11 @@ public class Lexer {
token = LITERAL_CHARS;
break;
} else {
if (!hasSpecial) {
System.arraycopy(buf, np + 1, sbuf, 0, sp);
hasSpecial = true;
}
putChar('\'');
if (!hasSpecial) {
System.arraycopy(buf, np + 1, sbuf, 0, sp);
hasSpecial = true;
}
putChar('\'');
continue;
}
}
@@ -356,7 +356,9 @@ public class SQLExprParser extends SQLParser {
break;
case QUES:
lexer.nextToken();
sqlExpr = new SQLVariantRefExpr("?");
SQLVariantRefExpr quesVarRefExpr = new SQLVariantRefExpr("?");
quesVarRefExpr.setIndex(lexer.nextVarIndex());
sqlExpr = quesVarRefExpr;
break;
case LEFT:
sqlExpr = new SQLIdentifierExpr("LEFT");
@@ -4,8 +4,6 @@ import java.util.List;
public interface SQLEvalVisitor extends SQLASTVisitor {
public static final String EVAL_VAR_INDEX = "eval.varIndex";
public static final String EVAL_VALUE = "eval.value";
List<Object> getParameters();
@@ -1,7 +1,6 @@
package com.alibaba.druid.sql.visitor;
import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_VALUE;
import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_VAR_INDEX;
import java.math.BigDecimal;
import java.math.BigInteger;
@@ -104,16 +103,12 @@ public class SQLEvalVisitorUtils {
Map<String, Object> attributes = x.getAttributes();
Integer varIndex = (Integer) attributes.get(EVAL_VAR_INDEX);
if (varIndex == null) {
varIndex = visitor.incrementAndGetVariantIndex();
x.putAttribute(EVAL_VAR_INDEX, varIndex);
}
int varIndex = x.getIndex();
if (visitor.getParameters().size() > 0) {
if (varIndex != -1 && visitor.getParameters().size() > varIndex) {
boolean containsValue = attributes.containsKey(EVAL_VALUE);
if (!containsValue) {
Object value = visitor.getParameters().get(varIndex.intValue());
Object value = visitor.getParameters().get(varIndex);
attributes.put(EVAL_VALUE, value);
}
}