From bd5f1712baa2867f0259c25515b3e765c578356a Mon Sep 17 00:00:00 2001 From: wenshao Date: Tue, 1 Aug 2017 21:22:50 +0800 Subject: [PATCH] improved sql parser. --- .../statement/SQLCreateTableStatement.java | 23 ++------------- .../sql/ast/statement/SQLUnionQuery.java | 12 ++++++++ .../statement/MySqlCreateTableStatement.java | 28 +++++++++++++------ .../alibaba/druid/sql/repository/Schema.java | 9 +++++- 4 files changed, 42 insertions(+), 30 deletions(-) diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java index dc4349439c..97e299fe62 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java @@ -700,27 +700,8 @@ public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLS return true; } - private boolean apply(SQLAlterTableAddIndex item) { - if (item.isKey()) { - MySqlPrimaryKey x = new MySqlPrimaryKey(); - item.cloneTo(x); - x.setParent(this); - this.tableElementList.add(x); - return true; - } - if (item.isUnique()) { - MySqlUnique x = new MySqlUnique(); - item.cloneTo(x); - x.setParent(this); - this.tableElementList.add(x); - return true; - } - - MySqlTableIndex x = new MySqlTableIndex(); - item.cloneTo(x); - x.setParent(this); - this.tableElementList.add(x); - return true; + protected boolean apply(SQLAlterTableAddIndex item) { + return false; } private boolean apply(SQLAlterTableAddColumn item) { diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUnionQuery.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUnionQuery.java index d02fc000cd..7911aeb836 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUnionQuery.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUnionQuery.java @@ -135,4 +135,16 @@ public class SQLUnionQuery extends SQLObjectImpl implements SQLSelectQuery { return x; } + + public SQLSelectQueryBlock getFirstQueryBlock() { + if (left instanceof SQLSelectQueryBlock) { + return (SQLSelectQueryBlock) left; + } + + if (left instanceof SQLUnionQuery) { + return ((SQLUnionQuery) left).getFirstQueryBlock(); + } + + return null; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java index 08c805d9b4..79ac60ed86 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlCreateTableStatement.java @@ -29,6 +29,8 @@ import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLPartitionBy; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl; +import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey; +import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUnique; 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; @@ -211,16 +213,26 @@ public class MySqlCreateTableStatement extends SQLCreateTableStatement implement 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()); + public boolean apply(SQLAlterTableAddIndex item) { + if (item.isKey()) { + MySqlPrimaryKey x = new MySqlPrimaryKey(); + item.cloneTo(x); + x.setParent(this); + this.tableElementList.add(x); + return true; + } + if (item.isUnique()) { + MySqlUnique x = new MySqlUnique(); + item.cloneTo(x); + x.setParent(this); + this.tableElementList.add(x); + return true; } - index.setParent(this); - this.tableElementList.add(index); + MySqlTableIndex x = new MySqlTableIndex(); + item.cloneTo(x); + x.setParent(this); + this.tableElementList.add(x); return true; } diff --git a/src/main/java/com/alibaba/druid/sql/repository/Schema.java b/src/main/java/com/alibaba/druid/sql/repository/Schema.java index bd18125ed6..858431f55d 100644 --- a/src/main/java/com/alibaba/druid/sql/repository/Schema.java +++ b/src/main/java/com/alibaba/druid/sql/repository/Schema.java @@ -196,7 +196,14 @@ public class Schema { select.accept( repository.createResolveVisitor()); - SQLSelectQueryBlock queryBlock = select.getQueryBlock(); + SQLSelectQuery query = select.getQuery(); + SQLSelectQueryBlock queryBlock = null; + if (query instanceof SQLSelectQueryBlock) { + queryBlock = (SQLSelectQueryBlock) query; + } else if (query instanceof SQLUnionQuery) { + queryBlock = ((SQLUnionQuery) query).getFirstQueryBlock(); + } + if (queryBlock != null) { List selectList = queryBlock.getSelectList(); for (SQLSelectItem selectItem : selectList) {