diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableAddForeignKey.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableAddForeignKey.java index 1567b64c4f..f33fbdd9c2 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableAddForeignKey.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableAddForeignKey.java @@ -27,7 +27,7 @@ public class SQLAlterTableAddForeignKey extends SQLObjectImpl implements SQLAlte } public SQLAlterTableAddForeignKey(SQLForeignKeyConstraint foreignKey){ - this.foreignKey = foreignKey; + this.setForeignKey(foreignKey); } public SQLForeignKeyConstraint getForeignKey() { @@ -35,6 +35,9 @@ public class SQLAlterTableAddForeignKey extends SQLObjectImpl implements SQLAlte } public void setForeignKey(SQLForeignKeyConstraint foreignKey) { + if (foreignKey != null) { + foreignKey.setParent(this); + } this.foreignKey = foreignKey; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/MySqlForeignKey.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnReference.java similarity index 53% rename from src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/MySqlForeignKey.java rename to src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnReference.java index 57939bc5fb..6c4c3ff9da 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/MySqlForeignKey.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnReference.java @@ -13,31 +13,41 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alibaba.druid.sql.dialect.mysql.ast; +package com.alibaba.druid.sql.ast.statement; -import com.alibaba.druid.sql.ast.statement.SQLForeignKeyConstraint; -import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl; -import com.alibaba.druid.sql.ast.statement.SQLTableElement; -import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; +import java.util.ArrayList; +import java.util.List; + +import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.visitor.SQLASTVisitor; -public class MySqlForeignKey extends SQLForeignKeyImpl implements SQLForeignKeyConstraint, SQLTableElement { +public class SQLColumnReference extends SQLConstaintImpl implements SQLColumnConstraint { + + private SQLName table; + private List columns = new ArrayList(); @Override protected void accept0(SQLASTVisitor visitor) { - if (visitor instanceof MySqlASTVisitor) { - accept0((MySqlASTVisitor) visitor); - } - } - - protected void accept0(MySqlASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, this.getName()); - acceptChild(visitor, this.getReferencedTableName()); - acceptChild(visitor, this.getReferencingColumns()); - acceptChild(visitor, this.getReferencedColumns()); } visitor.endVisit(this); } + public SQLName getTable() { + return table; + } + + public void setTable(SQLName table) { + this.table = table; + } + + public List getColumns() { + return columns; + } + + public void setColumns(List columns) { + this.columns = columns; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnUniqueKey.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnUniqueKey.java new file mode 100644 index 0000000000..2d7a96d0cf --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLColumnUniqueKey.java @@ -0,0 +1,30 @@ +/* + * 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.sql.ast.statement; + +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLColumnUniqueKey extends SQLConstaintImpl implements SQLColumnConstraint { + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, this.getName()); + } + visitor.endVisit(this); + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLForeignKeyImpl.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLForeignKeyImpl.java index 76392918c3..e37111e6e3 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLForeignKeyImpl.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLForeignKeyImpl.java @@ -19,13 +19,18 @@ import java.util.ArrayList; import java.util.List; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; -public abstract class SQLForeignKeyImpl extends SQLConstaintImpl implements SQLForeignKeyConstraint { +public class SQLForeignKeyImpl extends SQLConstaintImpl implements SQLForeignKeyConstraint { private SQLName referencedTableName; private List referencingColumns = new ArrayList(); private List referencedColumns = new ArrayList(); + public SQLForeignKeyImpl(){ + + } + @Override public List getReferencingColumns() { return referencingColumns; @@ -46,4 +51,15 @@ public abstract class SQLForeignKeyImpl extends SQLConstaintImpl implements SQLF return referencedColumns; } + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, this.getName()); + acceptChild(visitor, this.getReferencedTableName()); + acceptChild(visitor, this.getReferencingColumns()); + acceptChild(visitor, this.getReferencedColumns()); + } + visitor.endVisit(this); + } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java index d967d318fc..b86f285973 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlCreateTableParser.java @@ -19,9 +19,9 @@ import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.statement.SQLCheck; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; +import com.alibaba.druid.sql.ast.statement.SQLForeignKeyConstraint; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.ast.statement.SQLTableConstaint; -import com.alibaba.druid.sql.dialect.mysql.ast.MySqlForeignKey; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlKey; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlCreateTableStatement.TableSpaceOption; @@ -132,9 +132,12 @@ public class MySqlCreateTableParser extends SQLCreateTableParser { } else if (lexer.token() == (Token.KEY)) { stmt.getTableElementList().add(parseConstraint()); } else if (lexer.token() == (Token.PRIMARY)) { - stmt.getTableElementList().add(parseConstraint()); + SQLTableConstaint pk = parseConstraint(); + pk.setParent(stmt); + stmt.getTableElementList().add(pk); } else if (lexer.token() == (Token.FOREIGN)) { - MySqlForeignKey fk = this.getExprParser().parseForeignKey(); + SQLForeignKeyConstraint fk = this.getExprParser().parseForeignKey(); + fk.setParent(stmt); stmt.getTableElementList().add(fk); } else if (lexer.token() == Token.CHECK) { lexer.nextToken(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java index 5b8a33e99d..891b4c4b22 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java @@ -33,7 +33,6 @@ import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; import com.alibaba.druid.sql.ast.statement.SQLAssignItem; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey; -import com.alibaba.druid.sql.dialect.mysql.ast.MySqlForeignKey; 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.ast.expr.MySqlBinaryExpr; @@ -756,26 +755,6 @@ public class MySqlExprParser extends SQLExprParser { return unique; } - public MySqlForeignKey parseForeignKey() { - accept(Token.FOREIGN); - accept(Token.KEY); - - MySqlForeignKey fk = new MySqlForeignKey(); - - accept(Token.LPAREN); - this.names(fk.getReferencingColumns()); - accept(Token.RPAREN); - - accept(Token.REFERENCES); - - fk.setReferencedTableName(this.name()); - - accept(Token.LPAREN); - this.names(fk.getReferencedColumns()); - accept(Token.RPAREN); - return fk; - } - protected SQLAggregateExpr parseAggregateExprRest(SQLAggregateExpr aggregateExpr) { if (lexer.token() == Token.ORDER) { SQLOrderBy orderBy = this.parseOrderBy(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java index 4ae3b85dff..ef8ff3fff7 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlStatementParser.java @@ -47,6 +47,7 @@ import com.alibaba.druid.sql.ast.statement.SQLCreateDatabaseStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.ast.statement.SQLDropTableStatement; import com.alibaba.druid.sql.ast.statement.SQLDropViewStatement; +import com.alibaba.druid.sql.ast.statement.SQLForeignKeyConstraint; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement.ValuesClause; import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey; @@ -57,7 +58,6 @@ import com.alibaba.druid.sql.ast.statement.SQLSetStatement; import com.alibaba.druid.sql.ast.statement.SQLTableSource; import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem; import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; -import com.alibaba.druid.sql.dialect.mysql.ast.MySqlForeignKey; 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.MySqlAlterTableAddIndex; @@ -2274,12 +2274,18 @@ public class MySqlStatementParser extends SQLStatementParser { SQLAlterTableAddPrimaryKey item = new SQLAlterTableAddPrimaryKey(); item.setPrimaryKey(primaryKey); + + item.setParent(stmt); + stmt.getItems().add(item); } else if (lexer.token() == Token.FOREIGN) { - MySqlForeignKey fk = this.getExprParser().parseForeignKey(); + SQLForeignKeyConstraint fk = this.getExprParser().parseForeignKey(); fk.setName(constraintName); SQLAlterTableAddForeignKey item = new SQLAlterTableAddForeignKey(fk); + + item.setParent(stmt); + stmt.getItems().add(item); } else { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); @@ -2516,7 +2522,7 @@ public class MySqlStatementParser extends SQLStatementParser { lexer.reset(); break; } - + if (lexer.token() == Token.IDENTIFIER) { name = exprParser.name(); name.setParent(item); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java index a2eca485f6..51fe80ec33 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java @@ -16,7 +16,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.MySqlForeignKey; 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; @@ -529,10 +528,6 @@ public interface MySqlASTVisitor extends SQLASTVisitor { void endVisit(MySqlAlterTableAddUnique x); - boolean visit(MySqlForeignKey x); - - void endVisit(MySqlForeignKey x); - boolean visit(MySqlAlterTableModifyColumn x); void endVisit(MySqlAlterTableModifyColumn x); @@ -548,28 +543,28 @@ public interface MySqlASTVisitor extends SQLASTVisitor { boolean visit(MySqlCreateTableStatement.TableSpaceOption x); void endVisit(MySqlCreateTableStatement.TableSpaceOption x); - + boolean visit(MySqlPartitionByHash x); void endVisit(MySqlPartitionByHash x); - + boolean visit(MySqlPartitionByRange x); void endVisit(MySqlPartitionByRange x); - + boolean visit(MySqlPartitionByList x); void endVisit(MySqlPartitionByList x); - + boolean visit(MySqlPartitioningDef x); void endVisit(MySqlPartitioningDef x); - + boolean visit(MySqlPartitioningDef.LessThanValues x); void endVisit(MySqlPartitioningDef.LessThanValues x); - + boolean visit(MySqlPartitioningDef.InValues x); void endVisit(MySqlPartitioningDef.InValues x); -} // +} // diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java index f53c80476f..5222491a3a 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java @@ -16,7 +16,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.MySqlForeignKey; 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; @@ -128,323 +127,322 @@ import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUnlockTablesStatem import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlUpdateStatement; import com.alibaba.druid.sql.visitor.SQLASTVisitorAdapter; -public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements - MySqlASTVisitor { +public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements MySqlASTVisitor { - @Override - public boolean visit(MySqlBooleanExpr x) { - return true; - } + @Override + public boolean visit(MySqlBooleanExpr x) { + return true; + } - @Override - public void endVisit(MySqlBooleanExpr x) { + @Override + public void endVisit(MySqlBooleanExpr x) { - } + } - @Override - public boolean visit(Limit x) { - return true; - } + @Override + public boolean visit(Limit x) { + return true; + } - @Override - public void endVisit(Limit x) { + @Override + public void endVisit(Limit x) { - } + } - @Override - public boolean visit(MySqlTableIndex x) { - return true; - } + @Override + public boolean visit(MySqlTableIndex x) { + return true; + } - @Override - public void endVisit(MySqlTableIndex x) { + @Override + public void endVisit(MySqlTableIndex x) { - } + } - @Override - public boolean visit(MySqlKey x) { - return true; - } + @Override + public boolean visit(MySqlKey x) { + return true; + } - @Override - public void endVisit(MySqlKey x) { + @Override + public void endVisit(MySqlKey x) { - } + } - @Override - public boolean visit(MySqlPrimaryKey x) { + @Override + public boolean visit(MySqlPrimaryKey x) { - return true; - } + return true; + } - @Override - public void endVisit(MySqlPrimaryKey x) { + @Override + public void endVisit(MySqlPrimaryKey x) { - } + } - @Override - public void endVisit(MySqlIntervalExpr x) { + @Override + public void endVisit(MySqlIntervalExpr x) { - } + } - @Override - public boolean visit(MySqlIntervalExpr x) { + @Override + public boolean visit(MySqlIntervalExpr x) { - return true; - } + return true; + } - @Override - public void endVisit(MySqlExtractExpr x) { + @Override + public void endVisit(MySqlExtractExpr x) { - } + } - @Override - public boolean visit(MySqlExtractExpr x) { + @Override + public boolean visit(MySqlExtractExpr x) { - return true; - } + return true; + } - @Override - public void endVisit(MySqlMatchAgainstExpr x) { + @Override + public void endVisit(MySqlMatchAgainstExpr x) { - } + } - @Override - public boolean visit(MySqlMatchAgainstExpr x) { + @Override + public boolean visit(MySqlMatchAgainstExpr x) { - return true; - } + return true; + } - @Override - public void endVisit(MySqlBinaryExpr x) { + @Override + public void endVisit(MySqlBinaryExpr x) { - } + } - @Override - public boolean visit(MySqlBinaryExpr x) { + @Override + public boolean visit(MySqlBinaryExpr x) { - return true; - } + return true; + } - @Override - public void endVisit(MySqlPrepareStatement x) { + @Override + public void endVisit(MySqlPrepareStatement x) { - } + } - @Override - public boolean visit(MySqlPrepareStatement x) { + @Override + public boolean visit(MySqlPrepareStatement x) { - return true; - } + return true; + } - @Override - public void endVisit(MySqlExecuteStatement x) { + @Override + public void endVisit(MySqlExecuteStatement x) { - } + } - @Override - public boolean visit(MySqlExecuteStatement x) { + @Override + public boolean visit(MySqlExecuteStatement x) { - return true; - } + return true; + } - @Override - public void endVisit(MySqlDeleteStatement x) { + @Override + public void endVisit(MySqlDeleteStatement x) { - } + } - @Override - public boolean visit(MySqlDeleteStatement x) { + @Override + public boolean visit(MySqlDeleteStatement x) { - return true; - } + return true; + } - @Override - public void endVisit(MySqlInsertStatement x) { + @Override + public void endVisit(MySqlInsertStatement x) { - } + } - @Override - public boolean visit(MySqlInsertStatement x) { + @Override + public boolean visit(MySqlInsertStatement x) { - return true; - } + return true; + } - @Override - public void endVisit(MySqlLoadDataInFileStatement x) { + @Override + public void endVisit(MySqlLoadDataInFileStatement x) { - } + } - @Override - public boolean visit(MySqlLoadDataInFileStatement x) { + @Override + public boolean visit(MySqlLoadDataInFileStatement x) { - return true; - } + return true; + } - @Override - public void endVisit(MySqlLoadXmlStatement x) { + @Override + public void endVisit(MySqlLoadXmlStatement x) { - } + } - @Override - public boolean visit(MySqlLoadXmlStatement x) { + @Override + public boolean visit(MySqlLoadXmlStatement x) { - return true; - } + return true; + } - @Override - public void endVisit(MySqlReplaceStatement x) { + @Override + public void endVisit(MySqlReplaceStatement x) { - } + } - @Override - public boolean visit(MySqlReplaceStatement x) { + @Override + public boolean visit(MySqlReplaceStatement x) { - return true; - } + return true; + } - @Override - public void endVisit(MySqlSelectGroupBy x) { + @Override + public void endVisit(MySqlSelectGroupBy x) { - } + } - @Override - public boolean visit(MySqlSelectGroupBy x) { + @Override + public boolean visit(MySqlSelectGroupBy x) { - return true; - } + return true; + } - @Override - public void endVisit(MySqlStartTransactionStatement x) { + @Override + public void endVisit(MySqlStartTransactionStatement x) { - } + } - @Override - public boolean visit(MySqlStartTransactionStatement x) { + @Override + public boolean visit(MySqlStartTransactionStatement x) { - return true; - } + return true; + } - @Override - public void endVisit(MySqlCommitStatement x) { + @Override + public void endVisit(MySqlCommitStatement x) { - } + } - @Override - public boolean visit(MySqlCommitStatement x) { + @Override + public boolean visit(MySqlCommitStatement x) { - return true; - } + return true; + } - @Override - public void endVisit(MySqlRollbackStatement x) { + @Override + public void endVisit(MySqlRollbackStatement x) { - } + } - @Override - public boolean visit(MySqlRollbackStatement x) { + @Override + public boolean visit(MySqlRollbackStatement x) { - return true; - } + return true; + } - @Override - public void endVisit(MySqlShowColumnsStatement x) { + @Override + public void endVisit(MySqlShowColumnsStatement x) { - } + } - @Override - public boolean visit(MySqlShowColumnsStatement x) { + @Override + public boolean visit(MySqlShowColumnsStatement x) { - return true; - } + return true; + } - @Override - public void endVisit(MySqlShowTablesStatement x) { + @Override + public void endVisit(MySqlShowTablesStatement x) { - } + } - @Override - public boolean visit(MySqlShowTablesStatement x) { + @Override + public boolean visit(MySqlShowTablesStatement x) { - return true; - } + return true; + } - @Override - public void endVisit(MySqlShowDatabasesStatement x) { + @Override + public void endVisit(MySqlShowDatabasesStatement x) { - } + } - @Override - public boolean visit(MySqlShowDatabasesStatement x) { + @Override + public boolean visit(MySqlShowDatabasesStatement x) { - return true; - } + return true; + } - @Override - public void endVisit(MySqlShowWarningsStatement x) { + @Override + public void endVisit(MySqlShowWarningsStatement x) { - } + } - @Override - public boolean visit(MySqlShowWarningsStatement x) { + @Override + public boolean visit(MySqlShowWarningsStatement x) { - return true; - } + return true; + } - @Override - public void endVisit(MySqlShowStatusStatement x) { + @Override + public void endVisit(MySqlShowStatusStatement x) { - } + } - @Override - public boolean visit(MySqlShowStatusStatement x) { + @Override + public boolean visit(MySqlShowStatusStatement x) { - return true; - } + return true; + } - @Override - public void endVisit(CobarShowStatus x) { + @Override + public void endVisit(CobarShowStatus x) { - } + } - @Override - public boolean visit(CobarShowStatus x) { - return true; - } + @Override + public boolean visit(CobarShowStatus x) { + return true; + } - @Override - public void endVisit(MySqlKillStatement x) { + @Override + public void endVisit(MySqlKillStatement x) { - } + } - @Override - public boolean visit(MySqlKillStatement x) { - return true; - } + @Override + public boolean visit(MySqlKillStatement x) { + return true; + } - @Override - public void endVisit(MySqlBinlogStatement x) { + @Override + public void endVisit(MySqlBinlogStatement x) { - } + } - @Override - public boolean visit(MySqlBinlogStatement x) { - return true; - } - - @Override - public void endVisit(MySqlResetStatement x) { - - } - - @Override - public boolean visit(MySqlResetStatement x) { - return true; - } + @Override + public boolean visit(MySqlBinlogStatement x) { + return true; + } + + @Override + public void endVisit(MySqlResetStatement x) { + + } + + @Override + public boolean visit(MySqlResetStatement x) { + return true; + } @Override public void endVisit(MySqlCreateUserStatement x) { - + } @Override @@ -454,29 +452,29 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(UserSpecification x) { - + } @Override public boolean visit(UserSpecification x) { return true; } - + @Override public void endVisit(MySqlDropUser x) { - + } - + @Override public boolean visit(MySqlDropUser x) { return true; } - + @Override public void endVisit(MySqlDropTableStatement x) { - + } - + @Override public boolean visit(MySqlDropTableStatement x) { return true; @@ -484,7 +482,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlPartitionByKey x) { - + } @Override @@ -499,7 +497,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlSelectQueryBlock x) { - + } @Override @@ -509,7 +507,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlOutFileExpr x) { - + } @Override @@ -519,18 +517,18 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlDescribeStatement x) { - + } - @Override - public boolean visit(MySqlUpdateStatement x) { - return true; - } + @Override + public boolean visit(MySqlUpdateStatement x) { + return true; + } - @Override - public void endVisit(MySqlUpdateStatement x) { - - } + @Override + public void endVisit(MySqlUpdateStatement x) { + + } @Override public boolean visit(MySqlSetTransactionIsolationLevelStatement x) { @@ -539,77 +537,77 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlSetTransactionIsolationLevelStatement x) { - + } - + @Override public boolean visit(MySqlSetNamesStatement x) { return true; } - + @Override public void endVisit(MySqlSetNamesStatement x) { - + } - + @Override public boolean visit(MySqlSetCharSetStatement x) { return true; } - + @Override public void endVisit(MySqlSetCharSetStatement x) { - + } - + @Override public boolean visit(MySqlShowAuthorsStatement x) { return true; } - + @Override public void endVisit(MySqlShowAuthorsStatement x) { - + } - + @Override public boolean visit(MySqlShowBinaryLogsStatement x) { return true; } - + @Override public void endVisit(MySqlShowBinaryLogsStatement x) { - + } - + @Override public boolean visit(MySqlShowMasterLogsStatement x) { return true; } - + @Override public void endVisit(MySqlShowMasterLogsStatement x) { - + } - + @Override public boolean visit(MySqlShowCollationStatement x) { return true; } - + @Override public void endVisit(MySqlShowCollationStatement x) { - + } - + @Override public boolean visit(MySqlShowBinLogEventsStatement x) { return true; } - + @Override public void endVisit(MySqlShowBinLogEventsStatement x) { - + } @Override @@ -619,47 +617,47 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlShowCharacterSetStatement x) { - + } - + @Override public boolean visit(MySqlShowContributorsStatement x) { return true; } - + @Override public void endVisit(MySqlShowContributorsStatement x) { - + } - + @Override public boolean visit(MySqlShowCreateDatabaseStatement x) { return true; } - + @Override public void endVisit(MySqlShowCreateDatabaseStatement x) { - + } - + @Override public boolean visit(MySqlShowCreateEventStatement x) { return true; } - + @Override public void endVisit(MySqlShowCreateEventStatement x) { - + } - + @Override public boolean visit(MySqlShowCreateFunctionStatement x) { return true; } - + @Override public void endVisit(MySqlShowCreateFunctionStatement x) { - + } @Override @@ -669,27 +667,27 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlShowCreateProcedureStatement x) { - + } - + @Override public boolean visit(MySqlShowCreateTableStatement x) { return true; } - + @Override public void endVisit(MySqlShowCreateTableStatement x) { - + } - + @Override public boolean visit(MySqlShowCreateTriggerStatement x) { return true; } - + @Override public void endVisit(MySqlShowCreateTriggerStatement x) { - + } @Override @@ -699,7 +697,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlShowCreateViewStatement x) { - + } @Override @@ -709,17 +707,17 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlShowEngineStatement x) { - + } - + @Override public boolean visit(MySqlShowEnginesStatement x) { return true; } - + @Override public void endVisit(MySqlShowEnginesStatement x) { - + } @Override @@ -729,17 +727,17 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlShowErrorsStatement x) { - + } - + @Override public boolean visit(MySqlShowEventsStatement x) { return true; } - + @Override public void endVisit(MySqlShowEventsStatement x) { - + } @Override @@ -749,7 +747,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlShowFunctionCodeStatement x) { - + } @Override @@ -759,7 +757,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlShowFunctionStatusStatement x) { - + } @Override @@ -778,7 +776,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlUserName x) { - + } @Override @@ -788,7 +786,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlShowIndexesStatement x) { - + } @Override @@ -798,17 +796,17 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlShowKeysStatement x) { - + } - + @Override public boolean visit(MySqlShowMasterStatusStatement x) { return true; } - + @Override public void endVisit(MySqlShowMasterStatusStatement x) { - + } @Override @@ -818,7 +816,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlShowOpenTablesStatement x) { - + } @Override @@ -828,17 +826,17 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlShowPluginsStatement x) { - + } - + @Override public boolean visit(MySqlShowPrivilegesStatement x) { return true; } - + @Override public void endVisit(MySqlShowPrivilegesStatement x) { - + } @Override @@ -848,7 +846,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlShowProcedureCodeStatement x) { - + } @Override @@ -858,7 +856,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlShowProcedureStatusStatement x) { - + } @Override @@ -868,7 +866,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlShowProcessListStatement x) { - + } @Override @@ -878,7 +876,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlShowProfileStatement x) { - + } @Override @@ -888,7 +886,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlShowProfilesStatement x) { - + } @Override @@ -898,7 +896,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlShowRelayLogEventsStatement x) { - + } @Override @@ -908,17 +906,17 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlShowSlaveHostsStatement x) { - + } - + @Override public boolean visit(MySqlShowSlaveStatusStatement x) { return true; } - + @Override public void endVisit(MySqlShowSlaveStatusStatement x) { - + } @Override @@ -928,7 +926,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlShowTableStatusStatement x) { - + } @Override @@ -938,7 +936,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlShowTriggersStatement x) { - + } @Override @@ -948,7 +946,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlShowVariantsStatement x) { - + } @Override @@ -958,7 +956,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlAlterTableStatement x) { - + } @Override @@ -968,17 +966,17 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlAlterTableAddColumn x) { - + } - + @Override public boolean visit(MySqlCreateIndexStatement x) { return true; } - + @Override public void endVisit(MySqlCreateIndexStatement x) { - + } @Override @@ -988,7 +986,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlRenameTableStatement.Item x) { - + } @Override @@ -998,7 +996,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlRenameTableStatement x) { - + } @Override @@ -1008,7 +1006,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlDropViewStatement x) { - + } @Override @@ -1018,7 +1016,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlUnionQuery x) { - + } @Override @@ -1028,7 +1026,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlUseIndexHint x) { - + } @Override @@ -1038,7 +1036,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlIgnoreIndexHint x) { - + } @Override @@ -1048,7 +1046,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlLockTableStatement x) { - + } @Override @@ -1058,7 +1056,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlUnlockTablesStatement x) { - + } @Override @@ -1068,7 +1066,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlForceIndexHint x) { - + } @Override @@ -1078,7 +1076,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlAlterTableChangeColumn x) { - + } @Override @@ -1088,7 +1086,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlAlterTableCharacter x) { - + } @Override @@ -1098,7 +1096,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlAlterTableAddIndex x) { - + } @Override @@ -1108,7 +1106,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlAlterTableOption x) { - + } @Override @@ -1118,7 +1116,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlCreateTableStatement x) { - + } @Override @@ -1128,7 +1126,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlHelpStatement x) { - + } @Override @@ -1138,7 +1136,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlCharExpr x) { - + } @Override @@ -1148,7 +1146,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlAlterTableAddUnique x) { - + } @Override @@ -1158,17 +1156,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlUnique x) { - - } - @Override - public boolean visit(MySqlForeignKey x) { - return true; - } - - @Override - public void endVisit(MySqlForeignKey x) { - } @Override @@ -1178,7 +1166,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlAlterTableModifyColumn x) { - + } @Override @@ -1188,7 +1176,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlAlterTableDiscardTablespace x) { - + } @Override @@ -1198,7 +1186,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlAlterTableImportTablespace x) { - + } @Override @@ -1208,7 +1196,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(TableSpaceOption x) { - + } @Override @@ -1218,9 +1206,9 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlPartitionByHash x) { - + } - + @Override public boolean visit(MySqlPartitionByRange x) { return true; @@ -1228,7 +1216,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlPartitionByRange x) { - + } @Override @@ -1238,7 +1226,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlPartitioningDef x) { - + } @Override @@ -1248,7 +1236,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(LessThanValues x) { - + } @Override @@ -1258,7 +1246,7 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(InValues x) { - + } @Override @@ -1268,6 +1256,6 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements @Override public void endVisit(MySqlPartitionByList x) { - + } } // diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java index dd7cc9ceeb..8eeef86700 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java @@ -38,7 +38,6 @@ 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.MySqlForeignKey; 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; @@ -2934,32 +2933,6 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV } - @Override - public boolean visit(MySqlForeignKey x) { - if (x.getName() != null) { - print("CONSTRAINT "); - x.getName().accept(this); - print(' '); - } - - print("FOREIGN KEY ("); - printAndAccept(x.getReferencedColumns(), ", "); - print(")"); - - print(" REFERENCES "); - x.getReferencedTableName().accept(this); - - print(" ("); - printAndAccept(x.getReferencedColumns(), ", "); - print(")"); - return false; - } - - @Override - public void endVisit(MySqlForeignKey x) { - - } - @Override public boolean visit(MySqlAlterTableDiscardTablespace x) { print("DISCARD TABLESPACE"); 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 4613d950c7..b8ed4ff952 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 @@ -30,7 +30,6 @@ 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.MySqlForeignKey; 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; @@ -1255,16 +1254,6 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS } - @Override - public boolean visit(MySqlForeignKey x) { - return false; - } - - @Override - public void endVisit(MySqlForeignKey x) { - - } - @Override public boolean visit(MySqlAlterTableDiscardTablespace x) { return false; @@ -1279,7 +1268,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS public boolean visit(MySqlAlterTableImportTablespace x) { return false; } - + @Override public void endVisit(MySqlAlterTableImportTablespace x) { @@ -1292,7 +1281,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public void endVisit(TableSpaceOption x) { - + } @Override @@ -1302,7 +1291,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public void endVisit(MySqlPartitionByHash x) { - + } @Override @@ -1312,7 +1301,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public void endVisit(MySqlPartitionByRange x) { - + } @Override @@ -1322,7 +1311,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public void endVisit(MySqlPartitioningDef x) { - + } @Override @@ -1332,7 +1321,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public void endVisit(LessThanValues x) { - + } @Override @@ -1342,7 +1331,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public void endVisit(InValues x) { - + } @Override @@ -1352,7 +1341,7 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS @Override public void endVisit(MySqlPartitionByList x) { - + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleConstraint.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleConstraint.java index c10908a054..ec75d3a896 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleConstraint.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleConstraint.java @@ -17,11 +17,16 @@ package com.alibaba.druid.sql.dialect.oracle.ast.stmt; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.statement.SQLConstaint; +import com.alibaba.druid.sql.ast.statement.SQLTableElement; import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObject; -public interface OracleConstraint extends OracleSQLObject, SQLConstaint { +public interface OracleConstraint extends OracleSQLObject, SQLConstaint, SQLTableElement { SQLName getExceptionsInto(); void setExceptionsInto(SQLName exceptionsInto); + + Boolean getEnable(); + + void setEnable(Boolean enable); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleForeignKey.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleForeignKey.java new file mode 100644 index 0000000000..ffbc1572df --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleForeignKey.java @@ -0,0 +1,80 @@ +/* + * 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.sql.dialect.oracle.ast.stmt; + +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObject; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class OracleForeignKey extends SQLForeignKeyImpl implements OracleConstraint, OracleSQLObject { + + private OracleUsingIndexClause using; + private SQLName exceptionsInto; + private Boolean enable; + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor instanceof OracleASTVisitor) { + accept0((OracleASTVisitor) visitor); + return; + } + + super.accept(visitor); + } + + public void accept0(OracleASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, this.getName()); + acceptChild(visitor, this.getReferencedTableName()); + acceptChild(visitor, this.getReferencingColumns()); + acceptChild(visitor, this.getReferencedColumns()); + + acceptChild(visitor, using); + acceptChild(visitor, exceptionsInto); + } + visitor.endVisit(this); + } + + public SQLName getExceptionsInto() { + return exceptionsInto; + } + + public void setExceptionsInto(SQLName exceptionsInto) { + this.exceptionsInto = exceptionsInto; + } + + public OracleUsingIndexClause getUsing() { + return using; + } + + public void setUsing(OracleUsingIndexClause using) { + if (using != null) { + using.setParent(this); + } + this.using = using; + } + + public Boolean getEnable() { + return enable; + } + + public void setEnable(Boolean enable) { + this.enable = enable; + } + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OraclePrimaryKey.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OraclePrimaryKey.java index a8478c3e66..7beb97a140 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OraclePrimaryKey.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OraclePrimaryKey.java @@ -32,6 +32,7 @@ public class OraclePrimaryKey extends OracleSQLObjectImpl implements OracleConst private OracleUsingIndexClause using; private SQLName exceptionsInto; + private Boolean enable; @Override public void accept0(OracleASTVisitor visitor) { @@ -76,4 +77,12 @@ public class OraclePrimaryKey extends OracleSQLObjectImpl implements OracleConst this.exceptionsInto = exceptionsInto; } + public Boolean getEnable() { + return enable; + } + + public void setEnable(Boolean enable) { + this.enable = enable; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleUnique.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleUnique.java index 14fcfa932f..e0ed69dc0a 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleUnique.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleUnique.java @@ -1,3 +1,18 @@ +/* + * 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.sql.dialect.oracle.ast.stmt; import com.alibaba.druid.sql.ast.SQLName; @@ -10,6 +25,7 @@ public class OracleUnique extends SQLUnique implements OracleConstraint, OracleS private OracleUsingIndexClause using; private SQLName exceptionsInto; + private Boolean enable; @Override protected void accept0(SQLASTVisitor visitor) { @@ -50,4 +66,12 @@ public class OracleUnique extends SQLUnique implements OracleConstraint, OracleS this.using = using; } + public Boolean getEnable() { + return enable; + } + + public void setEnable(Boolean enable) { + this.enable = enable; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java index a9956a4870..d88dea63ef 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleExprParser.java @@ -37,6 +37,8 @@ import com.alibaba.druid.sql.ast.expr.SQLUnaryOperator; import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; import com.alibaba.druid.sql.ast.statement.SQLCharactorDataType; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; +import com.alibaba.druid.sql.ast.statement.SQLForeignKeyConstraint; +import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl; import com.alibaba.druid.sql.ast.statement.SQLUnique; import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay; import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear; @@ -65,6 +67,8 @@ import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleRangeExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSizeExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleTimestampExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraint; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForeignKey; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleOrderByItem; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect; @@ -78,13 +82,6 @@ import com.alibaba.druid.sql.parser.Token; public class OracleExprParser extends SQLExprParser { - - - - - - - public boolean allowStringAdditive = false; /** @@ -155,6 +152,10 @@ public class OracleExprParser extends SQLExprParser { public SQLDataType parseDataType() { + if (lexer.token() == Token.CONSTRAINT || lexer.token() == Token.COMMA) { + return null; + } + if (lexer.token() == Token.DEFAULT || lexer.token() == Token.NOT || lexer.token() == Token.NULL) { return null; } @@ -1247,4 +1248,38 @@ public class OracleExprParser extends SQLExprParser { return unique; } + + public OracleConstraint parseConstaint() { + OracleConstraint constraint = (OracleConstraint) super.parseConstaint(); + + for (;;) { + if (lexer.token() == Token.EXCEPTIONS) { + lexer.nextToken(); + accept(Token.INTO); + SQLName exceptionsInto = this.name(); + constraint.setExceptionsInto(exceptionsInto); + continue; + } + + if (lexer.token() == Token.DISABLE) { + lexer.nextToken(); + constraint.setEnable(false); + continue; + } + + if (lexer.token() == Token.ENABLE) { + lexer.nextToken(); + constraint.setEnable(true); + continue; + } + + break; + } + + return constraint; + } + + protected SQLForeignKeyConstraint createForeignKey() { + return new OracleForeignKey(); + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java index 9f3f2f772a..be4626fef5 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java @@ -54,7 +54,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterIndexStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterProcedureStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSessionStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterSynonymStatement; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstaint; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableDropPartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableModify; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableMoveTablespace; @@ -63,6 +62,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartit import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.NestedTablePartitionSpec; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.TableSpaceItem; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.UpdateIndexesClause; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstaint; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTablespaceAddDataFile; @@ -863,7 +863,12 @@ public class OracleStatementParser extends SQLStatementParser { accept(Token.RPAREN); } else if (lexer.token() == Token.CONSTRAINT) { - stmt.getItems().add(parseConstaint()); + OracleConstraint constraint = ((OracleExprParser) this.exprParser).parseConstaint(); + OracleAlterTableAddConstaint item = new OracleAlterTableAddConstaint(); + constraint.setParent(item); + item.setParent(stmt); + item.setConstraint(constraint); + stmt.getItems().add(item); } else if (lexer.token() == Token.IDENTIFIER) { SQLAlterTableAddColumn item = parseAlterTableAddColumn(); stmt.getItems().add(item); @@ -990,36 +995,6 @@ public class OracleStatementParser extends SQLStatementParser { throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); } - private OracleAlterTableAddConstaint parseConstaint() { - accept(Token.CONSTRAINT); - - OracleAlterTableAddConstaint item = new OracleAlterTableAddConstaint(); - - SQLName name = this.exprParser.name(); - - OracleConstraint constraint; - if (lexer.token() == Token.PRIMARY) { - constraint = (OracleConstraint) exprParser.parsePrimaryKey(); - } else if (lexer.token() == Token.UNIQUE) { - constraint = (OracleConstraint) exprParser.parseUnique(); - } else { - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - } - - if (lexer.token() == Token.EXCEPTIONS) { - lexer.nextToken(); - accept(Token.INTO); - SQLName exceptionsInto = this.exprParser.name(); - constraint.setExceptionsInto(exceptionsInto); - } - - constraint.setName(name); - - item.setConstraint(constraint); - - return item; - } - public void parseAlterDrop(SQLAlterTableStatement stmt) { lexer.nextToken(); if (lexer.token() == Token.CONSTRAINT) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java index aaf7e72e36..d4dff6413e 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitor.java @@ -87,6 +87,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFetchStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForeignKey; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement; @@ -611,4 +612,8 @@ public interface OracleASTVisitor extends SQLASTVisitor { boolean visit(OracleUnique x); void endVisit(OracleUnique x); + + boolean visit(OracleForeignKey x); + + void endVisit(OracleForeignKey x); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java index f3da021302..830a217f63 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleASTVisitorAdapter.java @@ -95,6 +95,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFetchStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForeignKey; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement; @@ -1385,5 +1386,15 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora public void endVisit(OracleUnique x) { } + + @Override + public boolean visit(OracleForeignKey x) { + return true; + } + + @Override + public void endVisit(OracleForeignKey x) { + + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java index 839f7e1f1f..bfd09b57a0 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleOutputVisitor.java @@ -31,6 +31,7 @@ import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem; import com.alibaba.druid.sql.ast.statement.SQLCharactorDataType; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; +import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource.JoinType; import com.alibaba.druid.sql.ast.statement.SQLRollbackStatement; @@ -124,6 +125,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFetchStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForeignKey; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement; @@ -2336,15 +2338,26 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS print("PRIMARY KEY ("); printAndAccept(x.getColumns(), ", "); print(")"); + if (x.getUsing() != null) { println(); x.getUsing().accept(this); } + if (x.getExceptionsInto() != null) { println(); print("EXCEPTIONS INTO "); x.getExceptionsInto().accept(this); } + + if (x.getEnable() != null) { + if(x.getEnable().booleanValue()) { + print(" ENABLE"); + } else { + print(" DIABLE"); + } + } + return false; } @@ -3223,6 +3236,11 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS print(" DISABLE"); } } + + if (x.getStorage() != null) { + println(); + x.getStorage().accept(this); + } } return false; @@ -3347,4 +3365,25 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS public void endVisit(OracleUnique x) { } + + @Override + public boolean visit(OracleForeignKey x) { + visit((SQLForeignKeyImpl) x); + + if (x.getUsing() != null) { + println(); + x.getUsing().accept(this); + } + if (x.getExceptionsInto() != null) { + println(); + print("EXCEPTIONS INTO "); + x.getExceptionsInto().accept(this); + } + return false; + } + + @Override + public void endVisit(OracleForeignKey x) { + + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java index 6138ee6da2..3eccaa6b05 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/visitor/OracleSchemaStatVisitor.java @@ -32,6 +32,7 @@ import com.alibaba.druid.sql.ast.statement.SQLCreateIndexStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement; import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; +import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; @@ -118,6 +119,7 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleExprStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFetchStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleFileSpecification; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForStatement; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForeignKey; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGotoStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleGrantStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleIfStatement; @@ -1806,4 +1808,14 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle public void endVisit(OracleUnique x) { } + + @Override + public boolean visit(OracleForeignKey x) { + return visit((SQLForeignKeyImpl) x); + } + + @Override + public void endVisit(OracleForeignKey x) { + + } } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java index 1d367e7620..f2857f9b78 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLCreateTableParser.java @@ -19,6 +19,8 @@ import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey; import com.alibaba.druid.sql.ast.statement.SQLUnique; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraint; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleExprParser; public class SQLCreateTableParser extends SQLDDLParser { @@ -71,18 +73,18 @@ public class SQLCreateTableParser extends SQLDDLParser { if (lexer.token() == Token.IDENTIFIER || lexer.token() == Token.LITERAL_ALIAS) { SQLColumnDefinition column = this.exprParser.parseColumn(); createTable.getTableElementList().add(column); - } else if (lexer.token() == Token.PRIMARY) { - SQLPrimaryKey primaryKey = exprParser.parsePrimaryKey(); - createTable.getTableElementList().add(primaryKey); - } else if (lexer.token == Token.UNIQUE) { - SQLUnique unique = exprParser.parseUnique(); - createTable.getTableElementList().add(unique); + } else if (lexer.token == Token.PRIMARY // + || lexer.token == Token.UNIQUE // + || lexer.token == Token.CONSTRAINT) { + OracleConstraint constraint = ((OracleExprParser) this.exprParser).parseConstaint(); + constraint.setParent(createTable); + createTable.getTableElementList().add(constraint); } else if (lexer.token() == Token.TABLESPACE) { throw new ParserException("TODO " + lexer.token()); } else { throw new ParserException("TODO " + lexer.token()); } - + if (lexer.token() == Token.COMMA) { lexer.nextToken(); continue; diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index b03f8edfed..704b763f9f 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -65,6 +65,11 @@ import com.alibaba.druid.sql.ast.statement.SQLCharactorDataType; import com.alibaba.druid.sql.ast.statement.SQLColumnCheck; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLColumnPrimaryKey; +import com.alibaba.druid.sql.ast.statement.SQLColumnReference; +import com.alibaba.druid.sql.ast.statement.SQLColumnUniqueKey; +import com.alibaba.druid.sql.ast.statement.SQLConstaint; +import com.alibaba.druid.sql.ast.statement.SQLForeignKeyConstraint; +import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl; import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey; import com.alibaba.druid.sql.ast.statement.SQLPrimaryKeyImpl; import com.alibaba.druid.sql.ast.statement.SQLSelect; @@ -620,6 +625,10 @@ public class SQLExprParser extends SQLParser { } public final void names(Collection exprCol) { + names(exprCol, null); + } + + public final void names(Collection exprCol, SQLObject parent) { if (lexer.token() == Token.RBRACE) { return; } @@ -628,11 +637,16 @@ public class SQLExprParser extends SQLParser { return; } - exprCol.add(name()); + SQLName name = name(); + name.setParent(parent); + exprCol.add(name); while (lexer.token() == Token.COMMA) { lexer.nextToken(); - exprCol.add(name()); + + name = name(); + name.setParent(parent); + exprCol.add(name); } } @@ -1293,13 +1307,48 @@ public class SQLExprParser extends SQLParser { return parseColumnRest(column); } - if (lexer.token == Token.UNION) { + if (lexer.token == Token.UNIQUE) { lexer.nextToken(); accept(Token.KEY); column.getConstaints().add(new SQLColumnPrimaryKey()); return parseColumnRest(column); } + if (lexer.token == Token.CONSTRAINT) { + lexer.nextToken(); + + SQLName name = this.name(); + + if (lexer.token() == Token.PRIMARY) { + lexer.nextToken(); + accept(Token.KEY); + SQLColumnPrimaryKey pk = new SQLColumnPrimaryKey(); + pk.setName(name); + column.getConstaints().add(pk); + return parseColumnRest(column); + } + + if (lexer.token() == Token.UNIQUE) { + lexer.nextToken(); + SQLColumnUniqueKey uk = new SQLColumnUniqueKey(); + uk.setName(name); + column.getConstaints().add(uk); + return parseColumnRest(column); + } + + if (lexer.token() == Token.REFERENCES) { + lexer.nextToken(); + SQLColumnReference ref = new SQLColumnReference(); + ref.setName(name); + ref.setTable(this.name()); + accept(Token.LPAREN); + this.names(ref.getColumns(), ref); + accept(Token.RPAREN); + column.getConstaints().add(ref); + return parseColumnRest(column); + } + } + if (lexer.token == Token.CHECK) { lexer.nextToken(); SQLExpr expr = this.expr(); @@ -1365,4 +1414,52 @@ public class SQLExprParser extends SQLParser { lexer.nextToken(); } } + + public SQLConstaint parseConstaint() { + SQLName name = null; + + if (lexer.token() == Token.CONSTRAINT) { + lexer.nextToken(); + name = this.name(); + } + + SQLConstaint constraint; + if (lexer.token() == Token.PRIMARY) { + constraint = parsePrimaryKey(); + } else if (lexer.token() == Token.UNIQUE) { + constraint = parseUnique(); + } else if (lexer.token() == Token.FOREIGN) { + constraint = parseForeignKey(); + } else { + throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); + } + + constraint.setName(name); + + return constraint; + } + + public SQLForeignKeyConstraint parseForeignKey() { + accept(Token.FOREIGN); + accept(Token.KEY); + + SQLForeignKeyConstraint fk = createForeignKey(); + + accept(Token.LPAREN); + this.names(fk.getReferencingColumns()); + accept(Token.RPAREN); + + accept(Token.REFERENCES); + + fk.setReferencedTableName(this.name()); + + accept(Token.LPAREN); + this.names(fk.getReferencedColumns()); + accept(Token.RPAREN); + return fk; + } + + protected SQLForeignKeyConstraint createForeignKey() { + return new SQLForeignKeyImpl(); + } } 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 bc85216bef..40c9922398 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -88,6 +88,8 @@ import com.alibaba.druid.sql.ast.statement.SQLColumnCheck; import com.alibaba.druid.sql.ast.statement.SQLColumnConstraint; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLColumnPrimaryKey; +import com.alibaba.druid.sql.ast.statement.SQLColumnReference; +import com.alibaba.druid.sql.ast.statement.SQLColumnUniqueKey; import com.alibaba.druid.sql.ast.statement.SQLCommentStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateDatabaseStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateIndexStatement; @@ -98,12 +100,14 @@ import com.alibaba.druid.sql.ast.statement.SQLDropTableStatement; import com.alibaba.druid.sql.ast.statement.SQLDropViewStatement; import com.alibaba.druid.sql.ast.statement.SQLExprHint; import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; +import com.alibaba.druid.sql.ast.statement.SQLForeignKeyConstraint; +import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; -import com.alibaba.druid.sql.ast.statement.SQLPrimaryKeyImpl; -import com.alibaba.druid.sql.ast.statement.SQLUnique; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement.ValuesClause; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource.JoinType; +import com.alibaba.druid.sql.ast.statement.SQLPrimaryKey; +import com.alibaba.druid.sql.ast.statement.SQLPrimaryKeyImpl; import com.alibaba.druid.sql.ast.statement.SQLReleaseSavePointStatement; import com.alibaba.druid.sql.ast.statement.SQLRollbackStatement; import com.alibaba.druid.sql.ast.statement.SQLSavePointStatement; @@ -118,6 +122,7 @@ import com.alibaba.druid.sql.ast.statement.SQLSubqueryTableSource; import com.alibaba.druid.sql.ast.statement.SQLTableElement; import com.alibaba.druid.sql.ast.statement.SQLTruncateStatement; import com.alibaba.druid.sql.ast.statement.SQLUnionQuery; +import com.alibaba.druid.sql.ast.statement.SQLUnique; import com.alibaba.druid.sql.ast.statement.SQLUniqueConstraint; import com.alibaba.druid.sql.ast.statement.SQLUpdateSetItem; import com.alibaba.druid.sql.ast.statement.SQLUpdateStatement; @@ -813,8 +818,19 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab } for (SQLColumnConstraint item : x.getConstaints()) { - print(' '); + boolean newLine = item instanceof SQLForeignKeyConstraint || item instanceof SQLPrimaryKey || item instanceof SQLColumnReference; + if (newLine) { + incrementIndent(); + println(); + } else { + print(' '); + } + item.accept(this); + + if (newLine) { + decrementIndent(); + } } if (x.getEnable() != null) { @@ -1348,10 +1364,24 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab @Override public boolean visit(SQLColumnPrimaryKey x) { + if (x.getName() != null) { + print(" CONSTRAINT "); + x.getName().accept(this); + } print(" PRIMARY KEY"); return false; } + @Override + public boolean visit(SQLColumnUniqueKey x) { + if (x.getName() != null) { + print(" CONSTRAINT "); + x.getName().accept(this); + } + print(" UNIQUE"); + return false; + } + @Override public boolean visit(SQLColumnCheck x) { print("CHECK "); @@ -1534,7 +1564,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab print(")"); return false; } - + @Override public boolean visit(SQLAlterTableRenameColumn x) { print("RENAME COLUMN "); @@ -1543,4 +1573,40 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab x.getTo().accept(this); return false; } + + @Override + public boolean visit(SQLColumnReference x) { + if (x.getName() != null) { + print("CONSTRAINT "); + x.getName().accept(this); + print(" "); + } + print("REFERENCES "); + x.getTable().accept(this); + print(" ("); + printAndAccept(x.getColumns(), ", "); + print(")"); + return false; + } + + @Override + public boolean visit(SQLForeignKeyImpl x) { + if (x.getName() != null) { + print("CONSTRAINT "); + x.getName().accept(this); + print(' '); + } + + print("FOREIGN KEY ("); + printAndAccept(x.getReferencedColumns(), ", "); + print(")"); + + print(" REFERENCES "); + x.getReferencedTableName().accept(this); + + print(" ("); + printAndAccept(x.getReferencedColumns(), ", "); + print(")"); + return false; + } } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java index ff1eb12527..13d0bd37c4 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java @@ -71,6 +71,8 @@ import com.alibaba.druid.sql.ast.statement.SQLCheck; import com.alibaba.druid.sql.ast.statement.SQLColumnCheck; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLColumnPrimaryKey; +import com.alibaba.druid.sql.ast.statement.SQLColumnReference; +import com.alibaba.druid.sql.ast.statement.SQLColumnUniqueKey; import com.alibaba.druid.sql.ast.statement.SQLCommentStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateDatabaseStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateIndexStatement; @@ -82,6 +84,7 @@ import com.alibaba.druid.sql.ast.statement.SQLDropTableStatement; import com.alibaba.druid.sql.ast.statement.SQLDropViewStatement; import com.alibaba.druid.sql.ast.statement.SQLExprHint; import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; +import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource; import com.alibaba.druid.sql.ast.statement.SQLPrimaryKeyImpl; @@ -393,6 +396,10 @@ public interface SQLASTVisitor { void endVisit(SQLColumnPrimaryKey x); boolean visit(SQLColumnPrimaryKey x); + + boolean visit(SQLColumnUniqueKey x); + + void endVisit(SQLColumnUniqueKey x); void endVisit(SQLWithSubqueryClause x); @@ -469,5 +476,12 @@ public interface SQLASTVisitor { boolean visit(SQLAlterTableRenameColumn x); void endVisit(SQLAlterTableRenameColumn x); - + + boolean visit(SQLColumnReference x); + + void endVisit(SQLColumnReference x); + + boolean visit(SQLForeignKeyImpl x); + + void endVisit(SQLForeignKeyImpl x); } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java index 80fad286cf..b7af435223 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java @@ -71,6 +71,8 @@ import com.alibaba.druid.sql.ast.statement.SQLCheck; import com.alibaba.druid.sql.ast.statement.SQLColumnCheck; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLColumnPrimaryKey; +import com.alibaba.druid.sql.ast.statement.SQLColumnReference; +import com.alibaba.druid.sql.ast.statement.SQLColumnUniqueKey; import com.alibaba.druid.sql.ast.statement.SQLCommentStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateDatabaseStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateIndexStatement; @@ -82,6 +84,7 @@ import com.alibaba.druid.sql.ast.statement.SQLDropTableStatement; import com.alibaba.druid.sql.ast.statement.SQLDropViewStatement; import com.alibaba.druid.sql.ast.statement.SQLExprHint; import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; +import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement.ValuesClause; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource; @@ -696,6 +699,16 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { public boolean visit(SQLColumnPrimaryKey x) { return true; } + + @Override + public void endVisit(SQLColumnUniqueKey x) { + + } + + @Override + public boolean visit(SQLColumnUniqueKey x) { + return true; + } @Override public void endVisit(SQLWithSubqueryClause x) { @@ -894,4 +907,24 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { public void endVisit(SQLAlterTableRenameColumn x) { } + + @Override + public boolean visit(SQLColumnReference x) { + return true; + } + + @Override + public void endVisit(SQLColumnReference x) { + + } + + @Override + public boolean visit(SQLForeignKeyImpl x) { + return true; + } + + @Override + public void endVisit(SQLForeignKeyImpl x) { + + } } 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 93fafdfc77..85d4b5abe4 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -55,6 +55,7 @@ import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement; import com.alibaba.druid.sql.ast.statement.SQLDropIndexStatement; import com.alibaba.druid.sql.ast.statement.SQLDropTableStatement; import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; +import com.alibaba.druid.sql.ast.statement.SQLForeignKeyImpl; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; import com.alibaba.druid.sql.ast.statement.SQLJoinTableSource; import com.alibaba.druid.sql.ast.statement.SQLRollbackStatement; @@ -1212,4 +1213,24 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { return false; } + + @Override + public boolean visit(SQLForeignKeyImpl x) { + + for (SQLName column : x.getReferencedColumns()) { + column.accept(this); + } + + String table = x.getReferencedTableName().getSimleName(); + setCurrentTable(table); + + TableStat stat = getTableStat(table); + stat.incrementReferencedCount(); + for (SQLName column : x.getReferencedColumns()) { + String columnName = column.getSimleName(); + addColumn(table, columnName); + } + + return false; + } } diff --git a/src/main/java/com/alibaba/druid/stat/TableStat.java b/src/main/java/com/alibaba/druid/stat/TableStat.java index 44fae8a7c3..f1adf362fa 100644 --- a/src/main/java/com/alibaba/druid/stat/TableStat.java +++ b/src/main/java/com/alibaba/druid/stat/TableStat.java @@ -34,6 +34,15 @@ public class TableStat { int alterCount = 0; int createIndexCount = 0; int dropIndexCount = 0; + int referencedCount = 0; + + public int getReferencedCount() { + return referencedCount; + } + + public void incrementReferencedCount() { + referencedCount++; + } public int getDropIndexCount() { return dropIndexCount; diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlASTVisitorAdapterTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlASTVisitorAdapterTest.java index c86b8183cb..75b39bf9d3 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlASTVisitorAdapterTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlASTVisitorAdapterTest.java @@ -3,7 +3,6 @@ package com.alibaba.druid.bvt.sql.mysql; import junit.framework.TestCase; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlForceIndexHint; -import com.alibaba.druid.sql.dialect.mysql.ast.MySqlForeignKey; 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; @@ -199,7 +198,6 @@ public class MySqlASTVisitorAdapterTest extends TestCase { new MySqlCharExpr().accept(adapter); new MySqlAlterTableAddUnique().accept(adapter); new MySqlUnique().accept(adapter); - new MySqlForeignKey().accept(adapter); new MySqlAlterTableModifyColumn().accept(adapter); new MySqlAlterTableDiscardTablespace().accept(adapter); new MySqlAlterTableImportTablespace().accept(adapter); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest_addFk.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest_addFk.java index 306de56e6a..7c78e5c0a0 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest_addFk.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlAlterTableTest_addFk.java @@ -47,7 +47,7 @@ public class MySqlAlterTableTest_addFk extends TestCase { "\n\tADD INDEX FK4CF5DC0F5DD7C31 (test1_name)," + // "\n\tADD CONSTRAINT FK4CF5DC0F5DD7C31 FOREIGN KEY (name) REFERENCES Test1 (name)", output); - Assert.assertEquals(1, visitor.getTables().size()); - Assert.assertEquals(0, visitor.getColumns().size()); + Assert.assertEquals(2, visitor.getTables().size()); + Assert.assertEquals(2, visitor.getColumns().size()); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest7.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest7.java index fd927d558a..ab0a1aef68 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest7.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest7.java @@ -54,8 +54,8 @@ public class MySqlCreateTableTest7 extends MysqlTest { System.out.println("coditions : " + visitor.getConditions()); System.out.println("orderBy : " + visitor.getOrderByColumns()); - Assert.assertEquals(1, visitor.getTables().size()); - Assert.assertEquals(3, visitor.getColumns().size()); + Assert.assertEquals(2, visitor.getTables().size()); + Assert.assertEquals(4, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getConditions().size()); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("Orders"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest20.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest20.java new file mode 100644 index 0000000000..3391b580b8 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleAlterTableTest20.java @@ -0,0 +1,69 @@ +/* + * 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.oracle; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +public class OracleAlterTableTest20 extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "ALTER TABLE sales " // + + " ADD CONSTRAINT sales_pk PRIMARY KEY (prod_id, cust_id) DISABLE; "; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals("ALTER TABLE sales" // + + "\n\tADD CONSTRAINT sales_pk PRIMARY KEY (prod_id, cust_id) DIABLE", // + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("sales"))); + + Assert.assertEquals(2, visitor.getColumns().size()); + + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("PRODUCT_IDS_ZZJ_TBD0209", + // "discount_amount"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("ws_affiliate_tran_product", + // "commission_amount"))); + // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("pivot_table", "order_mode"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest19.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest19.java index 8ef08890f4..eeabe02c98 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest19.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest19.java @@ -58,20 +58,21 @@ public class OracleCreateTableTest19 extends OracleTest { Assert.assertEquals(1, statementList.size()); Assert.assertEquals("CREATE TABLE \"SONAR\".\"ACTIVE_DASHBOARDS\" (" // - + "\n\t\"ID\" NUMBER(38, 0) NOT NULL ENABLE," // - + "\n\t\"DASHBOARD_ID\" NUMBER(38, 0) NOT NULL ENABLE," // - + "\n\t\"USER_ID\" NUMBER(38, 0)," // - + "\n\t\"ORDER_INDEX\" NUMBER(38, 0)," // - + "\n\tPRIMARY KEY (\"ID\")" - + "\n\tUSING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS TABLESPACE \"USERS\" ENABLE" - + "\n)" - + "\nPCTFREE 10" - + "\nINITRANS 1" - + "\nMAXTRANS 255" - + "\nNOCOMPRESS" - + "\nLOGGING" - + "\nTABLESPACE \"USERS\"" - + "\nSTORAGE (INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)", + + "\n\t\"ID\" NUMBER(38, 0) NOT NULL ENABLE," // + + "\n\t\"DASHBOARD_ID\" NUMBER(38, 0) NOT NULL ENABLE," // + + "\n\t\"USER_ID\" NUMBER(38, 0)," // + + "\n\t\"ORDER_INDEX\" NUMBER(38, 0)," // + + "\n\tPRIMARY KEY (\"ID\")" // + + "\n\tUSING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS TABLESPACE \"USERS\" ENABLE" + + "\n\tSTORAGE (INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)" // + + "\n)" // + + "\nPCTFREE 10" // + + "\nINITRANS 1" // + + "\nMAXTRANS 255" // + + "\nNOCOMPRESS" // + + "\nLOGGING" // + + "\nTABLESPACE \"USERS\"" // + + "\nSTORAGE (INITIAL 65536 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)", // SQLUtils.toSQLString(statement, JdbcConstants.ORACLE)); OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest21.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest21.java index 7bf7ed2bb2..9a946ce624 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest21.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest21.java @@ -31,8 +31,11 @@ public class OracleCreateTableTest21 extends OracleTest { public void test_types() throws Exception { String sql = // - "CREATE TABLE divisions " + " (div_no NUMBER(2), " + " div_name VARCHAR2(14), " - + " location VARCHAR2(13) ) " + " STORAGE ( INITIAL 8M MAXSIZE 1G );"; + "CREATE TABLE divisions " // + + " (div_no NUMBER(2), " // + + " div_name VARCHAR2(14), "// + + " location VARCHAR2(13) ) " // + + " STORAGE ( INITIAL 8M MAXSIZE 1G );"; OracleStatementParser parser = new OracleStatementParser(sql); List statementList = parser.parseStatementList(); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest22.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest22.java new file mode 100644 index 0000000000..f437f1edf8 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest22.java @@ -0,0 +1,81 @@ +/* + * 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.oracle; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +public class OracleCreateTableTest22 extends OracleTest { + + public void test_types() throws Exception { + String sql = // + "CREATE TABLE promotions_var2" // + + " ( promo_id NUMBER(6)"// + + " , promo_name VARCHAR2(20)"// + + " , promo_category VARCHAR2(15)"// + + " , promo_cost NUMBER(10,2)"// + + " , promo_begin_date DATE"// + + " , promo_end_date DATE"// + + " , CONSTRAINT promo_id_u UNIQUE (promo_id)"// + + " USING INDEX PCTFREE 20"// + + " TABLESPACE stocks"// + + " STORAGE (INITIAL 8M) );"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("CREATE TABLE promotions_var2 (" + + "\n\tpromo_id NUMBER(6)," + + "\n\tpromo_name VARCHAR2(20)," + + "\n\tpromo_category VARCHAR2(15)," + + "\n\tpromo_cost NUMBER(10, 2)," + + "\n\tpromo_begin_date DATE," + + "\n\tpromo_end_date DATE," + + "\n\tCONSTRAINT promo_id_u UNIQUE (promo_id)" + + "\n\tUSING INDEX PCTFREE 20 TABLESPACE stocks" + + "\n\tSTORAGE (INITIAL 8M)" + + "\n)",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertEquals(7, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("promotions_var2", "promo_id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest23.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest23.java new file mode 100644 index 0000000000..ddc51e4138 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest23.java @@ -0,0 +1,76 @@ +/* + * 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.oracle; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +public class OracleCreateTableTest23 extends OracleTest { + + public void test_types() throws Exception { + String sql = // + "CREATE TABLE promotions_var1" // + + " ( promo_id NUMBER(6)" // + + " CONSTRAINT promo_id_u UNIQUE" // + + " , promo_name VARCHAR2(20)" // + + " , promo_category VARCHAR2(15)" // + + " , promo_cost NUMBER(10,2)" // + + " , promo_begin_date DATE" // + + " , promo_end_date DATE" // + + " ) ;"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("CREATE TABLE promotions_var1 (" // + + "\n\tpromo_id NUMBER(6) CONSTRAINT promo_id_u UNIQUE," // + + "\n\tpromo_name VARCHAR2(20)," // + + "\n\tpromo_category VARCHAR2(15)," // + + "\n\tpromo_cost NUMBER(10, 2)," // + + "\n\tpromo_begin_date DATE," // + + "\n\tpromo_end_date DATE" // + + "\n)",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertEquals(6, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("promotions_var1", "promo_id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest24.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest24.java new file mode 100644 index 0000000000..451168fed9 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest24.java @@ -0,0 +1,75 @@ +/* + * 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.oracle; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +public class OracleCreateTableTest24 extends OracleTest { + + public void test_types() throws Exception { + String sql = // + "CREATE TABLE locations_demo" // + + " ( location_id NUMBER(4) CONSTRAINT loc_id_pk PRIMARY KEY" // + + " , street_address VARCHAR2(40)" // + + " , postal_code VARCHAR2(12)" // + + " , city VARCHAR2(30)" // + + " , state_province VARCHAR2(25)" // + + " , country_id CHAR(2)" // + + " ) ;"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("CREATE TABLE locations_demo (" // + + "\n\tlocation_id NUMBER(4) CONSTRAINT loc_id_pk PRIMARY KEY," // + + "\n\tstreet_address VARCHAR2(40)," // + + "\n\tpostal_code VARCHAR2(12)," // + + "\n\tcity VARCHAR2(30)," // + + "\n\tstate_province VARCHAR2(25)," // + + "\n\tcountry_id CHAR(2)" // + + "\n)",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertEquals(6, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("locations_demo", "location_id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest25.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest25.java new file mode 100644 index 0000000000..8aff634188 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest25.java @@ -0,0 +1,76 @@ +/* + * 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.oracle; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +public class OracleCreateTableTest25 extends OracleTest { + + public void test_types() throws Exception { + String sql = // + "CREATE TABLE locations_demo" // + + " ( location_id NUMBER(4) "// + + " , street_address VARCHAR2(40)"// + + " , postal_code VARCHAR2(12)"// + + " , city VARCHAR2(30)"// + + " , state_province VARCHAR2(25)"// + + " , country_id CHAR(2)"// + + " , CONSTRAINT loc_id_pk PRIMARY KEY (location_id));"; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("CREATE TABLE locations_demo (" // + + "\n\tlocation_id NUMBER(4)," // + + "\n\tstreet_address VARCHAR2(40)," // + + "\n\tpostal_code VARCHAR2(12)," // + + "\n\tcity VARCHAR2(30)," // + + "\n\tstate_province VARCHAR2(25)," // + + "\n\tcountry_id CHAR(2)," + + "\n\tCONSTRAINT loc_id_pk PRIMARY KEY (location_id)" // + + "\n)",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertEquals(6, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("locations_demo", "location_id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest26.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest26.java new file mode 100644 index 0000000000..d2200fbab2 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest26.java @@ -0,0 +1,80 @@ +/* + * 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.oracle; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +public class OracleCreateTableTest26 extends OracleTest { + + public void test_types() throws Exception { + String sql = // + "CREATE TABLE dept_20 " // + + " (employee_id NUMBER(4), "// + + " last_name VARCHAR2(10), "// + + " job_id VARCHAR2(9), "// + + " manager_id NUMBER(4), "// + + " hire_date DATE, "// + + " salary NUMBER(7,2), "// + + " commission_pct NUMBER(7,2), "// + + " department_id CONSTRAINT fk_deptno "// + + " REFERENCES departments(department_id) ); "; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("CREATE TABLE dept_20 (" // + + "\n\temployee_id NUMBER(4),"// + + "\n\tlast_name VARCHAR2(10),"// + + "\n\tjob_id VARCHAR2(9),"// + + "\n\tmanager_id NUMBER(4),"// + + "\n\thire_date DATE,"// + + "\n\tsalary NUMBER(7, 2),"// + + "\n\tcommission_pct NUMBER(7, 2),"// + + "\n\tdepartment_id"// + + "\n\t\tCONSTRAINT fk_deptno REFERENCES departments (department_id)"// + + "\n)",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(1, visitor.getTables().size()); + + Assert.assertEquals(8, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("dept_20", "employee_id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest27.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest27.java new file mode 100644 index 0000000000..82b939d0f1 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleCreateTableTest27.java @@ -0,0 +1,82 @@ +/* + * 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.oracle; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +public class OracleCreateTableTest27 extends OracleTest { + + public void test_types() throws Exception { + String sql = // + "CREATE TABLE dept_20 " // + + " (employee_id NUMBER(4), " // + + " last_name VARCHAR2(10), " // + + " job_id VARCHAR2(9), " // + + " manager_id NUMBER(4), " // + + " hire_date DATE, " // + + " salary NUMBER(7,2), " // + + " commission_pct NUMBER(7,2), " // + + " department_id, " // + + " CONSTRAINT fk_deptno " // + + " FOREIGN KEY (department_id) " // + + " REFERENCES departments(department_id) ); "; + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + Assert.assertEquals("CREATE TABLE dept_20 (" // + + "\n\temployee_id NUMBER(4),"// + + "\n\tlast_name VARCHAR2(10),"// + + "\n\tjob_id VARCHAR2(9),"// + + "\n\tmanager_id NUMBER(4),"// + + "\n\thire_date DATE,"// + + "\n\tsalary NUMBER(7, 2),"// + + "\n\tcommission_pct NUMBER(7, 2),"// + + "\n\tdepartment_id,"// + + "\n\tCONSTRAINT fk_deptno FOREIGN KEY (department_id) REFERENCES departments (department_id)"// + + "\n)",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + Assert.assertEquals(2, visitor.getTables().size()); + + Assert.assertEquals(9, visitor.getColumns().size()); + + Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("dept_20", "employee_id"))); + } +}