From 06b9056680005705e5f34d5d3d875ede2611a8b2 Mon Sep 17 00:00:00 2001 From: wenshao Date: Wed, 17 Apr 2013 02:41:41 +0800 Subject: [PATCH] improve sql parer ddl support --- .../mysql/visitor/MySqlSchemaStatVisitor.java | 13 +---- .../druid/sql/parser/SQLStatementParser.java | 49 +++++++++++++++++ .../sql/visitor/SQLASTOutputVisitor.java | 19 +++++++ .../druid/sql/visitor/SchemaStatVisitor.java | 17 ++++++ .../sqlserver/SQLServerlAlterTableTest_0.java | 52 +++++++++++++++++++ 5 files changed, 138 insertions(+), 12 deletions(-) create mode 100644 src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerlAlterTableTest_0.java diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java index 596e518992..dc6baaa120 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java @@ -1019,18 +1019,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public boolean visit(MySqlAlterTableStatement x) { - String tableName = x.getName().toString(); - TableStat stat = getTableStat(tableName); - stat.incrementAlterCount(); - - setCurrentTable(x, tableName); - - for (SQLAlterTableItem item : x.getItems()) { - item.setParent(x); - item.accept(this); - } - - return false; + return visit((SQLAlterTableStatement) x); } @Override diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index f5c2ddae07..d34d8ca1e1 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -23,6 +23,11 @@ import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.expr.SQLListExpr; import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableConstraint; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableKeys; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableConstraint; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableKeys; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement; import com.alibaba.druid.sql.ast.statement.SQLAssignItem; import com.alibaba.druid.sql.ast.statement.SQLCallStatement; import com.alibaba.druid.sql.ast.statement.SQLCommentStatement; @@ -280,6 +285,50 @@ public class SQLStatementParser extends SQLParser { public SQLStatement parseAlter() { accept(Token.ALTER); + + if (lexer.token() == Token.TABLE) { + lexer.nextToken(); + + SQLAlterTableStatement stmt = new SQLAlterTableStatement(); + stmt.setName(this.exprParser.name()); + + for (;;) { + if (identifierEquals("ADD")) { + lexer.nextToken(); + + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + } else if (identifierEquals("DISABLE")) { + lexer.nextToken(); + + if (lexer.token() == Token.CONSTRAINT) { + lexer.nextToken(); + SQLAlterTableDisableConstraint item = new SQLAlterTableDisableConstraint(); + item.setConstraintName(this.exprParser.name()); + stmt.getItems().add(item); + } else { + acceptIdentifier("KEYS"); + SQLAlterTableDisableKeys item = new SQLAlterTableDisableKeys(); + stmt.getItems().add(item); + } + } else if (identifierEquals("ENABLE")) { + lexer.nextToken(); + if (lexer.token() == Token.CONSTRAINT) { + lexer.nextToken(); + SQLAlterTableEnableConstraint item = new SQLAlterTableEnableConstraint(); + item.setConstraintName(this.exprParser.name()); + stmt.getItems().add(item); + } else { + acceptIdentifier("KEYS"); + SQLAlterTableEnableKeys item = new SQLAlterTableEnableKeys(); + stmt.getItems().add(item); + } + } else { + break; + } + } + + return stmt; + } throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 5773cb64c3..150b62f998 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -77,6 +77,8 @@ import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropIndex; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropPrimaryKey; import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableKeys; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement; import com.alibaba.druid.sql.ast.statement.SQLAssignItem; import com.alibaba.druid.sql.ast.statement.SQLCallStatement; import com.alibaba.druid.sql.ast.statement.SQLCharactorDataType; @@ -1437,4 +1439,21 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter { x.getConstraintName().accept(this); return false; } + + @Override + public boolean visit(SQLAlterTableStatement x) { + print("ALTER TABLE "); + x.getName().accept(this); + incrementIndent(); + for (int i = 0; i < x.getItems().size(); ++i) { + SQLAlterTableItem item = x.getItems().get(i); + if (i != 0) { + print(','); + } + println(); + item.accept(this); + } + decrementIndent(); + return false; + } } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java index 832e3c20a0..257025ea15 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -42,6 +42,7 @@ import com.alibaba.druid.sql.ast.statement.SQLAlterTableAddColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropForeinKey; import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableConstraint; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem; import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement; import com.alibaba.druid.sql.ast.statement.SQLCallStatement; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; @@ -1058,4 +1059,20 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { public boolean visit(SQLAlterTableEnableConstraint x) { return false; } + + @Override + public boolean visit(SQLAlterTableStatement x) { + String tableName = x.getName().toString(); + TableStat stat = getTableStat(tableName); + stat.incrementAlterCount(); + + setCurrentTable(x, tableName); + + for (SQLAlterTableItem item : x.getItems()) { + item.setParent(x); + item.accept(this); + } + + return false; + } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerlAlterTableTest_0.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerlAlterTableTest_0.java new file mode 100644 index 0000000000..64e5b7c2de --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerlAlterTableTest_0.java @@ -0,0 +1,52 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.alibaba.druid.bvt.sql.sqlserver; + +import junit.framework.TestCase; + +import org.junit.Assert; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.sqlserver.parser.SQLServerStatementParser; +import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerSchemaStatVisitor; +import com.alibaba.druid.sql.parser.Token; + +public class SQLServerlAlterTableTest_0 extends TestCase { + + public void test_alter_first() throws Exception { + String sql = "alter table st_jklsxxb enable constraint FK_ST_xxx_REFERENCE_ST_xxx"; + SQLServerStatementParser parser = new SQLServerStatementParser(sql); + SQLStatement stmt = parser.parseStatementList().get(0); + parser.match(Token.EOF); + + SQLServerSchemaStatVisitor visitor = new SQLServerSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + String output = SQLUtils.toMySqlString(stmt); + Assert.assertEquals("ALTER TABLE st_jklsxxb" + // + "\n\tENABLE CONSTRAINT FK_ST_xxx_REFERENCE_ST_xxx", output); + + Assert.assertEquals(1, visitor.getTables().size()); + Assert.assertEquals(0, visitor.getColumns().size()); + } + +}