mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
improved sql parser.
This commit is contained in:
@@ -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(){
|
||||
|
||||
|
||||
+6
-6
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+7
-6
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+11
-5
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
+146
-3
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
+4
-3
@@ -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);
|
||||
}
|
||||
|
||||
+4
-3
@@ -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);
|
||||
}
|
||||
|
||||
+1
-1
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user