mysql parser ddl support

This commit is contained in:
温少
2012-05-18 09:12:36 +08:00
13 changed files with 568 additions and 6 deletions
@@ -0,0 +1,49 @@
package com.alibaba.druid.sql.ast.statement;
import java.util.ArrayList;
import java.util.List;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.SQLObjectImpl;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
public class SQLAlterTableAddIndex extends SQLObjectImpl implements SQLAlterTableItem {
private static final long serialVersionUID = 1L;
private SQLName name;
private List<SQLSelectOrderByItem> items = new ArrayList<SQLSelectOrderByItem>();
private String type;
@Override
protected void accept0(SQLASTVisitor visitor) {
}
public List<SQLSelectOrderByItem> getItems() {
return items;
}
public void setItems(List<SQLSelectOrderByItem> items) {
this.items = items;
}
public SQLName getName() {
return name;
}
public void setName(SQLName name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
@@ -0,0 +1,6 @@
package com.alibaba.druid.sql.ast.statement;
public class SQLIndexDefinition {
}
@@ -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 MySqlAlterTableAddIndex 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);
}
}
@@ -0,0 +1,51 @@
package com.alibaba.druid.sql.dialect.mysql.ast.statement;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem;
import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
public class MySqlAlterTableChangeColumn extends MySqlObjectImpl implements SQLAlterTableItem {
private static final long serialVersionUID = 1L;
private SQLName columnName;
private SQLColumnDefinition newColumnDefinition;
private Boolean first;
@Override
public void accept0(MySqlASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, columnName);
acceptChild(visitor, newColumnDefinition);
}
}
public SQLName getColumnName() {
return columnName;
}
public void setColumnName(SQLName columnName) {
this.columnName = columnName;
}
public SQLColumnDefinition getNewColumnDefinition() {
return newColumnDefinition;
}
public void setNewColumnDefinition(SQLColumnDefinition newColumnDefinition) {
this.newColumnDefinition = newColumnDefinition;
}
public Boolean getFirst() {
return first;
}
public void setFirst(Boolean first) {
this.first = first;
}
}
@@ -0,0 +1,40 @@
package com.alibaba.druid.sql.dialect.mysql.ast.statement;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
public class MySqlAlterTableCharacter extends MySqlObjectImpl implements SQLAlterTableItem {
private static final long serialVersionUID = 1L;
private SQLExpr characterSet;
private SQLExpr collate;
@Override
public void accept0(MySqlASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, characterSet);
acceptChild(visitor, collate);
}
visitor.endVisit(this);
}
public SQLExpr getCharacterSet() {
return characterSet;
}
public void setCharacterSet(SQLExpr characterSet) {
this.characterSet = characterSet;
}
public SQLExpr getCollate() {
return collate;
}
public void setCollate(SQLExpr collate) {
this.collate = collate;
}
}
@@ -0,0 +1,44 @@
package com.alibaba.druid.sql.dialect.mysql.ast.statement;
import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
public class MySqlAlterTableOption extends MySqlObjectImpl implements SQLAlterTableItem {
private static final long serialVersionUID = 1L;
private String name;
private String value;
public MySqlAlterTableOption(String name, String value){
this.name = name;
this.value = value;
}
public MySqlAlterTableOption(){
}
@Override
public void accept0(MySqlASTVisitor visitor) {
visitor.visit(this);
visitor.endVisit(this);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
}
@@ -15,7 +15,7 @@
*/
package com.alibaba.druid.sql.dialect.mysql.ast.statement;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import com.alibaba.druid.sql.ast.SQLPartitioningClause;
@@ -27,7 +27,7 @@ public class MySqlCreateTableStatement extends SQLCreateTableStatement {
private boolean ifNotExiists = false;
private Map<String, String> tableOptions = new HashMap<String, String>();
private Map<String, String> tableOptions = new LinkedHashMap<String, String>();
protected SQLSelect query;
@@ -40,6 +40,10 @@ import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem;
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.MySqlAlterTableChangeColumn;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCommitStatement;
@@ -2045,6 +2049,25 @@ public class MySqlStatementParser extends SQLStatementParser {
lexer.nextToken();
item.setAfter(this.exprParser.name());
}
stmt.getItems().add(item);
} else if (lexer.token() == Token.INDEX) {
lexer.nextToken();
MySqlAlterTableAddIndex item = new MySqlAlterTableAddIndex();
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 {
throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal());
@@ -2052,7 +2075,21 @@ public class MySqlStatementParser extends SQLStatementParser {
} else if (identifierEquals("ALTER")) {
throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal());
} else if (identifierEquals("CHANGE")) {
throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal());
lexer.nextToken();
if (identifierEquals("COLUMN")) {
lexer.nextToken();
}
MySqlAlterTableChangeColumn item = new MySqlAlterTableChangeColumn();
item.setColumnName(this.exprParser.name());
item.setNewColumnDefinition(this.exprParser.parseColumn());
if (identifierEquals("FIRST")) {
lexer.nextToken();
item.setFirst(true);
} else if (identifierEquals("AFTER")) {
lexer.nextToken();
item.setFirst(false);
}
stmt.getItems().add(item);
} else if (identifierEquals("MODIFY")) {
throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal());
} else if (lexer.token() == Token.DROP) {
@@ -2102,6 +2139,47 @@ public class MySqlStatementParser extends SQLStatementParser {
throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal());
} else if (identifierEquals("REMOVE")) {
throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal());
} else if (identifierEquals("ENGINE")) {
lexer.nextToken();
accept(Token.EQ);
stmt.getItems().add(new MySqlAlterTableOption("ENGINE", lexer.stringVal()));
lexer.nextToken();
} else if (identifierEquals("COLLATE")) {
lexer.nextToken();
accept(Token.EQ);
stmt.getItems().add(new MySqlAlterTableOption("COLLATE", lexer.stringVal()));
lexer.nextToken();
} else if (identifierEquals("PACK_KEYS")) {
lexer.nextToken();
accept(Token.EQ);
if (identifierEquals("PACK")) {
lexer.nextToken();
accept(Token.ALL);
stmt.getItems().add(new MySqlAlterTableOption("PACK_KEYS", "PACK ALL"));
} else {
stmt.getItems().add(new MySqlAlterTableOption("PACK_KEYS", lexer.stringVal()));
lexer.nextToken();
}
} else if (identifierEquals("CHARACTER")) {
lexer.nextToken();
accept(Token.SET);
accept(Token.EQ);
MySqlAlterTableCharacter item = new MySqlAlterTableCharacter();
item.setCharacterSet(this.exprParser.primary());
if (lexer.token() == Token.COMMA) {
lexer.nextToken();
acceptIdentifier("COLLATE");
accept(Token.EQ);
item.setCollate(this.exprParser.primary());
}
stmt.getItems().add(item);
} else {
break;
}
if (lexer.token() == Token.COMMA) {
lexer.nextToken();
continue;
} else {
break;
}
@@ -29,6 +29,10 @@ 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.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.MySqlAlterTableChangeColumn;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCommitStatement;
@@ -475,4 +479,20 @@ public interface MySqlASTVisitor extends SQLASTVisitor {
boolean visit(MySqlForceIndexHint x);
void endVisit(MySqlForceIndexHint x);
boolean visit(MySqlAlterTableChangeColumn x);
void endVisit(MySqlAlterTableChangeColumn x);
boolean visit(MySqlAlterTableCharacter x);
void endVisit(MySqlAlterTableCharacter x);
boolean visit(MySqlAlterTableAddIndex x);
void endVisit(MySqlAlterTableAddIndex x);
boolean visit(MySqlAlterTableOption x);
void endVisit(MySqlAlterTableOption x);
}
@@ -14,6 +14,10 @@ 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.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.MySqlAlterTableChangeColumn;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCommitStatement;
@@ -1035,4 +1039,44 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements
public void endVisit(MySqlForceIndexHint x) {
}
@Override
public boolean visit(MySqlAlterTableChangeColumn x) {
return true;
}
@Override
public void endVisit(MySqlAlterTableChangeColumn x) {
}
@Override
public boolean visit(MySqlAlterTableCharacter x) {
return true;
}
@Override
public void endVisit(MySqlAlterTableCharacter x) {
}
@Override
public boolean visit(MySqlAlterTableAddIndex x) {
return true;
}
@Override
public void endVisit(MySqlAlterTableAddIndex x) {
}
@Override
public boolean visit(MySqlAlterTableOption x) {
return true;
}
@Override
public void endVisit(MySqlAlterTableOption x) {
}
}
@@ -46,6 +46,10 @@ 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.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.MySqlAlterTableChangeColumn;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCommitStatement;
@@ -2228,7 +2232,11 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
}
x.getName().accept(this);
incrementIndent();
for (SQLAlterTableItem item : x.getItems()) {
for (int i = 0; i < x.getItems().size(); ++i) {
SQLAlterTableItem item = x.getItems().get(i);
if (i != 0) {
print(',');
}
println();
item.accept(this);
}
@@ -2458,7 +2466,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
@Override
public void endVisit(MySqlLockTableStatement x) {
}
@Override
@@ -2469,7 +2477,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
@Override
public void endVisit(MySqlUnlockTablesStatement x) {
}
@Override
@@ -2488,6 +2496,86 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
@Override
public void endVisit(MySqlForceIndexHint x) {
}
@Override
public boolean visit(MySqlAlterTableChangeColumn x) {
print("CHANGE COLUMN ");
x.getColumnName().accept(this);
print(' ');
x.getNewColumnDefinition().accept(this);
if (x.getFirst() != null) {
if (x.getFirst().booleanValue()) {
print(" FIRST");
} else {
print(" AFTER");
}
}
return false;
}
@Override
public void endVisit(MySqlAlterTableChangeColumn x) {
}
@Override
public boolean visit(MySqlAlterTableCharacter x) {
print("CHARACTER SET = ");
x.getCharacterSet().accept(this);
if (x.getCollate() != null) {
print(", COLLATE = ");
x.getCollate().accept(this);
}
return false;
}
@Override
public void endVisit(MySqlAlterTableCharacter x) {
}
@Override
public boolean visit(MySqlAlterTableAddIndex x) {
print("ADD ");
if (x.getType() != null) {
print(x.getType());
print(" ");
}
print("INDEX ");
x.getName().accept(this);
print(" (");
printAndAccept(x.getItems(), ", ");
print(")");
if (x.getUsing() != null) {
print(" USING ");
print(x.getUsing());
}
return false;
}
@Override
public void endVisit(MySqlAlterTableAddIndex x) {
}
@Override
public boolean visit(MySqlAlterTableOption x) {
print(x.getName());
print(" = ");
print(x.getValue());
return false;
}
@Override
public void endVisit(MySqlAlterTableOption x) {
}
}
@@ -24,6 +24,10 @@ 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.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.MySqlAlterTableChangeColumn;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableOption;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlBinlogStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCommitStatement;
@@ -1099,4 +1103,44 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
public void endVisit(MySqlForceIndexHint x) {
}
@Override
public boolean visit(MySqlAlterTableChangeColumn x) {
return false;
}
@Override
public void endVisit(MySqlAlterTableChangeColumn x) {
}
@Override
public boolean visit(MySqlAlterTableCharacter x) {
return false;
}
@Override
public void endVisit(MySqlAlterTableCharacter x) {
}
@Override
public boolean visit(MySqlAlterTableAddIndex x) {
return false;
}
@Override
public void endVisit(MySqlAlterTableAddIndex x) {
}
@Override
public boolean visit(MySqlAlterTableOption x) {
return false;
}
@Override
public void endVisit(MySqlAlterTableOption x) {
}
}