improved sql parser.

This commit is contained in:
wenshao
2017-08-01 17:15:04 +08:00
parent f505f76b5c
commit 512b8dbabd
17 changed files with 734 additions and 80 deletions
@@ -18,7 +18,7 @@ package com.alibaba.druid.sql.dialect.mysql.ast;
import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
public class MySqlUnique extends MySqlKey implements SQLPrimaryKey {
public class MySqlUnique extends MySqlKey {
public MySqlUnique(){
@@ -30,8 +30,8 @@ public class MySqlAlterTableChangeColumn extends MySqlObjectImpl implements SQLA
private boolean first;
private SQLExpr firstColumn;
private SQLExpr afterColumn;
private SQLName firstColumn;
private SQLName afterColumn;
@Override
public void accept0(MySqlASTVisitor visitor) {
@@ -44,19 +44,19 @@ public class MySqlAlterTableChangeColumn extends MySqlObjectImpl implements SQLA
}
}
public SQLExpr getFirstColumn() {
public SQLName getFirstColumn() {
return firstColumn;
}
public void setFirstColumn(SQLExpr firstColumn) {
public void setFirstColumn(SQLName firstColumn) {
this.firstColumn = firstColumn;
}
public SQLExpr getAfterColumn() {
public SQLName getAfterColumn() {
return afterColumn;
}
public void setAfterColumn(SQLExpr afterColumn) {
public void setAfterColumn(SQLName afterColumn) {
this.afterColumn = afterColumn;
}
@@ -16,6 +16,7 @@
package com.alibaba.druid.sql.dialect.mysql.ast.statement;
import com.alibaba.druid.sql.ast.SQLExpr;
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;
@@ -27,8 +28,8 @@ public class MySqlAlterTableModifyColumn extends MySqlObjectImpl implements SQLA
private boolean first;
private SQLExpr firstColumn;
private SQLExpr afterColumn;
private SQLName firstColumn;
private SQLName afterColumn;
@Override
public void accept0(MySqlASTVisitor visitor) {
@@ -40,19 +41,19 @@ public class MySqlAlterTableModifyColumn extends MySqlObjectImpl implements SQLA
}
}
public SQLExpr getFirstColumn() {
public SQLName getFirstColumn() {
return firstColumn;
}
public void setFirstColumn(SQLExpr firstColumn) {
public void setFirstColumn(SQLName firstColumn) {
this.firstColumn = firstColumn;
}
public SQLExpr getAfterColumn() {
public SQLName getAfterColumn() {
return afterColumn;
}
public void setAfterColumn(SQLExpr afterColumn) {
public void setAfterColumn(SQLName afterColumn) {
this.afterColumn = afterColumn;
}
@@ -15,6 +15,8 @@
*/
package com.alibaba.druid.sql.dialect.mysql.ast.statement;
import com.alibaba.druid.sql.ast.SQLObject;
import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
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;
@@ -22,11 +24,15 @@ import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
public class MySqlAlterTableOption extends MySqlObjectImpl implements SQLAlterTableItem {
private String name;
private Object value;
private SQLObject value;
public MySqlAlterTableOption(String name, Object value){
public MySqlAlterTableOption(String name, String value){
this(name, new SQLIdentifierExpr(value));
}
public MySqlAlterTableOption(String name, SQLObject value){
this.name = name;
this.value = value;
this.setValue(value);
}
public MySqlAlterTableOption(){
@@ -46,11 +52,11 @@ public class MySqlAlterTableOption extends MySqlObjectImpl implements SQLAlterTa
this.name = name;
}
public Object getValue() {
public SQLObject getValue() {
return value;
}
public void setValue(Object value) {
public void setValue(SQLObject value) {
this.value = value;
}
@@ -27,11 +27,10 @@ import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.SQLObject;
import com.alibaba.druid.sql.ast.SQLPartitionBy;
import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement;
import com.alibaba.druid.sql.ast.statement.SQLExprTableSource;
import com.alibaba.druid.sql.ast.statement.SQLSelect;
import com.alibaba.druid.sql.ast.statement.*;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlOutputVisitor;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlShowColumnOutpuVisitor;
import com.alibaba.druid.sql.visitor.SQLASTVisitor;
import com.alibaba.druid.util.JdbcConstants;
@@ -192,6 +191,57 @@ public class MySqlCreateTableStatement extends SQLCreateTableStatement implement
return false;
}
protected boolean alterApply(SQLAlterTableItem item) {
if (item instanceof MySqlAlterTableAlterColumn) {
return apply((MySqlAlterTableAlterColumn) item);
} else if (item instanceof MySqlAlterTableChangeColumn) {
return apply((MySqlAlterTableChangeColumn) item);
} else if (item instanceof MySqlAlterTableCharacter) {
return apply((MySqlAlterTableCharacter) item);
} else if (item instanceof MySqlAlterTableModifyColumn) {
return apply((MySqlAlterTableModifyColumn) item);
} else if (item instanceof MySqlAlterTableOption) {
return apply((MySqlAlterTableOption) item);
}
return super.alterApply(item);
}
public boolean apply(SQLAlterTableAddIndex x) {
MySqlTableIndex index = new MySqlTableIndex();
index.setName(x.getName());
for (SQLSelectOrderByItem orderByItem : x.getItems()) {
index.addColumn(orderByItem.clone());
}
index.setParent(this);
this.tableElementList.add(index);
return true;
}
public boolean apply(MySqlAlterTableOption item) {
this.tableOptions.put(item.getName(), item.getValue());
return true;
}
public boolean apply(MySqlAlterTableCharacter item) {
SQLExpr charset = item.getCharacterSet();
if (charset != null) {
this.tableOptions.put("CHARACTER SET", charset);
}
SQLExpr collate = item.getCollate();
if (collate != null) {
this.tableOptions.put("COLLATE", collate);
}
return true;
}
public boolean apply(MySqlRenameTableStatement.Item item) {
if (!SQLUtils.nameEquals((SQLName) item.getName(), this.getName())) {
return false;
@@ -199,4 +249,97 @@ public class MySqlCreateTableStatement extends SQLCreateTableStatement implement
this.setName((SQLName) item.getTo().clone());
return true;
}
public boolean apply(MySqlAlterTableAlterColumn x) {
int columnIndex = columnIndexOf(x.getColumn());
if (columnIndex == -1) {
return false;
}
SQLExpr defaultExpr = x.getDefaultExpr();
SQLColumnDefinition column = (SQLColumnDefinition) tableElementList.get(columnIndex);
if (x.isDropDefault()) {
column.setDefaultExpr(null);
} else if (defaultExpr != null) {
column.setDefaultExpr(defaultExpr);
}
return true;
}
public boolean apply(MySqlAlterTableChangeColumn item) {
SQLName columnName = item.getColumnName();
int columnIndex = columnIndexOf(columnName);
if (columnIndex == -1) {
return false;
}
int afterIndex = columnIndexOf(item.getAfterColumn());
int beforeIndex = columnIndexOf(item.getFirstColumn());
int insertIndex = -1;
if (beforeIndex != -1) {
insertIndex = beforeIndex;
} else if (afterIndex != -1) {
insertIndex = afterIndex + 1;
}
SQLColumnDefinition column = item.getNewColumnDefinition().clone();
column.setParent(this);
if (insertIndex == -1 || insertIndex == columnIndex) {
tableElementList.set(columnIndex, column);
return true;
} else {
if (insertIndex > columnIndex) {
tableElementList.add(insertIndex, column);
tableElementList.remove(columnIndex);
} else {
tableElementList.remove(columnIndex);
tableElementList.add(insertIndex, column);
}
}
return true;
}
public boolean apply(MySqlAlterTableModifyColumn item) {
SQLColumnDefinition column = item.getNewColumnDefinition().clone();
SQLName columnName = column.getName();
int columnIndex = columnIndexOf(columnName);
if (columnIndex == -1) {
return false;
}
int afterIndex = columnIndexOf(item.getAfterColumn());
int beforeIndex = columnIndexOf(item.getFirstColumn());
int insertIndex = -1;
if (beforeIndex != -1) {
insertIndex = beforeIndex;
} else if (afterIndex != -1) {
insertIndex = afterIndex + 1;
}
column.setParent(this);
if (insertIndex == -1 || insertIndex == columnIndex) {
tableElementList.set(columnIndex, column);
return true;
} else {
if (insertIndex > columnIndex) {
tableElementList.add(insertIndex, column);
tableElementList.remove(columnIndex);
} else {
tableElementList.remove(columnIndex);
tableElementList.add(insertIndex, column);
}
}
return true;
}
public void output(StringBuffer buf) {
this.accept(new MySqlOutputVisitor(buf));
}
}
@@ -16,11 +16,12 @@
package com.alibaba.druid.sql.dialect.mysql.ast.statement;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
public class MySqlShowCreateTableStatement extends MySqlStatementImpl implements MySqlShowStatement {
private SQLExpr name;
private SQLName name;
public void accept0(MySqlASTVisitor visitor) {
if (visitor.visit(this)) {
@@ -29,11 +30,11 @@ public class MySqlShowCreateTableStatement extends MySqlStatementImpl implements
visitor.endVisit(this);
}
public SQLExpr getName() {
public SQLName getName() {
return name;
}
public void setName(SQLExpr name) {
public void setName(SQLName name) {
if (name != null) {
name.setParent(this);
}
@@ -20,6 +20,7 @@ import java.util.List;
import com.alibaba.druid.sql.ast.SQLExpr;
import com.alibaba.druid.sql.ast.SQLName;
import com.alibaba.druid.sql.ast.statement.SQLSelectOrderByItem;
import com.alibaba.druid.sql.ast.statement.SQLTableElement;
import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl;
import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor;
@@ -28,7 +29,7 @@ public class MySqlTableIndex extends MySqlObjectImpl implements SQLTableElement
private SQLName name;
private String indexType;
private List<SQLExpr> columns = new ArrayList<SQLExpr>();
private List<SQLSelectOrderByItem> columns = new ArrayList<SQLSelectOrderByItem>();
public MySqlTableIndex(){
@@ -50,11 +51,11 @@ public class MySqlTableIndex extends MySqlObjectImpl implements SQLTableElement
this.name = name;
}
public List<SQLExpr> getColumns() {
public List<SQLSelectOrderByItem> getColumns() {
return columns;
}
public void addColumn(SQLExpr column) {
public void addColumn(SQLSelectOrderByItem column) {
if (column != null) {
column.setParent(this);
}
@@ -140,7 +140,7 @@ public class MySqlCreateTableParser extends SQLCreateTableParser {
accept(Token.LPAREN);
for (;;) {
idx.addColumn(this.exprParser.expr());
idx.addColumn(this.exprParser.parseSelectOrderByItem());
if (!(lexer.token() == (Token.COMMA))) {
break;
} else {
@@ -2843,7 +2843,7 @@ public class MySqlStatementParser extends SQLStatementParser {
} else if (identifierEquals(AUTO_INCREMENT)) {
lexer.nextToken();
accept(Token.EQ);
stmt.addItem(new MySqlAlterTableOption(AUTO_INCREMENT, lexer.integerValue()));
stmt.addItem(new MySqlAlterTableOption(AUTO_INCREMENT, new SQLIntegerExpr(lexer.integerValue())));
lexer.nextToken();
} else if (identifierEquals(COLLATE2)) {
lexer.nextToken();