diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlBinaryExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryExpr.java similarity index 73% rename from src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlBinaryExpr.java rename to src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryExpr.java index 11ac5046f2..cd4f5a7321 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlBinaryExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryExpr.java @@ -13,21 +13,20 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alibaba.druid.sql.dialect.mysql.ast.expr; +package com.alibaba.druid.sql.ast.expr; -import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr; -import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; +import com.alibaba.druid.sql.ast.SQLExprImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; -public class MySqlBinaryExpr extends MySqlExprImpl implements MySqlExpr, SQLLiteralExpr { +public class SQLBinaryExpr extends SQLExprImpl implements SQLLiteralExpr { private String value; - public MySqlBinaryExpr(){ + public SQLBinaryExpr(){ } - public MySqlBinaryExpr(String value){ + public SQLBinaryExpr(String value){ super(); this.value = value; } @@ -40,12 +39,7 @@ public class MySqlBinaryExpr extends MySqlExprImpl implements MySqlExpr, SQLLite this.value = value; } - @Override - protected void accept0(SQLASTVisitor visitor) { - this.accept0((MySqlASTVisitor) visitor); - } - - public void accept0(MySqlASTVisitor visitor) { + public void accept0(SQLASTVisitor visitor) { visitor.visit(this); visitor.endVisit(this); @@ -76,7 +70,7 @@ public class MySqlBinaryExpr extends MySqlExprImpl implements MySqlExpr, SQLLite if (getClass() != obj.getClass()) { return false; } - MySqlBinaryExpr other = (MySqlBinaryExpr) obj; + SQLBinaryExpr other = (SQLBinaryExpr) obj; if (value == null) { if (other.value != null) { return false; diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableAlterColumn.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableAlterColumn.java index 3d5a5d7a14..cf8d992270 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableAlterColumn.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableAlterColumn.java @@ -16,6 +16,7 @@ package com.alibaba.druid.sql.ast.statement; +import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLObjectImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -23,10 +24,19 @@ public class SQLAlterTableAlterColumn extends SQLObjectImpl implements SQLAlterT private SQLColumnDefinition column; + private boolean setNotNull; + + private boolean dropNotNull; + + private SQLExpr setDefault; + + private boolean dropDefault; + @Override protected void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, column); + acceptChild(visitor, setDefault); } visitor.endVisit(this); } @@ -39,4 +49,36 @@ public class SQLAlterTableAlterColumn extends SQLObjectImpl implements SQLAlterT this.column = column; } + public boolean isSetNotNull() { + return setNotNull; + } + + public void setSetNotNull(boolean setNotNull) { + this.setNotNull = setNotNull; + } + + public boolean isDropNotNull() { + return dropNotNull; + } + + public void setDropNotNull(boolean dropNotNull) { + this.dropNotNull = dropNotNull; + } + + public SQLExpr getSetDefault() { + return setDefault; + } + + public void setSetDefault(SQLExpr setDefault) { + this.setDefault = setDefault; + } + + public boolean isDropDefault() { + return dropDefault; + } + + public void setDropDefault(boolean dropDefault) { + this.dropDefault = dropDefault; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableDropColumnItem.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableDropColumnItem.java index 6cc4e87010..e82ce16fef 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableDropColumnItem.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableDropColumnItem.java @@ -26,6 +26,8 @@ public class SQLAlterTableDropColumnItem extends SQLObjectImpl implements SQLAlt private List columns = new ArrayList(); + private boolean cascade = false; + public SQLAlterTableDropColumnItem(){ } @@ -42,4 +44,12 @@ public class SQLAlterTableDropColumnItem extends SQLObjectImpl implements SQLAlt return columns; } + public boolean isCascade() { + return cascade; + } + + public void setCascade(boolean cascade) { + this.cascade = cascade; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableRename.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableRename.java new file mode 100644 index 0000000000..f851008ae9 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableRename.java @@ -0,0 +1,28 @@ +package com.alibaba.druid.sql.ast.statement; + +import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLObjectImpl; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class SQLAlterTableRename extends SQLObjectImpl implements SQLAlterTableItem { + + protected SQLExpr to; + + public SQLExpr getTo() { + return to; + } + + public void setTo(SQLExpr to) { + this.to = to; + to.setParent(this); + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, to); + } + visitor.endVisit(this); + } + +} 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 72b4d5213b..1dcc8a7d25 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 @@ -20,6 +20,7 @@ import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLOrderBy; import com.alibaba.druid.sql.ast.SQLOrderingSpecification; +import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr; import com.alibaba.druid.sql.ast.expr.SQLAggregateExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; @@ -39,7 +40,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey; import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey.Match; import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey.On; import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey.Option; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExtractExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr; @@ -187,7 +187,7 @@ public class MySqlExprParser extends SQLExprParser { } else if (ident.equalsIgnoreCase("b")) { String charValue = lexer.stringVal(); lexer.nextToken(); - expr = new MySqlBinaryExpr(charValue); + expr = new SQLBinaryExpr(charValue); return primaryRest(expr); } else if (ident.startsWith("_")) { @@ -271,7 +271,7 @@ public class MySqlExprParser extends SQLExprParser { String binaryString = lexer.stringVal(); if (intExpr.getNumber().intValue() == 0 && binaryString.startsWith("b")) { lexer.nextToken(); - expr = new MySqlBinaryExpr(binaryString.substring(1)); + expr = new SQLBinaryExpr(binaryString.substring(1)); return primaryRest(expr); } 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 5932f536e9..01d996651f 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 @@ -22,7 +22,6 @@ 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.MySqlUseIndexHint; import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExtractExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr; @@ -160,10 +159,6 @@ public interface MySqlASTVisitor extends SQLASTVisitor { boolean visit(MySqlMatchAgainstExpr x); - void endVisit(MySqlBinaryExpr x); - - boolean visit(MySqlBinaryExpr x); - void endVisit(MySqlPrepareStatement x); boolean visit(MySqlPrepareStatement 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 1e9058d1db..ff0af1b06f 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 @@ -22,7 +22,6 @@ 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.MySqlUseIndexHint; import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExtractExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr; @@ -203,17 +202,6 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements MySq return true; } - @Override - public void endVisit(MySqlBinaryExpr x) { - - } - - @Override - public boolean visit(MySqlBinaryExpr x) { - - return true; - } - @Override public void endVisit(MySqlPrepareStatement x) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlEvalVisitorImpl.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlEvalVisitorImpl.java index 3629dbb837..3a2f25ed61 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlEvalVisitorImpl.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlEvalVisitorImpl.java @@ -20,6 +20,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr; import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr; @@ -35,7 +36,6 @@ import com.alibaba.druid.sql.ast.expr.SQLNumberExpr; import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; import com.alibaba.druid.sql.ast.expr.SQLUnaryExpr; import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr; import com.alibaba.druid.sql.visitor.SQLEvalVisitor; import com.alibaba.druid.sql.visitor.SQLEvalVisitorUtils; import com.alibaba.druid.sql.visitor.functions.Function; @@ -101,7 +101,8 @@ public class MySqlEvalVisitorImpl extends MySqlASTVisitorAdapter implements SQLE return SQLEvalVisitorUtils.visit(this, x); } - public boolean visit(MySqlBinaryExpr x) { + @Override + public boolean visit(SQLBinaryExpr x) { return SQLEvalVisitorUtils.visit(this, 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 e14fda7181..27bce282a1 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 @@ -44,7 +44,6 @@ 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.MySqlUseIndexHint; import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExtractExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr; @@ -776,20 +775,6 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV return false; } - @Override - public void endVisit(MySqlBinaryExpr x) { - - } - - @Override - public boolean visit(MySqlBinaryExpr x) { - print("b'"); - print(x.getValue()); - print('\''); - - return false; - } - @Override public void endVisit(MySqlPrepareStatement x) { } 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 b9ae24a1db..2a0dd9cd6c 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 @@ -37,7 +37,6 @@ 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.MySqlUseIndexHint; import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExtractExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr; @@ -304,17 +303,6 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS return true; } - @Override - public void endVisit(MySqlBinaryExpr x) { - - } - - @Override - public boolean visit(MySqlBinaryExpr x) { - - return true; - } - @Override public void endVisit(MySqlPrepareStatement x) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableRenameTo.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableRenameTo.java deleted file mode 100644 index 3e5ca3dd04..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleAlterTableRenameTo.java +++ /dev/null @@ -1,41 +0,0 @@ -/* - * 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.SQLExpr; -import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; - -public class OracleAlterTableRenameTo extends OracleAlterTableItem { - - private SQLExpr to; - - @Override - public void accept0(OracleASTVisitor visitor) { - if (visitor.visit(this)) { - acceptChild(visitor, to); - } - visitor.endVisit(this); - } - - public SQLExpr getTo() { - return to; - } - - public void setTo(SQLExpr to) { - this.to = to; - } - -} 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 fcd87010fc..ecd2bd5fef 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 @@ -33,8 +33,6 @@ import com.alibaba.druid.sql.ast.statement.SQLAlterTableDisableConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropColumnItem; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableConstraint; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem; -import com.alibaba.druid.sql.ast.statement.SQLAlterTableRenameColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLDropSequenceStatement; @@ -61,7 +59,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstain 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; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.NestedTablePartitionSpec; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.TableSpaceItem; @@ -914,27 +911,6 @@ public class OracleStatementParser extends SQLStatementParser { return stmt; } - private SQLAlterTableItem parseAlterTableRename() { - acceptIdentifier("RENAME"); - - if (lexer.token() == Token.COLUMN) { - lexer.nextToken(); - SQLAlterTableRenameColumn renameColumn = new SQLAlterTableRenameColumn(); - renameColumn.setColumn(this.exprParser.name()); - accept(Token.TO); - renameColumn.setTo(this.exprParser.name()); - return renameColumn; - } - - if (lexer.token() == Token.TO) { - lexer.nextToken(); - OracleAlterTableRenameTo item = new OracleAlterTableRenameTo(); - item.setTo(this.exprParser.name()); - return item; - } - throw new ParserException("TODO : " + lexer.token() + " " + lexer.stringVal()); - } - 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 53f367a91f..af25d7608f 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 @@ -60,7 +60,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstain 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; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; @@ -453,10 +452,6 @@ public interface OracleASTVisitor extends SQLASTVisitor { void endVisit(OracleAlterTableAddConstaint x); - boolean visit(OracleAlterTableRenameTo x); - - void endVisit(OracleAlterTableRenameTo x); - boolean visit(OraclePrimaryKey x); void endVisit(OraclePrimaryKey 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 9868255fd4..b74d4eb505 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 @@ -68,7 +68,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstain 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; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; @@ -1021,16 +1020,6 @@ public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements Ora } - @Override - public boolean visit(OracleAlterTableRenameTo x) { - return true; - } - - @Override - public void endVisit(OracleAlterTableRenameTo x) { - - } - @Override public boolean visit(OracleStorageClause x) { return true; 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 7275067708..77aab6e233 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 @@ -98,7 +98,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstain 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; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.NestedTablePartitionSpec; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition.TableSpaceItem; @@ -2489,18 +2488,6 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS } - @Override - public boolean visit(OracleAlterTableRenameTo x) { - print("RENAME TO "); - x.getTo().accept(this); - return false; - } - - @Override - public void endVisit(OracleAlterTableRenameTo x) { - - } - @Override public boolean visit(OracleStorageClause x) { print("STORAGE ("); 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 3e0272d488..41b190d2aa 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 @@ -91,7 +91,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstain 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; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; @@ -1421,16 +1420,6 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle this.endVisit((SQLCreateTableStatement) x); } - @Override - public boolean visit(OracleAlterTableRenameTo x) { - return false; - } - - @Override - public void endVisit(OracleAlterTableRenameTo x) { - - } - @Override public boolean visit(OracleStorageClause x) { return false; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGAlterTableAlterColumnSetNotNull.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGAlterTableAlterColumnSetNotNull.java new file mode 100644 index 0000000000..9547b81e17 --- /dev/null +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/stmt/PGAlterTableAlterColumnSetNotNull.java @@ -0,0 +1,6 @@ +package com.alibaba.druid.sql.dialect.postgresql.ast.stmt; + + +public class PGAlterTableAlterColumnSetNotNull { + +} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java index 7ed2f67360..64272f67a0 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java @@ -17,6 +17,7 @@ package com.alibaba.druid.sql.dialect.postgresql.parser; import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLTimestampExpr; import com.alibaba.druid.sql.ast.expr.SQLUnaryExpr; @@ -216,6 +217,12 @@ public class PGExprParser extends SQLExprParser { PGLineSegmentsExpr lseg = new PGLineSegmentsExpr(); lseg.setValue(value); return primaryRest(lseg); + } else if (ident.equalsIgnoreCase("b") && lexer.token() == Token.LITERAL_CHARS) { + String charValue = lexer.stringVal(); + lexer.nextToken(); + expr = new SQLBinaryExpr(charValue); + + return primaryRest(expr); } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java index 2e6208d5af..69207d1621 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGSQLStatementParser.java @@ -22,6 +22,8 @@ import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.expr.SQLCurrentOfCursorExpr; import com.alibaba.druid.sql.ast.expr.SQLQueryExpr; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableAlterColumn; +import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.ast.statement.SQLTableSource; @@ -287,7 +289,7 @@ public class PGSQLStatementParser extends SQLStatementParser { stmt.setWith(with); return stmt; } - + if (lexer.token() == Token.DELETE) { PGDeleteStatement stmt = this.parseDeleteStatement(); stmt.setWith(with); @@ -295,4 +297,39 @@ public class PGSQLStatementParser extends SQLStatementParser { } throw new ParserException("TODO"); } + + protected SQLAlterTableAlterColumn parseAlterColumn() { + accept(Token.COLUMN); + + SQLColumnDefinition column = this.exprParser.parseColumn(); + + SQLAlterTableAlterColumn alterColumn = new SQLAlterTableAlterColumn(); + alterColumn.setColumn(column); + + if (column.getDataType() == null && column.getConstraints().size() == 0) { + if (lexer.token() == Token.SET) { + lexer.nextToken(); + if (lexer.token() == Token.NOT) { + lexer.nextToken(); + accept(Token.NULL); + alterColumn.setSetNotNull(true); + } else { + accept(Token.DEFAULT); + SQLExpr defaultValue = this.exprParser.expr(); + alterColumn.setSetDefault(defaultValue); + } + } else if (lexer.token() == Token.DROP) { + lexer.nextToken(); + if (lexer.token() == Token.NOT) { + lexer.nextToken(); + accept(Token.NULL); + alterColumn.setDropNotNull(true); + } else { + accept(Token.DEFAULT); + alterColumn.setDropDefault(true); + } + } + } + return alterColumn; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGEvalVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGEvalVisitor.java index 56d9a5381d..c1f199ddfb 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGEvalVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGEvalVisitor.java @@ -20,6 +20,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLCaseExpr; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; @@ -144,4 +145,9 @@ public class PGEvalVisitor extends PGASTVisitorAdapter implements SQLEvalVisitor public boolean visit(SQLIdentifierExpr x) { return SQLEvalVisitorUtils.visit(this, x); } + + @Override + public boolean visit(SQLBinaryExpr x) { + return SQLEvalVisitorUtils.visit(this, x); + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java index 97119566d4..3c20564650 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java @@ -16,6 +16,7 @@ package com.alibaba.druid.sql.dialect.postgresql.visitor; import com.alibaba.druid.sql.ast.SQLSetQuantifier; +import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr; import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.ast.statement.SQLTruncateStatement; import com.alibaba.druid.sql.dialect.postgresql.ast.PGWithClause; @@ -645,4 +646,13 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor public void endVisit(PGLineSegmentsExpr x) { } + + @Override + public boolean visit(SQLBinaryExpr x) { + print("B'"); + print(x.getValue()); + print('\''); + + return false; + } } 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 e5c3610454..1b45226de4 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -1453,8 +1453,11 @@ public class SQLExprParser extends SQLParser { public SQLColumnDefinition parseColumn() { SQLColumnDefinition column = createColumnDefinition(); column.setName(name()); - column.setDataType(parseDataType()); - + + if(lexer.token() != Token.SET // + && lexer.token() != Token.DROP) { + column.setDataType(parseDataType()); + } return parseColumnRest(column); } @@ -1469,7 +1472,7 @@ public class SQLExprParser extends SQLParser { column.setDefaultExpr(bitOr()); return parseColumnRest(column); } - + if (lexer.token() == Token.NOT) { lexer.nextToken(); accept(Token.NULL); @@ -1698,9 +1701,12 @@ public class SQLExprParser extends SQLParser { fk.setReferencedTableName(this.name()); - accept(Token.LPAREN); - this.names(fk.getReferencedColumns()); - accept(Token.RPAREN); + if (lexer.token() == Token.LPAREN) { + lexer.nextToken(); + this.names(fk.getReferencedColumns(), fk); + accept(Token.RPAREN); + } + return fk; } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index f8d3c86486..322ecbaaf0 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -39,6 +39,7 @@ import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableKeys; import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement; import com.alibaba.druid.sql.ast.statement.SQLAssignItem; import com.alibaba.druid.sql.ast.statement.SQLCallStatement; +import com.alibaba.druid.sql.ast.statement.SQLCheck; import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; import com.alibaba.druid.sql.ast.statement.SQLCommentStatement; import com.alibaba.druid.sql.ast.statement.SQLConstraint; @@ -48,6 +49,9 @@ import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateTriggerStatement; import com.alibaba.druid.sql.ast.statement.SQLCreateTriggerStatement.TriggerEvent; import com.alibaba.druid.sql.ast.statement.SQLCreateTriggerStatement.TriggerType; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableRename; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableRenameColumn; import com.alibaba.druid.sql.ast.statement.SQLCreateViewStatement; import com.alibaba.druid.sql.ast.statement.SQLDeleteStatement; import com.alibaba.druid.sql.ast.statement.SQLDropDatabaseStatement; @@ -743,6 +747,22 @@ public class SQLStatementParser extends SQLParser { } else if (lexer.token() == Token.IDENTIFIER) { SQLAlterTableAddColumn item = parseAlterTableAddColumn(); stmt.getItems().add(item); + } else if (lexer.token() == Token.COLUMN) { + lexer.nextToken(); + SQLAlterTableAddColumn item = parseAlterTableAddColumn(); + stmt.getItems().add(item); + } else if (lexer.token() == Token.CHECK) { + SQLCheck check = this.exprParser.parseCheck(); + SQLAlterTableAddConstraint item = new SQLAlterTableAddConstraint(check); + stmt.getItems().add(item); + } else if (lexer.token() == Token.CONSTRAINT) { + SQLConstraint constraint = this.exprParser.parseConstaint(); + SQLAlterTableAddConstraint item = new SQLAlterTableAddConstraint(constraint); + stmt.getItems().add(item); + } else if (lexer.token() == Token.FOREIGN) { + SQLConstraint constraint = this.exprParser.parseForeignKey(); + SQLAlterTableAddConstraint item = new SQLAlterTableAddConstraint(constraint); + stmt.getItems().add(item); } else { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } @@ -774,10 +794,7 @@ public class SQLStatementParser extends SQLParser { } else if (lexer.token() == Token.ALTER) { lexer.nextToken(); if (lexer.token() == Token.COLUMN) { - lexer.nextToken(); - SQLColumnDefinition column = this.exprParser.parseColumn(); - SQLAlterTableAlterColumn alterColumn = new SQLAlterTableAlterColumn(); - alterColumn.setColumn(column); + SQLAlterTableAlterColumn alterColumn = parseAlterColumn(); stmt.getItems().add(alterColumn); } else { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); @@ -792,6 +809,8 @@ public class SQLStatementParser extends SQLParser { addCheck.setWithNoCheck(true); addCheck.setConstraint(check); stmt.getItems().add(addCheck); + } else if (identifierEquals("RENAME")) { + stmt.getItems().add(parseAlterTableRename()); } else { break; } @@ -801,6 +820,37 @@ public class SQLStatementParser extends SQLParser { } throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); } + + protected SQLAlterTableItem parseAlterTableRename() { + acceptIdentifier("RENAME"); + + if (lexer.token() == Token.COLUMN) { + lexer.nextToken(); + SQLAlterTableRenameColumn renameColumn = new SQLAlterTableRenameColumn(); + renameColumn.setColumn(this.exprParser.name()); + accept(Token.TO); + renameColumn.setTo(this.exprParser.name()); + return renameColumn; + } + + if (lexer.token() == Token.TO) { + lexer.nextToken(); + SQLAlterTableRename item = new SQLAlterTableRename(); + item.setTo(this.exprParser.name()); + return item; + } + + throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); + } + + protected SQLAlterTableAlterColumn parseAlterColumn() { + lexer.nextToken(); + SQLColumnDefinition column = this.exprParser.parseColumn(); + + SQLAlterTableAlterColumn alterColumn = new SQLAlterTableAlterColumn(); + alterColumn.setColumn(column); + return alterColumn; + } public void parseAlterDrop(SQLAlterTableStatement stmt) { lexer.nextToken(); @@ -814,6 +864,12 @@ public class SQLStatementParser extends SQLParser { lexer.nextToken(); SQLAlterTableDropColumnItem item = new SQLAlterTableDropColumnItem(); this.exprParser.names(item.getColumns()); + + if(lexer.token == Token.CASCADE) { + item.setCascade(true); + lexer.nextToken(); + } + stmt.getItems().add(item); } else { throw new ParserException("TODO " + lexer.token() + " " + lexer.stringVal()); diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 0ca7eab854..d400b717bd 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -39,6 +39,7 @@ import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; import com.alibaba.druid.sql.ast.expr.SQLAllExpr; import com.alibaba.druid.sql.ast.expr.SQLAnyExpr; import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; +import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr; @@ -80,6 +81,7 @@ import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropPrimaryKey; import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableKeys; import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableRename; import com.alibaba.druid.sql.ast.statement.SQLAlterTableRenameColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement; import com.alibaba.druid.sql.ast.statement.SQLAssignItem; @@ -1391,6 +1393,10 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab public boolean visit(SQLAlterTableDropColumnItem x) { print("DROP COLUMN "); this.printAndAccept(x.getColumns(), ", "); + + if (x.isCascade()) { + print(" CASCADE"); + } return false; } @@ -1576,6 +1582,21 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab public boolean visit(SQLAlterTableAlterColumn x) { print("ALTER COLUMN "); x.getColumn().accept(this); + + if (x.isSetNotNull()) { // postgresql + print(" SET NOT NULL"); + } + if (x.isDropNotNull()) { // postgresql + print(" DROP NOT NULL"); + } + if (x.getSetDefault() != null) { // postgresql + print(" SET DEFAULT "); + x.getSetDefault().accept(this); + } + if (x.isDropDefault()) { // postgresql + print(" DROP DEFAULT"); + } + return false; } @@ -1746,9 +1767,11 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab print(" REFERENCES "); x.getReferencedTableName().accept(this); - print(" ("); - printAndAccept(x.getReferencedColumns(), ", "); - print(")"); + if (x.getReferencedColumns().size() > 0) { + print(" ("); + printAndAccept(x.getReferencedColumns(), ", "); + print(")"); + } return false; } @@ -2073,4 +2096,20 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Printab return false; } + + @Override + public boolean visit(SQLBinaryExpr x) { + print("b'"); + print(x.getValue()); + print('\''); + + return false; + } + + @Override + public boolean visit(SQLAlterTableRename x) { + print("RENAME TO "); + x.getTo().accept(this); + 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 37c257dd2d..6063f3d081 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java @@ -25,6 +25,7 @@ import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; import com.alibaba.druid.sql.ast.expr.SQLAllExpr; import com.alibaba.druid.sql.ast.expr.SQLAnyExpr; import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; +import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr; import com.alibaba.druid.sql.ast.expr.SQLCaseExpr; @@ -64,6 +65,7 @@ import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropIndex; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropPrimaryKey; import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableKeys; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableRename; import com.alibaba.druid.sql.ast.statement.SQLAlterTableRenameColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement; import com.alibaba.druid.sql.ast.statement.SQLAssignItem; @@ -555,4 +557,12 @@ public interface SQLASTVisitor { boolean visit(SQLRevokeStatement x); + void endVisit(SQLBinaryExpr x); + + boolean visit(SQLBinaryExpr x); + + void endVisit(SQLAlterTableRename x); + + boolean visit(SQLAlterTableRename 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 1330a141f5..1eb4cb9532 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java @@ -26,6 +26,7 @@ import com.alibaba.druid.sql.ast.expr.SQLAllColumnExpr; import com.alibaba.druid.sql.ast.expr.SQLAllExpr; import com.alibaba.druid.sql.ast.expr.SQLAnyExpr; import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; +import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr; import com.alibaba.druid.sql.ast.expr.SQLCaseExpr; @@ -65,6 +66,7 @@ import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropIndex; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropPrimaryKey; import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableKeys; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableRename; import com.alibaba.druid.sql.ast.statement.SQLAlterTableRenameColumn; import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement; import com.alibaba.druid.sql.ast.statement.SQLAssignItem; @@ -1086,4 +1088,24 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { return true; } + @Override + public void endVisit(SQLBinaryExpr x) { + + } + + @Override + public boolean visit(SQLBinaryExpr x) { + return true; + } + + @Override + public void endVisit(SQLAlterTableRename x) { + + } + + @Override + public boolean visit(SQLAlterTableRename x) { + return true; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorImpl.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorImpl.java index 85cf887c83..702dd571aa 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorImpl.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorImpl.java @@ -20,6 +20,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr; import com.alibaba.druid.sql.ast.expr.SQLCaseExpr; @@ -151,4 +152,8 @@ public class SQLEvalVisitorImpl extends SQLASTVisitorAdapter implements SQLEvalV return false; } + @Override + public boolean visit(SQLBinaryExpr x) { + return SQLEvalVisitorUtils.visit(this, x); + } } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java index 2101fc8d16..534fda7ef9 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLEvalVisitorUtils.java @@ -19,6 +19,7 @@ import com.alibaba.druid.DruidRuntimeException; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLObject; +import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr; import com.alibaba.druid.sql.ast.expr.SQLBetweenExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; @@ -39,7 +40,6 @@ import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.ast.statement.SQLSelectItem; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.dialect.db2.visitor.DB2EvalVisitor; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlEvalVisitorImpl; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleEvalVisitor; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGEvalVisitor; @@ -582,7 +582,7 @@ public class SQLEvalVisitorUtils { return true; } - public static boolean visit(SQLEvalVisitor visitor, MySqlBinaryExpr x) { + public static boolean visit(SQLEvalVisitor visitor, SQLBinaryExpr x) { String text = x.getValue(); long[] words = new long[text.length() / 64 + 1]; 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 33e64ea3b4..a34dd15682 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -45,6 +45,7 @@ import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableDropForeignKey; import com.alibaba.druid.sql.ast.statement.SQLAlterTableEnableConstraint; import com.alibaba.druid.sql.ast.statement.SQLAlterTableItem; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableRename; import com.alibaba.druid.sql.ast.statement.SQLAlterTableStatement; import com.alibaba.druid.sql.ast.statement.SQLCallStatement; import com.alibaba.druid.sql.ast.statement.SQLCheck; @@ -1269,7 +1270,7 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { @Override public boolean visit(SQLForeignKeyImpl x) { - for (SQLName column : x.getReferencedColumns()) { + for (SQLName column : x.getReferencingColumns()) { column.accept(this); } @@ -1350,4 +1351,9 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { public boolean visit(SQLDropProcedureStatement x) { return false; } + + @Override + public boolean visit(SQLAlterTableRename x) { + return false; + } } diff --git a/src/main/resources/META-INF/druid/wall/postgres/deny-function.txt b/src/main/resources/META-INF/druid/wall/postgres/deny-function.txt index 86c0b86ef5..06e46c2947 100644 --- a/src/main/resources/META-INF/druid/wall/postgres/deny-function.txt +++ b/src/main/resources/META-INF/druid/wall/postgres/deny-function.txt @@ -20,4 +20,7 @@ user version pg_sleep pg_sleep_for -pg_sleep_until \ No newline at end of file +pg_sleep_until +current_setting +set_config + diff --git a/src/test/java/com/alibaba/druid/bvt/pool/AsyncCloseTest2.java b/src/test/java/com/alibaba/druid/bvt/pool/AsyncCloseTest2.java index 20a5414522..de38aaf1be 100644 --- a/src/test/java/com/alibaba/druid/bvt/pool/AsyncCloseTest2.java +++ b/src/test/java/com/alibaba/druid/bvt/pool/AsyncCloseTest2.java @@ -142,6 +142,6 @@ public class AsyncCloseTest2 extends TestCase { } closeLatch.await(); - Assert.assertEquals(0, dataSource.getActiveCount()); + Assert.assertEquals("expect activeCount zero", 0, dataSource.getActiveCount()); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_binary.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_binary.java index 67c45272c7..7fc5085ed2 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_binary.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_binary.java @@ -4,7 +4,7 @@ import junit.framework.TestCase; import org.junit.Assert; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr; +import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr; import com.alibaba.druid.sql.dialect.mysql.parser.MySqlExprParser; import com.alibaba.druid.sql.parser.SQLExprParser; @@ -13,18 +13,18 @@ public class EqualTest_binary extends TestCase { public void test_exits() throws Exception { String sql = "b'01010'"; String sql_c = "b'010101'"; - MySqlBinaryExpr exprA, exprB, exprC; + SQLBinaryExpr exprA, exprB, exprC; { SQLExprParser parser = new MySqlExprParser(sql); - exprA = (MySqlBinaryExpr) parser.expr(); + exprA = (SQLBinaryExpr) parser.expr(); } { SQLExprParser parser = new MySqlExprParser(sql); - exprB = (MySqlBinaryExpr) parser.expr(); + exprB = (SQLBinaryExpr) parser.expr(); } { SQLExprParser parser = new MySqlExprParser(sql_c); - exprC = (MySqlBinaryExpr) parser.expr(); + exprC = (SQLBinaryExpr) parser.expr(); } Assert.assertEquals(exprA, exprB); Assert.assertNotEquals(exprA, exprC); @@ -32,7 +32,7 @@ public class EqualTest_binary extends TestCase { Assert.assertFalse(exprA.equals(new Object())); Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); - Assert.assertEquals(new MySqlBinaryExpr(), new MySqlBinaryExpr()); - Assert.assertEquals(new MySqlBinaryExpr().hashCode(), new MySqlBinaryExpr().hashCode()); + Assert.assertEquals(new SQLBinaryExpr(), new SQLBinaryExpr()); + Assert.assertEquals(new SQLBinaryExpr().hashCode(), new SQLBinaryExpr().hashCode()); } } 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 0ff4606c99..b63ece3a02 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 @@ -2,6 +2,7 @@ package com.alibaba.druid.bvt.sql.mysql; import junit.framework.TestCase; +import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr; import com.alibaba.druid.sql.ast.expr.SQLBooleanExpr; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlForceIndexHint; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlIgnoreIndexHint; @@ -9,7 +10,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.MySqlKey; 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.MySqlUseIndexHint; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlBinaryExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr; @@ -107,7 +107,7 @@ public class MySqlASTVisitorAdapterTest extends TestCase { new MySqlKey().accept(adapter); new MySqlPrimaryKey().accept(adapter); new MySqlIntervalExpr().accept(adapter); - new MySqlBinaryExpr().accept(adapter); + new SQLBinaryExpr().accept(adapter); new MySqlPrepareStatement().accept(adapter); new MySqlExecuteStatement().accept(adapter); new MySqlDeleteStatement().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 e2c5f4b99b..d90156cf03 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 @@ -49,6 +49,6 @@ public class MySqlAlterTableTest_addFk extends TestCase { output); Assert.assertEquals(2, visitor.getTables().size()); - Assert.assertEquals(3, visitor.getColumns().size()); + Assert.assertEquals(2, visitor.getColumns().size()); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest48.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest48.java index f1e790eea8..b9e5779108 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest48.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlCreateTableTest48.java @@ -48,7 +48,7 @@ public class MySqlCreateTableTest48 extends MysqlTest { System.out.println("orderBy : " + visitor.getOrderByColumns()); Assert.assertEquals(3, visitor.getTables().size()); - Assert.assertEquals(5, visitor.getColumns().size()); + Assert.assertEquals(6, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getConditions().size()); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("AO_E8B6CC_REPO_TO_CHANGESET"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java index e6ea0f41ef..8487935e21 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/visitor/OracleASTVisitorAdapterTest.java @@ -3,6 +3,7 @@ package com.alibaba.druid.bvt.sql.oracle.visitor; import junit.framework.TestCase; import com.alibaba.druid.sql.ast.expr.SQLTimestampExpr; +import com.alibaba.druid.sql.ast.statement.SQLAlterTableRename; import com.alibaba.druid.sql.ast.statement.SQLDropSequenceStatement; import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay; import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear; @@ -53,7 +54,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableAddConstain 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; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableRenameTo; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableSplitPartition; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleAlterTableTruncatePartition; @@ -210,7 +210,7 @@ public class OracleASTVisitorAdapterTest extends TestCase { new OracleAlterTableAddConstaint().accept(adapter); new OraclePrimaryKey().accept(adapter); new OracleCreateTableStatement().accept(adapter); - new OracleAlterTableRenameTo().accept(adapter); + new SQLAlterTableRename().accept(adapter); new OracleStorageClause().accept(adapter); new OracleGotoStatement().accept(adapter); new OracleLabelStatement().accept(adapter); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/datatypes/BitStringTest.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/datatypes/BitStringTest.java new file mode 100644 index 0000000000..b84653a557 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/datatypes/BitStringTest.java @@ -0,0 +1,20 @@ +package com.alibaba.druid.bvt.sql.postgresql.datatypes; + +import org.junit.Assert; + +import com.alibaba.druid.sql.PGTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr; +import com.alibaba.druid.sql.dialect.postgresql.parser.PGExprParser; +import com.alibaba.druid.util.JdbcConstants; + +public class BitStringTest extends PGTest { + + public void test_timestamp() throws Exception { + String sql = "B'101'"; + PGExprParser parser = new PGExprParser(sql); + SQLBinaryExpr expr = (SQLBinaryExpr) parser.expr(); + Assert.assertEquals("B'101'", SQLUtils.toSQLString(expr, JdbcConstants.POSTGRESQL)); + } + +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableAddCheck0.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableAddCheck0.java new file mode 100644 index 0000000000..f2440c63c1 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableAddCheck0.java @@ -0,0 +1,38 @@ +package com.alibaba.druid.bvt.sql.postgresql.ddl; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.PGTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + + +public class PGAlterTableAddCheck0 extends PGTest { + public void test_0 () throws Exception { + String sql = "ALTER TABLE products ADD CHECK (name <> '');"; + + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("products"))); + + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getDropCount() == 0); + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getAlterCount() == 1); + + Assert.assertTrue(visitor.getColumns().size() == 1); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableAddColumnTest0.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableAddColumnTest0.java new file mode 100644 index 0000000000..ef76e645e1 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableAddColumnTest0.java @@ -0,0 +1,38 @@ +package com.alibaba.druid.bvt.sql.postgresql.ddl; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.PGTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + + +public class PGAlterTableAddColumnTest0 extends PGTest { + public void test_0 () throws Exception { + String sql = "ALTER TABLE products ADD COLUMN description text;"; + + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("products"))); + + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getDropCount() == 0); + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getAlterCount() == 1); + + Assert.assertTrue(visitor.getColumns().size() == 1); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableAddColumnTest1.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableAddColumnTest1.java new file mode 100644 index 0000000000..951e22a964 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableAddColumnTest1.java @@ -0,0 +1,38 @@ +package com.alibaba.druid.bvt.sql.postgresql.ddl; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.PGTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + + +public class PGAlterTableAddColumnTest1 extends PGTest { + public void test_0 () throws Exception { + String sql = "ALTER TABLE products ADD COLUMN description text CHECK (description <> '');"; + + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("products"))); + + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getDropCount() == 0); + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getAlterCount() == 1); + + Assert.assertTrue(visitor.getColumns().size() == 1); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableAddFk0.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableAddFk0.java new file mode 100644 index 0000000000..931dbf36e0 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableAddFk0.java @@ -0,0 +1,38 @@ +package com.alibaba.druid.bvt.sql.postgresql.ddl; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.PGTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + + +public class PGAlterTableAddFk0 extends PGTest { + public void test_0 () throws Exception { + String sql = "ALTER TABLE products ADD FOREIGN KEY (product_group_id) REFERENCES product_groups;"; + + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("products"))); + + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getDropCount() == 0); + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getAlterCount() == 1); + + Assert.assertTrue(visitor.getColumns().size() == 1); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableAddUnique0.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableAddUnique0.java new file mode 100644 index 0000000000..222a048c78 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableAddUnique0.java @@ -0,0 +1,38 @@ +package com.alibaba.druid.bvt.sql.postgresql.ddl; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.PGTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + + +public class PGAlterTableAddUnique0 extends PGTest { + public void test_0 () throws Exception { + String sql = "ALTER TABLE products ADD CONSTRAINT some_name UNIQUE (product_no);"; + + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("products"))); + + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getDropCount() == 0); + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getAlterCount() == 1); + + Assert.assertTrue(visitor.getColumns().size() == 1); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableDropColumnTest0.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableDropColumnTest0.java new file mode 100644 index 0000000000..eaff062070 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableDropColumnTest0.java @@ -0,0 +1,38 @@ +package com.alibaba.druid.bvt.sql.postgresql.ddl; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.PGTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + + +public class PGAlterTableDropColumnTest0 extends PGTest { + public void test_0 () throws Exception { + String sql = "ALTER TABLE products DROP COLUMN description;"; + + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("products"))); + + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getDropCount() == 0); + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getAlterCount() == 1); + + Assert.assertTrue(visitor.getColumns().size() == 1); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableDropColumnTest1.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableDropColumnTest1.java new file mode 100644 index 0000000000..31aa38c15a --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableDropColumnTest1.java @@ -0,0 +1,38 @@ +package com.alibaba.druid.bvt.sql.postgresql.ddl; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.PGTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + + +public class PGAlterTableDropColumnTest1 extends PGTest { + public void test_0 () throws Exception { + String sql = "ALTER TABLE products DROP COLUMN description CASCADE;"; + + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("products"))); + + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getDropCount() == 0); + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getAlterCount() == 1); + + Assert.assertTrue(visitor.getColumns().size() == 1); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableDropConstraint.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableDropConstraint.java new file mode 100644 index 0000000000..ec66543607 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableDropConstraint.java @@ -0,0 +1,38 @@ +package com.alibaba.druid.bvt.sql.postgresql.ddl; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.PGTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + + +public class PGAlterTableDropConstraint extends PGTest { + public void test_0 () throws Exception { + String sql = "ALTER TABLE products DROP CONSTRAINT some_name;"; + + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("products"))); + + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getDropCount() == 0); + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getAlterCount() == 1); + + Assert.assertTrue(visitor.getColumns().size() == 0); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableDropDefault.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableDropDefault.java new file mode 100644 index 0000000000..0a8e604581 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableDropDefault.java @@ -0,0 +1,41 @@ +package com.alibaba.druid.bvt.sql.postgresql.ddl; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.PGTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + + +public class PGAlterTableDropDefault extends PGTest { + public void test_0 () throws Exception { + String sql = "ALTER TABLE products ALTER COLUMN price DROP DEFAULT;"; + + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals("ALTER TABLE products" + + "\n\tALTER COLUMN price DROP DEFAULT", stmt.toString()); + + Assert.assertEquals(1, statementList.size()); + + PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("products"))); + + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getDropCount() == 0); + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getAlterCount() == 1); + + Assert.assertTrue(visitor.getColumns().size() == 1); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableDropNotNull.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableDropNotNull.java new file mode 100644 index 0000000000..9e410f6223 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableDropNotNull.java @@ -0,0 +1,41 @@ +package com.alibaba.druid.bvt.sql.postgresql.ddl; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.PGTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + + +public class PGAlterTableDropNotNull extends PGTest { + public void test_0 () throws Exception { + String sql = "ALTER TABLE products ALTER COLUMN product_no DROP NOT NULL;"; + + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals("ALTER TABLE products" + + "\n\tALTER COLUMN product_no DROP NOT NULL", stmt.toString()); + + Assert.assertEquals(1, statementList.size()); + + PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("products"))); + + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getDropCount() == 0); + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getAlterCount() == 1); + + Assert.assertTrue(visitor.getColumns().size() == 1); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableRenameTest.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableRenameTest.java new file mode 100644 index 0000000000..d17c0af69d --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableRenameTest.java @@ -0,0 +1,38 @@ +package com.alibaba.druid.bvt.sql.postgresql.ddl; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.PGTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + + +public class PGAlterTableRenameTest extends PGTest { + public void test_0 () throws Exception { + String sql = "ALTER TABLE products RENAME TO items;"; + + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("products"))); + + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getDropCount() == 0); + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getAlterCount() == 1); + + Assert.assertTrue(visitor.getColumns().size() == 0); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableRenameTest1.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableRenameTest1.java new file mode 100644 index 0000000000..dbdc65db34 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableRenameTest1.java @@ -0,0 +1,38 @@ +package com.alibaba.druid.bvt.sql.postgresql.ddl; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.PGTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + + +public class PGAlterTableRenameTest1 extends PGTest { + public void test_0 () throws Exception { + String sql = "ALTER TABLE products RENAME COLUMN product_no TO product_number;"; + + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement statemen = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); + statemen.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("products"))); + + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getDropCount() == 0); + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getAlterCount() == 1); + + Assert.assertTrue(visitor.getColumns().size() == 2); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableSetDefault.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableSetDefault.java new file mode 100644 index 0000000000..73763811f3 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableSetDefault.java @@ -0,0 +1,41 @@ +package com.alibaba.druid.bvt.sql.postgresql.ddl; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.PGTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + + +public class PGAlterTableSetDefault extends PGTest { + public void test_0 () throws Exception { + String sql = "ALTER TABLE products ALTER COLUMN price SET DEFAULT 7.77;"; + + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals("ALTER TABLE products" + + "\n\tALTER COLUMN price SET DEFAULT 7.77", stmt.toString()); + + Assert.assertEquals(1, statementList.size()); + + PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("products"))); + + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getDropCount() == 0); + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getAlterCount() == 1); + + Assert.assertTrue(visitor.getColumns().size() == 1); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableSetNotNull.java b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableSetNotNull.java new file mode 100644 index 0000000000..096d41bd1e --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/postgresql/ddl/PGAlterTableSetNotNull.java @@ -0,0 +1,41 @@ +package com.alibaba.druid.bvt.sql.postgresql.ddl; + +import java.util.List; + +import org.junit.Assert; + +import com.alibaba.druid.sql.PGTest; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.postgresql.parser.PGSQLStatementParser; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; + + +public class PGAlterTableSetNotNull extends PGTest { + public void test_0 () throws Exception { + String sql = "ALTER TABLE products ALTER COLUMN product_no SET NOT NULL;"; + + PGSQLStatementParser parser = new PGSQLStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals("ALTER TABLE products" + + "\n\tALTER COLUMN product_no SET NOT NULL", stmt.toString()); + + Assert.assertEquals(1, statementList.size()); + + PGSchemaStatVisitor visitor = new PGSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + + Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("products"))); + + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getDropCount() == 0); + Assert.assertTrue(visitor.getTables().get(new TableStat.Name("products")).getAlterCount() == 1); + + Assert.assertTrue(visitor.getColumns().size() == 1); + } +}