mysql parser ddl support

This commit is contained in:
温少
2012-05-18 08:14:38 +08:00
11 changed files with 349 additions and 2 deletions
@@ -0,0 +1,17 @@
package com.alibaba.druid.sql.dialect.mysql.ast;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
public class MySqlForceIndexHint extends MySqlIndexHintImpl {
private static final long serialVersionUID = 1L;
@Override
public void accept0(MySqlASTVisitor visitor) {
if (visitor.visit(this)) {
acceptChild(visitor, getIndexList());
}
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;
}
}
@@ -23,6 +23,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectQuery;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.ast.statement.SQLTableSource;
import com.alibaba.druid.sql.ast.statement.SQLUnionQuery;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlForceIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlIgnoreIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlIndexHintImpl;
@@ -272,6 +273,13 @@ public class MySqlSelectParser extends SQLSelectParser {
parseIndexHint(hint);
tableSource.getHints().add(hint);
}
if (identifierEquals("FORCE")) {
lexer.nextToken();
MySqlForceIndexHint hint = new MySqlForceIndexHint();
parseIndexHint(hint);
tableSource.getHints().add(hint);
}
return super.parseTableSourceRest(tableSource);
}
@@ -40,6 +40,8 @@ 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.MySqlAlterTableChangeColumn;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter;
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;
@@ -2052,7 +2054,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 +2118,19 @@ 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("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;
}
@@ -15,6 +15,7 @@
*/
package com.alibaba.druid.sql.dialect.mysql.visitor;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlForceIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlIgnoreIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey;
@@ -28,6 +29,8 @@ 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.MySqlAlterTableChangeColumn;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter;
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;
@@ -470,4 +473,16 @@ public interface MySqlASTVisitor extends SQLASTVisitor {
boolean visit(MySqlUnlockTablesStatement x);
void endVisit(MySqlUnlockTablesStatement x);
boolean visit(MySqlForceIndexHint x);
void endVisit(MySqlForceIndexHint x);
boolean visit(MySqlAlterTableChangeColumn x);
void endVisit(MySqlAlterTableChangeColumn x);
boolean visit(MySqlAlterTableCharacter x);
void endVisit(MySqlAlterTableCharacter x);
}
@@ -1,5 +1,6 @@
package com.alibaba.druid.sql.dialect.mysql.visitor;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlForceIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlIgnoreIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey;
@@ -13,6 +14,8 @@ 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.MySqlAlterTableChangeColumn;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter;
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;
@@ -1024,4 +1027,34 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements
public void endVisit(MySqlUnlockTablesStatement x) {
}
@Override
public boolean visit(MySqlForceIndexHint x) {
return true;
}
@Override
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) {
}
}
@@ -31,6 +31,7 @@ import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition;
import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlForceIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlIgnoreIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey;
@@ -45,6 +46,8 @@ 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.MySqlAlterTableChangeColumn;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter;
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;
@@ -2457,7 +2460,7 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
@Override
public void endVisit(MySqlLockTableStatement x) {
}
@Override
@@ -2468,6 +2471,65 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV
@Override
public void endVisit(MySqlUnlockTablesStatement x) {
}
@Override
public boolean visit(MySqlForceIndexHint x) {
print("FORCE INDEX ");
if (x.getOption() != null) {
print("FOR ");
print(x.getOption().name);
print(' ');
}
print('(');
printAndAccept(x.getIndexList(), ", ");
print(')');
return false;
}
@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) {
}
}
@@ -10,6 +10,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock;
import com.alibaba.druid.sql.ast.statement.SQLSelectStatement;
import com.alibaba.druid.sql.ast.statement.SQLUnionQuery;
import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlForceIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlIgnoreIndexHint;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlKey;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey;
@@ -23,6 +24,8 @@ 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.MySqlAlterTableChangeColumn;
import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlAlterTableCharacter;
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;
@@ -1088,4 +1091,34 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS
public void endVisit(MySqlUnlockTablesStatement x) {
}
@Override
public boolean visit(MySqlForceIndexHint x) {
return false;
}
@Override
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) {
}
}