From 58b82281fad4294b42a9ff848c69925f21b13e85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=B8=A9=E5=B0=91?= Date: Wed, 23 May 2012 10:00:42 +0800 Subject: [PATCH] mysql parser alter table support --- .../spi/MSSQLServerMappingVisitor.java | 6 --- .../mapping/spi/MappingVisitorUtils.java | 20 +-------- .../mapping/spi/MySqlMappingVisitor.java | 6 --- .../mapping/spi/OracleMappingVisitor.java | 6 --- .../druid/sql/ast/expr/SQLVariantRefExpr.java | 12 +++++- .../statement/MySqlAlterTableAddUnique.java | 40 +++++++++++++++++ .../mysql/parser/MySqlStatementParser.java | 34 +++++++++++++-- .../mysql/visitor/MySqlASTVisitor.java | 5 +++ .../mysql/visitor/MySqlASTVisitorAdapter.java | 13 +++++- .../mysql/visitor/MySqlOutputVisitor.java | 43 ++++++++++++++++--- .../mysql/visitor/MySqlSchemaStatVisitor.java | 11 +++++ .../com/alibaba/druid/sql/parser/Lexer.java | 18 +++++--- .../druid/sql/parser/SQLExprParser.java | 4 +- .../druid/sql/visitor/SQLEvalVisitor.java | 2 - .../sql/visitor/SQLEvalVisitorUtils.java | 11 ++--- .../bvt/sql/mysql/MySqlAlterTableTest1.java | 9 ++++ 16 files changed, 176 insertions(+), 64 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableAddUnique.java diff --git a/src/main/java/com/alibaba/druid/mapping/spi/MSSQLServerMappingVisitor.java b/src/main/java/com/alibaba/druid/mapping/spi/MSSQLServerMappingVisitor.java index 189f8169a2..95f7a83bb0 100644 --- a/src/main/java/com/alibaba/druid/mapping/spi/MSSQLServerMappingVisitor.java +++ b/src/main/java/com/alibaba/druid/mapping/spi/MSSQLServerMappingVisitor.java @@ -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); diff --git a/src/main/java/com/alibaba/druid/mapping/spi/MappingVisitorUtils.java b/src/main/java/com/alibaba/druid/mapping/spi/MappingVisitorUtils.java index d0ffb087dc..1c2e7b2a4e 100644 --- a/src/main/java/com/alibaba/druid/mapping/spi/MappingVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/mapping/spi/MappingVisitorUtils.java @@ -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 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 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(); diff --git a/src/main/java/com/alibaba/druid/mapping/spi/MySqlMappingVisitor.java b/src/main/java/com/alibaba/druid/mapping/spi/MySqlMappingVisitor.java index da16c5ec05..016a3acbf8 100644 --- a/src/main/java/com/alibaba/druid/mapping/spi/MySqlMappingVisitor.java +++ b/src/main/java/com/alibaba/druid/mapping/spi/MySqlMappingVisitor.java @@ -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) { diff --git a/src/main/java/com/alibaba/druid/mapping/spi/OracleMappingVisitor.java b/src/main/java/com/alibaba/druid/mapping/spi/OracleMappingVisitor.java index f3ee0d3574..39793f6e68 100644 --- a/src/main/java/com/alibaba/druid/mapping/spi/OracleMappingVisitor.java +++ b/src/main/java/com/alibaba/druid/mapping/spi/OracleMappingVisitor.java @@ -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); diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLVariantRefExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLVariantRefExpr.java index 8df34b6112..cf0b8e7481 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLVariantRefExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLVariantRefExpr.java @@ -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; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableAddUnique.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableAddUnique.java new file mode 100644 index 0000000000..1b496395f4 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlAlterTableAddUnique.java @@ -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); + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java index 6868313458..3a5f223045 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java @@ -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) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java index d77ebc7d3c..71909b806e 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java @@ -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); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java index a389c55bfe..eb0d90e8ce 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java @@ -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) { + + } } 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 fee8400a20..94da69584b 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 @@ -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) { - + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java index 1fc9e5a9c8..48202f25a8 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java @@ -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) { + + } } diff --git a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java index e0804ab0b2..15a58a62ee 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java @@ -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; } } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index 29da379b6e..adfb2ab012 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -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"); diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitor.java index 7df2ca0c0f..ffdd2bac47 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitor.java @@ -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 getParameters(); diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java index cce8c1de68..e88303318e 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java @@ -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 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); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest1.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest1.java index 0e7f4f7d8f..015174ed80 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest1.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest1.java @@ -27,5 +27,14 @@ public class MySqlAlterTableTest1 extends TestCase { String output = SQLUtils.toMySqlString(stmt); Assert.assertEquals("ALTER TABLE t2\n\tADD COLUMN d TIMESTAMP", output); } + + public void test_alter_2() throws Exception { + String sql = "ALTER TABLE t2 ADD INDEX (d), ADD UNIQUE (a);"; + MySqlStatementParser parser = new MySqlStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + parser.match(Token.EOF); + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("ALTER TABLE t2\n\tADD INDEX (d),\n\tADD UNIQUE (a)", output); + } }