From 4ea81bca6984f073c420280ff09dcf535dbc460f Mon Sep 17 00:00:00 2001 From: wenshao Date: Fri, 2 Jun 2017 15:47:57 +0800 Subject: [PATCH] refactor sql parser. --- .../com/alibaba/druid/sql/PagerUtils.java | 1 - .../java/com/alibaba/druid/sql/SQLUtils.java | 2 +- .../alibaba/druid/sql/ast/SQLCommentHint.java | 4 + .../com/alibaba/druid/sql/ast/SQLKeep.java | 13 ++ .../com/alibaba/druid/sql/ast/SQLLimit.java | 4 + .../com/alibaba/druid/sql/ast/SQLObject.java | 2 + .../alibaba/druid/sql/ast/SQLObjectImpl.java | 5 + .../com/alibaba/druid/sql/ast/SQLOrderBy.java | 4 + .../com/alibaba/druid/sql/ast/SQLOver.java | 41 +++++- .../druid/sql/ast/expr/SQLAggregateExpr.java | 25 ++++ .../sql/ast/expr/SQLMethodInvokeExpr.java | 20 +++ .../druid/sql/ast/expr/SQLPropertyExpr.java | 4 + .../sql/ast/statement/SQLExprTableSource.java | 39 +++++ .../sql/ast/statement/SQLJoinTableSource.java | 7 + .../druid/sql/ast/statement/SQLSelect.java | 104 ++++++++++++-- .../ast/statement/SQLSelectGroupByClause.java | 4 + .../sql/ast/statement/SQLSelectItem.java | 9 ++ .../ast/statement/SQLSelectQueryBlock.java | 68 +++++++++ .../ast/statement/SQLSubqueryTableSource.java | 12 ++ .../sql/ast/statement/SQLTableSource.java | 2 + .../sql/ast/statement/SQLTableSourceImpl.java | 5 + .../builder/impl/SQLSelectBuilderImpl.java | 9 -- .../oracle/ast/OracleSQLObjectImpl.java | 2 +- .../ast/clause/FlashbackQueryClause.java | 5 + .../oracle/ast/clause/ModelClause.java | 4 + .../ast/clause/PartitionExtensionClause.java | 17 +++ .../oracle/ast/clause/SampleClause.java | 17 +++ .../oracle/ast/expr/OracleAnalytic.java | 12 ++ .../ast/expr/OracleAnalyticWindowing.java | 2 +- .../oracle/ast/expr/OracleArgumentExpr.java | 10 ++ .../oracle/ast/expr/OracleDatetimeExpr.java | 14 ++ .../oracle/ast/expr/OracleRangeExpr.java | 14 ++ .../oracle/ast/expr/OracleSizeExpr.java | 11 ++ .../oracle/ast/expr/OracleSysdateExpr.java | 6 + .../dialect/oracle/ast/stmt/OracleSelect.java | 64 --------- .../ast/stmt/OracleSelectPivotBase.java | 5 + .../ast/stmt/OracleSelectQueryBlock.java | 34 ++++- .../ast/stmt/OracleSelectTableReference.java | 27 ++++ .../parser/OracleCreateTableParser.java | 4 +- .../oracle/parser/OracleExprParser.java | 26 ++-- .../oracle/parser/OracleSelectParser.java | 7 +- .../oracle/visitor/OracleASTVisitor.java | 4 - .../visitor/OracleASTVisitorAdapter.java | 7 - .../oracle/visitor/OracleOutputVisitor.java | 13 -- .../visitor/OracleSchemaStatVisitor.java | 8 -- .../sqlserver/ast/SQLServerSelect.java | 133 ------------------ .../parser/SQLServerSelectParser.java | 3 +- .../visitor/SQLServerASTVisitor.java | 5 - .../visitor/SQLServerASTVisitorAdapter.java | 11 -- .../visitor/SQLServerOutputVisitor.java | 9 +- .../visitor/SQLServerSchemaStatVisitor.java | 11 -- .../sql/visitor/SQLASTOutputVisitor.java | 28 +++- .../bvt/sql/PagerUtilsTest_Count_MySql_0.java | 26 ++-- .../sql/PagerUtilsTest_Count_Oracle_0.java | 26 ++-- .../bvt/sql/PagerUtilsTest_Count_PG_0.java | 26 ++-- .../sql/PagerUtilsTest_Count_SQLServer_0.java | 26 ++-- .../sql/PagerUtilsTest_Limit_SQLServer_1.java | 24 ++-- .../sql/PagerUtilsTest_Limit_SQLServer_2.java | 15 +- .../sql/PagerUtilsTest_Limit_SQLServer_4.java | 15 +- .../bvt/sql/PagerUtilsTest_Limit_db2_0.java | 41 +++--- .../bvt/sql/PagerUtilsTest_Limit_db2_1.java | 24 ++-- .../sql/PagerUtilsTest_Limit_oracle_0.java | 69 +++++---- .../druid/bvt/sql/db2/DB2SelectTest_10.java | 48 ++++--- .../druid/bvt/sql/db2/DB2SelectTest_5.java | 26 ++-- .../druid/bvt/sql/mysql/CobarHintsTest.java | 20 +-- .../bvt/sql/mysql/MySqlDeleteTest_3.java | 70 ++++----- .../bvt/sql/mysql/SELECT_Syntax_Test.java | 21 ++- ...ySqlParameterizedOutputVisitorTest_22.java | 10 +- .../sql/mysql/select/MySqlSelectTest_12.java | 13 +- .../bvt/sql/oracle/OracleMergeTest8.java | 33 ++--- .../sqlserver/SQLServerRowNumberTest2.java | 52 +++---- .../sql/sqlserver/SQLServerSelectTest12.java | 13 +- .../sql/sqlserver/SQLServerSelectTest13.java | 33 ++--- .../sql/sqlserver/SQLServerSelectTest14.java | 39 +++-- .../sql/sqlserver/SQLServerSelectTest2.java | 13 +- .../sql/sqlserver/SQLServerUpdateTest.java | 21 +-- src/test/resources/bvt/parser/mysql-3.txt | 5 +- src/test/resources/bvt/parser/mysql-8.txt | 12 +- 78 files changed, 965 insertions(+), 653 deletions(-) delete mode 100644 src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelect.java delete mode 100644 src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/SQLServerSelect.java diff --git a/src/main/java/com/alibaba/druid/sql/PagerUtils.java b/src/main/java/com/alibaba/druid/sql/PagerUtils.java index 208b2f56d1..9e53e1a601 100644 --- a/src/main/java/com/alibaba/druid/sql/PagerUtils.java +++ b/src/main/java/com/alibaba/druid/sql/PagerUtils.java @@ -26,7 +26,6 @@ import com.alibaba.druid.sql.dialect.db2.ast.stmt.DB2SelectQueryBlock; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitorAdapter; import com.alibaba.druid.sql.dialect.odps.ast.OdpsSelectQueryBlock; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitorAdapter; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock; diff --git a/src/main/java/com/alibaba/druid/sql/SQLUtils.java b/src/main/java/com/alibaba/druid/sql/SQLUtils.java index 3fd2c6cd86..e8154b74c7 100644 --- a/src/main/java/com/alibaba/druid/sql/SQLUtils.java +++ b/src/main/java/com/alibaba/druid/sql/SQLUtils.java @@ -745,7 +745,7 @@ public class SQLUtils { switch (op){ case Equality: - notOp = SQLBinaryOperator.LessThanOrEqualOrGreaterThan; + notOp = SQLBinaryOperator.LessThanOrGreater; break; case LessThanOrEqualOrGreaterThan: notOp = SQLBinaryOperator.Equality; diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLCommentHint.java b/src/main/java/com/alibaba/druid/sql/ast/SQLCommentHint.java index cc7d78fce2..b5f7c24867 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLCommentHint.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLCommentHint.java @@ -42,4 +42,8 @@ public class SQLCommentHint extends SQLObjectImpl implements SQLHint { visitor.visit(this); visitor.endVisit(this); } + + public SQLCommentHint clone() { + return new SQLCommentHint(text); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLKeep.java b/src/main/java/com/alibaba/druid/sql/ast/SQLKeep.java index 54c267c18f..920b940326 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLKeep.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLKeep.java @@ -50,6 +50,19 @@ public class SQLKeep extends SQLObjectImpl { this.orderBy = orderBy; } + + public SQLKeep clone() { + SQLKeep x = new SQLKeep(); + + x.denseRank = denseRank; + + if (orderBy != null) { + x.setOrderBy(orderBy.clone()); + } + + return x; + } + public static enum DenseRank { FIRST, // LAST diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLLimit.java b/src/main/java/com/alibaba/druid/sql/ast/SQLLimit.java index a63cbdba92..7d1442984b 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLLimit.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLLimit.java @@ -70,4 +70,8 @@ public class SQLLimit extends SQLObjectImpl { visitor.endVisit(this); } + public SQLLimit clone() { + throw new UnsupportedOperationException(); + } + } diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLObject.java b/src/main/java/com/alibaba/druid/sql/ast/SQLObject.java index 15d8cd9f41..620ecfab14 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLObject.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLObject.java @@ -52,4 +52,6 @@ public interface SQLObject { boolean hasAfterComment(); void output(StringBuffer buf); + + SQLObject clone(); } diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLObjectImpl.java b/src/main/java/com/alibaba/druid/sql/ast/SQLObjectImpl.java index da3a314e17..8b69a74b23 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLObjectImpl.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLObjectImpl.java @@ -20,6 +20,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObject; import com.alibaba.druid.sql.visitor.SQLASTVisitor; public abstract class SQLObjectImpl implements SQLObject { @@ -206,4 +207,8 @@ public abstract class SQLObjectImpl implements SQLObject { return !comments.isEmpty(); } + + public SQLObject clone() { + throw new UnsupportedOperationException(); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLOrderBy.java b/src/main/java/com/alibaba/druid/sql/ast/SQLOrderBy.java index c9a33db884..2a65db9425 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLOrderBy.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLOrderBy.java @@ -96,4 +96,8 @@ public class SQLOrderBy extends SQLObjectImpl { protected SQLSelectOrderByItem createItem() { return new SQLSelectOrderByItem(); } + + public SQLOrderBy clone() { + throw new UnsupportedOperationException(); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLOver.java b/src/main/java/com/alibaba/druid/sql/ast/SQLOver.java index 60addd4546..51c8867c59 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLOver.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLOver.java @@ -208,8 +208,45 @@ public class SQLOver extends SQLObjectImpl { return result; } - public SQLExpr clone() { - throw new UnsupportedOperationException(); + public void cloneTo(SQLOver x) { + for (SQLExpr item : partitionBy) { + SQLExpr item1 = item.clone(); + item1.setParent(x); + x.partitionBy.add(item); + } + + if (orderBy != null) { + x.setOrderBy(orderBy.clone()); + } + + if (of != null) { + x.setOf(of.clone()); + } + + if (windowing != null) { + x.setWindowing(windowing.clone()); + } + x.windowingType = windowingType; + x.windowingPreceding = windowingPreceding; + x.windowingFollowing = windowingFollowing; + + if (windowingBetweenBegin != null) { + x.setWindowingBetweenBegin(windowingBetweenBegin.clone()); + } + x.windowingBetweenBeginPreceding = windowingBetweenBeginPreceding; + x.windowingBetweenBeginFollowing = windowingBetweenBeginFollowing; + + if (windowingBetweenEnd != null) { + x.setWindowingBetweenEnd(windowingBetweenEnd.clone()); + } + x.windowingBetweenEndPreceding = windowingBetweenEndPreceding; + x.windowingBetweenEndFollowing = windowingBetweenEndFollowing; + } + + public SQLOver clone() { + SQLOver x = new SQLOver(); + cloneTo(x); + return x; } public static enum WindowingType { diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java index 36b7ddce8d..493f10ed9a 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAggregateExpr.java @@ -176,4 +176,29 @@ public class SQLAggregateExpr extends SQLExprImpl implements Serializable { return true; } + public SQLAggregateExpr clone() { + SQLAggregateExpr x = new SQLAggregateExpr(methodName); + + x.option = option; + + for (SQLExpr arg : arguments) { + x.addArgument(arg.clone()); + } + + if (keep != null) { + x.setKeep(keep.clone()); + } + + if (over != null) { + x.setOver(over.clone()); + } + + if (withinGroup != null) { + x.setWithinGroup(withinGroup.clone()); + } + + x.ignoreNulls = ignoreNulls; + + return x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLMethodInvokeExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLMethodInvokeExpr.java index b5cd6b78ca..3ab91ff154 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLMethodInvokeExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLMethodInvokeExpr.java @@ -144,4 +144,24 @@ public class SQLMethodInvokeExpr extends SQLExprImpl implements Serializable { result = 31 * result + (from != null ? from.hashCode() : 0); return result; } + + public SQLMethodInvokeExpr clone() { + SQLMethodInvokeExpr x = new SQLMethodInvokeExpr(); + + x.methodName = methodName; + + if (owner != null) { + x.setOwner(owner.clone()); + } + + for (SQLExpr param : parameters) { + x.addParameter(param.clone()); + } + + if (from != null) { + x.setFrom(from.clone()); + } + + return x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLPropertyExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLPropertyExpr.java index 34b03dd676..dcb990efd3 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLPropertyExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLPropertyExpr.java @@ -26,6 +26,10 @@ public class SQLPropertyExpr extends SQLExprImpl implements SQLName { private SQLExpr owner; private String name; + public SQLPropertyExpr(String owner, String name){ + this(new SQLIdentifierExpr(owner), name); + } + public SQLPropertyExpr(SQLExpr owner, String name){ setOwner(owner); this.name = name; diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExprTableSource.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExprTableSource.java index b002c474f9..93b3a10e7b 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExprTableSource.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExprTableSource.java @@ -107,4 +107,43 @@ public class SQLExprTableSource extends SQLTableSourceImpl { result = 31 * result + (partitions != null ? partitions.hashCode() : 0); return result; } + + public String computeAlias() { + String alias = this.getAlias(); + + if (alias == null) { + if (expr instanceof SQLName) { + alias =((SQLName) expr).getSimpleName(); + } + } + + if (alias.length() > 2) { + char c0 = alias.charAt(0); + char x0 = alias.charAt(alias.length() - 1); + if ((c0 == '"' && x0 == '"') || (c0 == '`' && x0 == '`')) { + alias = alias.substring(1, alias.length() - 1); + } + } + + return alias; + } + + public SQLExprTableSource clone() { + SQLExprTableSource x = new SQLExprTableSource(); + cloneTo(x); + return x; + } + + public void cloneTo(SQLExprTableSource x) { + if (expr != null) { + x.expr = expr.clone(); + } + + if (partitions != null) { + for (SQLName p : partitions) { + SQLName p1 = p.clone(); + x.addPartition(p1); + } + } + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLJoinTableSource.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLJoinTableSource.java index 881c091019..1a3bb06d3b 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLJoinTableSource.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLJoinTableSource.java @@ -40,6 +40,13 @@ public class SQLJoinTableSource extends SQLTableSourceImpl { } + public SQLJoinTableSource(SQLTableSource left, JoinType joinType, SQLTableSource right, SQLExpr condition){ + this.setLeft(left); + this.setJoinType(joinType); + this.setRight(right); + this.setCondition(condition); + } + protected void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, this.left); diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelect.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelect.java index 43f7fb9601..2d288950d6 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelect.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelect.java @@ -19,11 +19,7 @@ import java.util.ArrayList; import java.util.List; import com.alibaba.druid.sql.SQLUtils; -import com.alibaba.druid.sql.ast.SQLHint; -import com.alibaba.druid.sql.ast.SQLObject; -import com.alibaba.druid.sql.ast.SQLObjectImpl; -import com.alibaba.druid.sql.ast.SQLOrderBy; -import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLSelect extends SQLObjectImpl { @@ -32,7 +28,16 @@ public class SQLSelect extends SQLObjectImpl { protected SQLSelectQuery query; protected SQLOrderBy orderBy; - protected List hints; + protected List hints; + + protected SQLObject restriction; + + protected boolean forBrowse; + protected List forXmlOptions = new ArrayList(4); + protected SQLExpr xmlPath; + + protected SQLExpr rowCount; + protected SQLExpr offset; public SQLSelect(){ @@ -86,8 +91,11 @@ public class SQLSelect extends SQLObjectImpl { protected void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, this.query); + acceptChild(visitor, this.restriction); acceptChild(visitor, this.orderBy); acceptChild(visitor, this.hints); + acceptChild(visitor, this.offset); + acceptChild(visitor, this.rowCount); } visitor.endVisit(this); @@ -135,13 +143,85 @@ public class SQLSelect extends SQLObjectImpl { } public SQLSelect clone() { - SQLSelect clone = new SQLSelect(); + SQLSelect x = new SQLSelect(); - clone.withSubQuery = this.withSubQuery; - clone.query = this.query; - clone.orderBy = this.orderBy; - clone.hints = this.hints; + x.withSubQuery = this.withSubQuery; + x.query = this.query; + if (orderBy != null) { + x.setOrderBy(this.orderBy); + } + if (restriction != null) { + x.setRestriction(restriction.clone()); + } - return clone; + if (this.hints != null) { + for (SQLHint hint : this.hints) { + x.hints.add(hint); + } + } + + return x; } + + public SQLObject getRestriction() { + return this.restriction; + } + + public void setRestriction(SQLObject restriction) { + if (restriction != null) { + restriction.setParent(this); + } + this.restriction = restriction; + } + + public boolean isForBrowse() { + return forBrowse; + } + + public void setForBrowse(boolean forBrowse) { + this.forBrowse = forBrowse; + } + + public List getForXmlOptions() { + return forXmlOptions; + } + + public void setForXmlOptions(List forXmlOptions) { + this.forXmlOptions = forXmlOptions; + } + + public SQLExpr getRowCount() { + return rowCount; + } + + public void setRowCount(SQLExpr rowCount) { + if (rowCount != null) { + rowCount.setParent(this); + } + + this.rowCount = rowCount; + } + + public SQLExpr getOffset() { + return offset; + } + + public void setOffset(SQLExpr offset) { + if (offset != null) { + offset.setParent(this); + } + this.offset = offset; + } + + public SQLExpr getXmlPath() { + return xmlPath; + } + + public void setXmlPath(SQLExpr xmlPath) { + if (xmlPath != null) { + xmlPath.setParent(this); + } + this.xmlPath = xmlPath; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectGroupByClause.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectGroupByClause.java index da6d80fa33..f2b78f27de 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectGroupByClause.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectGroupByClause.java @@ -81,4 +81,8 @@ public class SQLSelectGroupByClause extends SQLObjectImpl { this.items.add(sqlExpr); } } + + public SQLSelectGroupByClause clone() { + throw new UnsupportedOperationException(); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectItem.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectItem.java index 8ff987b673..65774dacfc 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectItem.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectItem.java @@ -144,4 +144,13 @@ public class SQLSelectItem extends SQLObjectImpl { this.connectByRoot = connectByRoot; } + public SQLSelectItem clone() { + SQLSelectItem x = new SQLSelectItem(); + x.alias = alias; + if (expr != null) { + x.expr = expr.clone(); + } + x.connectByRoot = connectByRoot; + return x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock.java index 4bb3990c4e..245576a67c 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectQueryBlock.java @@ -130,6 +130,14 @@ public class SQLSelectQueryBlock extends SQLObjectImpl implements SQLSelectQuery item.setParent(this); } + public void addSelectItem(SQLExpr expr) { + this.addSelectItem(new SQLSelectItem(expr)); + } + + public void addSelectItem(SQLExpr expr, String alias) { + this.addSelectItem(new SQLSelectItem(expr, alias)); + } + public SQLTableSource getFrom() { return this.from; } @@ -308,4 +316,64 @@ public class SQLSelectQueryBlock extends SQLObjectImpl implements SQLSelectQuery return true; } + public SQLSelectQueryBlock clone() { + SQLSelectQueryBlock x = new SQLSelectQueryBlock(); + clone(x); + return x; + } + + public void clone(SQLSelectQueryBlock x) { + + x.distionOption = distionOption; + + for (SQLSelectItem item : this.selectList) { + x.addSelectItem(item.clone()); + } + + if (from != null) { + x.setFrom(from.clone()); + } + + if (into != null) { + x.setInto(into.clone()); + } + + if (where != null) { + x.setWhere(where.clone()); + } + + if (startWith != null) { + x.setStartWith(startWith.clone()); + } + + if (connectBy != null) { + x.setConnectBy(connectBy.clone()); + } + + x.prior = prior; + x.noCycle = noCycle; + + if (orderBySiblings != null) { + x.setOrderBySiblings(orderBySiblings.clone()); + } + + if (groupBy != null) { + x.setGroupBy(groupBy.clone()); + } + + if (orderBy != null) { + x.setOrderBy(orderBy.clone()); + } + + x.parenthesized = parenthesized; + x.forUpdate = forUpdate; + x.noWait = noWait; + if (waitTime != null) { + x.setWaitTime(waitTime.clone()); + } + + if (limit != null) { + x.setLimit(limit.clone()); + } + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSubqueryTableSource.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSubqueryTableSource.java index 3224863043..099251e63e 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSubqueryTableSource.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSubqueryTableSource.java @@ -38,6 +38,10 @@ public class SQLSubqueryTableSource extends SQLTableSourceImpl { this.setSelect(select); } + public SQLSubqueryTableSource(SQLSelectQuery query){ + this(new SQLSelect(query)); + } + public SQLSelect getSelect() { return this.select; } @@ -62,4 +66,12 @@ public class SQLSubqueryTableSource extends SQLTableSourceImpl { this.select.output(buf); buf.append(")"); } + + public SQLSubqueryTableSource clone() { + SQLSubqueryTableSource x = new SQLSubqueryTableSource(); + if (select != null) { + x.select = select.clone(); + } + return x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSource.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSource.java index 1e90d7dccb..2b5455c385 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSource.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSource.java @@ -27,4 +27,6 @@ public interface SQLTableSource extends SQLObject { void setAlias(String alias); List getHints(); + + SQLTableSource clone(); } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSourceImpl.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSourceImpl.java index 704d019008..ba384ebf77 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSourceImpl.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTableSourceImpl.java @@ -62,4 +62,9 @@ public abstract class SQLTableSourceImpl extends SQLObjectImpl implements SQLTab public void setHints(List hints) { this.hints = hints; } + + public SQLTableSource clone() { + throw new UnsupportedOperationException(); + } + } diff --git a/src/main/java/com/alibaba/druid/sql/builder/impl/SQLSelectBuilderImpl.java b/src/main/java/com/alibaba/druid/sql/builder/impl/SQLSelectBuilderImpl.java index 656b18ff40..3a09568ff6 100644 --- a/src/main/java/com/alibaba/druid/sql/builder/impl/SQLSelectBuilderImpl.java +++ b/src/main/java/com/alibaba/druid/sql/builder/impl/SQLSelectBuilderImpl.java @@ -37,10 +37,8 @@ import com.alibaba.druid.sql.dialect.db2.ast.stmt.DB2SelectQueryBlock; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlSelectQueryBlock; import com.alibaba.druid.sql.ast.SQLLimit; import com.alibaba.druid.sql.dialect.odps.ast.OdpsSelectQueryBlock; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock; import com.alibaba.druid.sql.dialect.postgresql.ast.stmt.PGSelectQueryBlock; -import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelect; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerTop; import com.alibaba.druid.util.JdbcConstants; @@ -323,13 +321,6 @@ public class SQLSelectBuilderImpl implements SQLSelectBuilder { } protected SQLSelect createSelect() { - if (JdbcConstants.SQL_SERVER.equals(dbType)) { - return new SQLServerSelect(); - } - if (JdbcConstants.ORACLE.equals(dbType)) { - return new OracleSelect(); - } - return new SQLSelect(); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/OracleSQLObjectImpl.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/OracleSQLObjectImpl.java index 3dc5088b86..def8d0cdbd 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/OracleSQLObjectImpl.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/OracleSQLObjectImpl.java @@ -33,7 +33,7 @@ public abstract class OracleSQLObjectImpl extends SQLObjectImpl implements Oracl public abstract void accept0(OracleASTVisitor visitor); - public SQLExpr clone() { + public OracleSQLObject clone() { throw new UnsupportedOperationException(); } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/FlashbackQueryClause.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/FlashbackQueryClause.java index a43022e54a..3b5d104fbf 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/FlashbackQueryClause.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/FlashbackQueryClause.java @@ -16,6 +16,7 @@ package com.alibaba.druid.sql.dialect.oracle.ast.clause; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObject; import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; @@ -35,6 +36,10 @@ public abstract class FlashbackQueryClause extends OracleSQLObjectImpl { SCN, TIMESTAMP } + public FlashbackQueryClause clone() { + throw new UnsupportedOperationException(); + } + public static class VersionsFlashbackQueryClause extends FlashbackQueryClause { private SQLExpr begin; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/ModelClause.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/ModelClause.java index 6e4c305fd0..9ea26374f6 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/ModelClause.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/ModelClause.java @@ -418,4 +418,8 @@ public class ModelClause extends OracleSQLObjectImpl { } } + + public ModelClause clone() { + throw new UnsupportedOperationException(); + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/PartitionExtensionClause.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/PartitionExtensionClause.java index f6af7651ac..143abaabfe 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/PartitionExtensionClause.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/PartitionExtensionClause.java @@ -20,6 +20,7 @@ import java.util.List; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivotBase; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; public class PartitionExtensionClause extends OracleSQLObjectImpl { @@ -57,4 +58,20 @@ public class PartitionExtensionClause extends OracleSQLObjectImpl { visitor.endVisit(this); } + public PartitionExtensionClause clone() { + PartitionExtensionClause x = new PartitionExtensionClause(); + + x.subPartition = subPartition; + if (partition != null) { + x.setPartition(partition.clone()); + } + + for (SQLName item : target) { + SQLName item1 = item.clone(); + item1.setParent(x); + x.target.add(item1); + } + + return x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/SampleClause.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/SampleClause.java index 655badcc3a..a73f0e07eb 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/SampleClause.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/clause/SampleClause.java @@ -63,4 +63,21 @@ public class SampleClause extends OracleSQLObjectImpl { visitor.endVisit(this); } + public SampleClause clone() { + SampleClause x = new SampleClause(); + + x.block = block; + + for (SQLExpr item : percent) { + SQLExpr item1 = item.clone(); + item1.setParent(x); + x.percent.add(item1); + } + + if (seedValue != null) { + x.setSeedValue(seedValue.clone()); + } + + return x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleAnalytic.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleAnalytic.java index 5176424156..0fbd586ba6 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleAnalytic.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleAnalytic.java @@ -45,6 +45,18 @@ public class OracleAnalytic extends SQLOver implements OracleExpr { return this.windowing; } + public OracleAnalytic clone() { + OracleAnalytic x = new OracleAnalytic(); + + cloneTo(x); + + if (windowing != null) { + x.setWindowing(windowing.clone()); + } + + return x; + } + public void setWindowing(OracleAnalyticWindowing windowing) { this.windowing = windowing; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleAnalyticWindowing.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleAnalyticWindowing.java index cdcd2dee27..f63806665b 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleAnalyticWindowing.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleAnalyticWindowing.java @@ -57,7 +57,7 @@ public class OracleAnalyticWindowing extends SQLObjectImpl implements OracleExpr this.type = type; } - public SQLExpr clone() { + public OracleAnalyticWindowing clone() { OracleAnalyticWindowing x = new OracleAnalyticWindowing(); x.type = type; if (expr != null) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleArgumentExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleArgumentExpr.java index aa492ac18a..8d0f117f86 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleArgumentExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleArgumentExpr.java @@ -57,4 +57,14 @@ public class OracleArgumentExpr extends OracleSQLObjectImpl implements SQLExpr { visitor.endVisit(this); } + public OracleArgumentExpr clone() { + OracleArgumentExpr x = new OracleArgumentExpr(); + x.argumentName = argumentName; + + if (value != null) { + x.setValue(value.clone()); + } + + return x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleDatetimeExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleDatetimeExpr.java index e53dc6c51c..dd2e55ad1b 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleDatetimeExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleDatetimeExpr.java @@ -16,6 +16,7 @@ package com.alibaba.druid.sql.dialect.oracle.ast.expr; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObject; import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; @@ -58,4 +59,17 @@ public class OracleDatetimeExpr extends OracleSQLObjectImpl implements SQLExpr { this.timeZone = timeZone; } + public OracleDatetimeExpr clone() { + OracleDatetimeExpr x = new OracleDatetimeExpr(); + + if (expr != null) { + x.setExpr(expr.clone()); + } + + if (timeZone != null) { + x.setTimeZone(timeZone.clone()); + } + + return x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleRangeExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleRangeExpr.java index 340194075e..7a9dde570b 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleRangeExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleRangeExpr.java @@ -58,4 +58,18 @@ public class OracleRangeExpr extends OracleSQLObjectImpl implements SQLExpr { this.upBound = upBound; } + + public OracleRangeExpr clone() { + OracleRangeExpr x = new OracleRangeExpr(); + + if (lowBound != null) { + x.setLowBound(lowBound.clone()); + } + + if (upBound != null) { + x.setUpBound(upBound.clone()); + } + + return x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleSizeExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleSizeExpr.java index 00993bfef7..512456a5dd 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleSizeExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleSizeExpr.java @@ -61,4 +61,15 @@ public class OracleSizeExpr extends OracleSQLObjectImpl implements OracleExpr { public static enum Unit { K, M, G, T, P, E } + + public OracleSizeExpr clone() { + OracleSizeExpr x = new OracleSizeExpr(); + + if (value != null) { + x.setValue(value.clone()); + } + x.unit = unit; + + return x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleSysdateExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleSysdateExpr.java index 07998a0ddd..2da3a86d3f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleSysdateExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleSysdateExpr.java @@ -36,4 +36,10 @@ public class OracleSysdateExpr extends OracleSQLObjectImpl implements SQLExpr { visitor.visit(this); visitor.endVisit(this); } + + public OracleSysdateExpr clone() { + OracleSysdateExpr x = new OracleSysdateExpr(); + x.option = option; + return x; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelect.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelect.java deleted file mode 100644 index eff7331295..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelect.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright 1999-2017 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.SQLUtils; -import com.alibaba.druid.sql.ast.statement.SQLSelect; -import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; -import com.alibaba.druid.sql.visitor.SQLASTVisitor; - -public class OracleSelect extends SQLSelect { - private OracleSelectRestriction restriction; - - public OracleSelect(){ - - } - - public OracleSelectRestriction getRestriction() { - return this.restriction; - } - - public void setRestriction(OracleSelectRestriction restriction) { - this.restriction = restriction; - } - - public void output(StringBuffer buf) { - this.query.output(buf); - buf.append(" "); - - if (this.orderBy != null) { - this.orderBy.output(buf); - } - } - - protected void accept0(SQLASTVisitor visitor) { - accept0((OracleASTVisitor) visitor); - } - - protected void accept0(OracleASTVisitor visitor) { - if (visitor.visit(this)) { - acceptChild(visitor, this.withSubQuery); - acceptChild(visitor, this.query); - acceptChild(visitor, this.restriction); - acceptChild(visitor, this.orderBy); - } - visitor.endVisit(this); - } - - public String toString() { - return SQLUtils.toOracleString(this); - } -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectPivotBase.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectPivotBase.java index e0bb45106b..3a8e91a512 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectPivotBase.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectPivotBase.java @@ -19,6 +19,7 @@ import java.util.ArrayList; import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObject; import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; public abstract class OracleSelectPivotBase extends OracleSQLObjectImpl { @@ -32,4 +33,8 @@ public abstract class OracleSelectPivotBase extends OracleSQLObjectImpl { public List getPivotFor() { return this.pivotFor; } + + public OracleSelectPivotBase clone() { + throw new UnsupportedOperationException(); + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectQueryBlock.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectQueryBlock.java index 8270b401cc..5afebb7c4c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectQueryBlock.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectQueryBlock.java @@ -28,12 +28,38 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class OracleSelectQueryBlock extends SQLSelectQueryBlock { - private final List hints = new ArrayList(1); + private final List hints = new ArrayList(1); - private ModelClause modelClause; + private ModelClause modelClause; - private final List forUpdateOf = new ArrayList(1); - private boolean skipLocked = false; + private final List forUpdateOf = new ArrayList(1); + private boolean skipLocked = false; + + public OracleSelectQueryBlock clone() { + OracleSelectQueryBlock x = new OracleSelectQueryBlock(); + + super.clone(x); + + for (SQLCommentHint hint : hints) { + SQLCommentHint hint1 = hint.clone(); + hint1.setParent(x); + x.getHints().add(hint1); + } + + if (modelClause != null) { + x.setModelClause(modelClause.clone()); + } + + for (SQLExpr item : forUpdateOf) { + SQLExpr item1 = item.clone(); + item1.setParent(x); + forUpdateOf.add(item1); + } + + x.skipLocked = skipLocked; + + return x; + } public OracleSelectQueryBlock(){ diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectTableReference.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectTableReference.java index e01673167c..54f3970133 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectTableReference.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleSelectTableReference.java @@ -17,6 +17,7 @@ package com.alibaba.druid.sql.dialect.oracle.ast.stmt; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; +import com.alibaba.druid.sql.ast.statement.SQLTableSource; import com.alibaba.druid.sql.dialect.oracle.ast.clause.FlashbackQueryClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; @@ -33,6 +34,31 @@ public class OracleSelectTableReference extends SQLExprTableSource implements Or protected FlashbackQueryClause flashback; + public OracleSelectTableReference clone() { + OracleSelectTableReference x = new OracleSelectTableReference(); + cloneTo(x); + + x.only = only; + + if (pivot != null) { + x.setPivot(pivot.clone()); + } + + if (partition != null) { + x.setPartition(partition.clone()); + } + + if (sampleClause != null) { + x.setSampleClause(sampleClause.clone()); + } + + if (flashback != null) { + setFlashback(flashback.clone()); + } + + return x; + } + public OracleSelectTableReference(){ } @@ -140,4 +166,5 @@ public class OracleSelectTableReference extends SQLExprTableSource implements Or public String toString () { return SQLUtils.toOracleString(this); } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleCreateTableParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleCreateTableParser.java index 1de07e8c38..5bb050afea 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleCreateTableParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleCreateTableParser.java @@ -30,11 +30,11 @@ import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; import com.alibaba.druid.sql.ast.expr.SQLNumericLiteralExpr; import com.alibaba.druid.sql.ast.statement.SQLCreateTableStatement; +import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleLobStorageClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleStorageClause; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement.DeferredSegmentCreation; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSupplementalIdKey; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSupplementalLogGrp; import com.alibaba.druid.sql.parser.*; @@ -211,7 +211,7 @@ public class OracleCreateTableParser extends SQLCreateTableParser { if (lexer.token() == Token.AS) { lexer.nextToken(); - OracleSelect select = new OracleSelectParser(exprParser).select(); + SQLSelect select = new OracleSelectParser(exprParser).select(); stmt.setSelect(select); } 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 f58e51cabd..d540e16310 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 @@ -35,10 +35,7 @@ import com.alibaba.druid.sql.ast.expr.SQLTimestampExpr; import com.alibaba.druid.sql.ast.expr.SQLUnaryExpr; import com.alibaba.druid.sql.ast.expr.SQLUnaryOperator; import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; -import com.alibaba.druid.sql.ast.statement.SQLCharacterDataType; -import com.alibaba.druid.sql.ast.statement.SQLCheck; -import com.alibaba.druid.sql.ast.statement.SQLColumnDefinition; -import com.alibaba.druid.sql.ast.statement.SQLUnique; +import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalDay; import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeIntervalYear; import com.alibaba.druid.sql.dialect.oracle.ast.OracleDataTypeTimestamp; @@ -66,7 +63,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraint; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleConstraint.Initially; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleForeignKey; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OraclePrimaryKey; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUnique; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleUsingIndexClause; import com.alibaba.druid.sql.parser.Lexer; @@ -426,16 +422,16 @@ public class OracleExprParser extends SQLExprParser { return primaryRest(sqlExpr); case CURSOR: - lexer.nextToken(); - accept(Token.LPAREN); - - OracleSelect select = createSelectParser().select(); - OracleCursorExpr cursorExpr = new OracleCursorExpr(select); - - accept(Token.RPAREN); - - sqlExpr = cursorExpr; - return primaryRest(sqlExpr); + lexer.nextToken(); + accept(Token.LPAREN); + + SQLSelect select = createSelectParser().select(); + OracleCursorExpr cursorExpr = new OracleCursorExpr(select); + + accept(Token.RPAREN); + + sqlExpr = cursorExpr; + return primaryRest(sqlExpr); case MODEL: case PCTFREE: case INITRANS: diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java index 3e0508b737..4b823c7dc6 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleSelectParser.java @@ -47,7 +47,6 @@ import com.alibaba.druid.sql.dialect.oracle.ast.clause.OracleWithSubqueryEntry; import com.alibaba.druid.sql.dialect.oracle.ast.clause.PartitionExtensionClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SampleClause; import com.alibaba.druid.sql.dialect.oracle.ast.clause.SearchClause; -import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelect; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectJoin; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectPivot; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleSelectQueryBlock; @@ -71,8 +70,8 @@ public class OracleSelectParser extends SQLSelectParser { super(exprParser); } - public OracleSelect select() { - OracleSelect select = new OracleSelect(); + public SQLSelect select() { + SQLSelect select = new SQLSelect(); withSubquery(select); @@ -376,7 +375,7 @@ public class OracleSelectParser extends SQLSelectParser { accept(Token.ON); accept(Token.LPAREN); - OracleSelect subQuery = this.select(); + SQLSelect subQuery = this.select(); accept(Token.RPAREN); referenceModelClause.setSubQuery(subQuery); 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 1965426d57..ddcf532a47 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 @@ -157,10 +157,6 @@ public interface OracleASTVisitor extends SQLASTVisitor { void endVisit(OracleBinaryDoubleExpr x); - boolean visit(OracleSelect x); - - void endVisit(OracleSelect x); - boolean visit(OracleCursorExpr x); void endVisit(OracleCursorExpr 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 7013e5fa6d..14b1da39f4 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 @@ -65,13 +65,6 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitorAdapter; public class OracleASTVisitorAdapter extends SQLASTVisitorAdapter implements OracleASTVisitor { - public boolean visit(OracleSelect x) { - return true; - } - - public void endVisit(OracleSelect x) { - } - @Override public void endVisit(OraclePLSQLCommitStatement astNode) { 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 84b06175df..7503d7934b 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 @@ -243,14 +243,6 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS } public boolean visit(SQLSelect x) { - if (x instanceof OracleSelect) { - return visit((OracleSelect) x); - } - - return super.visit(x); - } - - public boolean visit(OracleSelect x) { if (x.getWithSubQuery() != null) { x.getWithSubQuery().accept(this); println(); @@ -899,11 +891,6 @@ public class OracleOutputVisitor extends SQLASTOutputVisitor implements OracleAS } - @Override - public void endVisit(OracleSelect x) { - - } - @Override public boolean visit(OracleCursorExpr x) { print0(ucase ? "CURSOR(" : "cursor("); 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 aaf6774378..0b5951be62 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 @@ -178,14 +178,6 @@ public class OracleSchemaStatVisitor extends SchemaStatVisitor implements Oracle return false; } - public void endVisit(OracleSelect x) { - endVisit((SQLSelect) x); - } - - public boolean visit(OracleSelect x) { - return visit((SQLSelect) x); - } - public void endVisit(SQLSelect x) { if (x.getQuery() != null) { String table = (String) x.getQuery().getAttribute(ATTR_TABLE); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/SQLServerSelect.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/SQLServerSelect.java deleted file mode 100644 index f6fe6d396a..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/SQLServerSelect.java +++ /dev/null @@ -1,133 +0,0 @@ -/* - * Copyright 1999-2017 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.sqlserver.ast; - -import java.util.ArrayList; -import java.util.List; - -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.statement.SQLSelect; -import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitor; -import com.alibaba.druid.sql.visitor.SQLASTVisitor; - -public class SQLServerSelect extends SQLSelect implements SQLServerObject { - - private boolean forBrowse; - private List forXmlOptions = new ArrayList(4); - private SQLExpr xmlPath; - - private SQLExpr rowCount; - private SQLExpr offset; - - public boolean isForBrowse() { - return forBrowse; - } - - public void setForBrowse(boolean forBrowse) { - this.forBrowse = forBrowse; - } - - public List getForXmlOptions() { - return forXmlOptions; - } - - public void setForXmlOptions(List forXmlOptions) { - this.forXmlOptions = forXmlOptions; - } - - public SQLExpr getRowCount() { - return rowCount; - } - - public void setRowCount(SQLExpr rowCount) { - if (rowCount != null) { - rowCount.setParent(this); - } - - this.rowCount = rowCount; - } - - public SQLExpr getOffset() { - return offset; - } - - public void setOffset(SQLExpr offset) { - if (offset != null) { - offset.setParent(this); - } - this.offset = offset; - } - - public SQLExpr getXmlPath() { - return xmlPath; - } - - public void setXmlPath(SQLExpr xmlPath) { - if (xmlPath != null) { - xmlPath.setParent(this); - } - this.xmlPath = xmlPath; - } - - @Override - protected void accept0(SQLASTVisitor visitor) { - this.accept0((SQLServerASTVisitor) visitor); - } - - @Override - public void accept0(SQLServerASTVisitor visitor) { - if (visitor.visit(this)) { - acceptChild(visitor, this.query); - acceptChild(visitor, this.orderBy); - acceptChild(visitor, this.hints); - acceptChild(visitor, this.offset); - acceptChild(visitor, this.rowCount); - } - - visitor.endVisit(this); - } - - @Override - public int hashCode() { - final int prime = 31; - int result = super.hashCode(); - result = prime * result + (forBrowse ? 1231 : 1237); - result = prime * result + ((forXmlOptions == null) ? 0 : forXmlOptions.hashCode()); - result = prime * result + ((offset == null) ? 0 : offset.hashCode()); - result = prime * result + ((rowCount == null) ? 0 : rowCount.hashCode()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) return true; - if (!super.equals(obj)) return false; - if (getClass() != obj.getClass()) return false; - SQLServerSelect other = (SQLServerSelect) obj; - if (forBrowse != other.forBrowse) return false; - if (forXmlOptions == null) { - if (other.forXmlOptions != null) return false; - } else if (!forXmlOptions.equals(other.forXmlOptions)) return false; - if (offset == null) { - if (other.offset != null) return false; - } else if (!offset.equals(other.offset)) return false; - if (rowCount == null) { - if (other.rowCount != null) return false; - } else if (!rowCount.equals(other.rowCount)) return false; - return true; - } - -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerSelectParser.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerSelectParser.java index 70a603e4e7..3ec8c6ba4b 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerSelectParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/parser/SQLServerSelectParser.java @@ -22,7 +22,6 @@ import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.ast.statement.SQLSelectQuery; import com.alibaba.druid.sql.ast.statement.SQLTableSource; -import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelect; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerTop; import com.alibaba.druid.sql.parser.ParserException; @@ -41,7 +40,7 @@ public class SQLServerSelectParser extends SQLSelectParser { } public SQLSelect select() { - SQLServerSelect select = new SQLServerSelect(); + SQLSelect select = new SQLSelect(); withSubquery(select); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitor.java index 38d0380c3c..33f3989127 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitor.java @@ -16,7 +16,6 @@ package com.alibaba.druid.sql.dialect.sqlserver.visitor; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerOutput; -import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelect; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerTop; import com.alibaba.druid.sql.dialect.sqlserver.ast.expr.SQLServerObjectReferenceExpr; @@ -68,10 +67,6 @@ public interface SQLServerASTVisitor extends SQLASTVisitor { void endVisit(SQLServerOutput x); - boolean visit(SQLServerSelect x); - - void endVisit(SQLServerSelect x); - boolean visit(SQLServerRollbackStatement x); void endVisit(SQLServerRollbackStatement x); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitorAdapter.java index 4f8f4a5231..80fd6fda5a 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerASTVisitorAdapter.java @@ -16,7 +16,6 @@ package com.alibaba.druid.sql.dialect.sqlserver.visitor; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerOutput; -import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelect; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerTop; import com.alibaba.druid.sql.dialect.sqlserver.ast.expr.SQLServerObjectReferenceExpr; @@ -122,16 +121,6 @@ public class SQLServerASTVisitorAdapter extends SQLASTVisitorAdapter implements } - @Override - public boolean visit(SQLServerSelect x) { - return true; - } - - @Override - public void endVisit(SQLServerSelect x) { - - } - @Override public boolean visit(SQLServerRollbackStatement x) { return true; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java index 5bf0449953..09edce5b7c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerOutputVisitor.java @@ -20,7 +20,6 @@ import com.alibaba.druid.sql.ast.SQLSetQuantifier; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerOutput; -import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelect; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerTop; import com.alibaba.druid.sql.dialect.sqlserver.ast.expr.SQLServerObjectReferenceExpr; @@ -417,13 +416,7 @@ public class SQLServerOutputVisitor extends SQLASTOutputVisitor implements SQLSe } } - @Override - public void endVisit(SQLServerSelect x) { - - } - - @Override - public boolean visit(SQLServerSelect x) { + public boolean visit(SQLSelect x) { super.visit(x); if (x.isForBrowse()) { println(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerSchemaStatVisitor.java index 4a598943c3..bcf168e9fd 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/visitor/SQLServerSchemaStatVisitor.java @@ -20,7 +20,6 @@ import java.util.Map; import com.alibaba.druid.sql.ast.statement.SQLInsertStatement; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerOutput; -import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelect; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerSelectQueryBlock; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerTop; import com.alibaba.druid.sql.dialect.sqlserver.ast.expr.SQLServerObjectReferenceExpr; @@ -149,16 +148,6 @@ public class SQLServerSchemaStatVisitor extends SchemaStatVisitor implements SQL } - @Override - public boolean visit(SQLServerSelect x) { - return super.visit(x); - } - - @Override - public void endVisit(SQLServerSelect x) { - - } - @Override public boolean visit(SQLServerRollbackStatement x) { return true; 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 1e16ad0ab2..d4708a9160 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -1982,11 +1982,23 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet printJoinType(x.getJoinType()); } print(' '); - x.getRight().accept(this); + + SQLTableSource right = x.getRight(); + boolean isSubquery = false; + + if(right instanceof SQLSubqueryTableSource) { + isSubquery = true; + } + right.accept(this); if (x.getCondition() != null) { + if (isSubquery) { + println(); + } else { + print(' '); + } incrementIndent(); - print0(ucase ? " ON " : " on "); + print0(ucase ? "ON " : "on "); x.getCondition().accept(this); decrementIndent(); } @@ -2035,10 +2047,11 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet @Override public boolean visit(SQLSomeExpr x) { print0(ucase ? "SOME (" : "some ("); - incrementIndent(); + println(); x.getSubQuery().accept(this); decrementIndent(); + println(); print(')'); return false; } @@ -2046,10 +2059,11 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet @Override public boolean visit(SQLAnyExpr x) { print0(ucase ? "ANY (" : "any ("); - incrementIndent(); + println(); x.getSubQuery().accept(this); decrementIndent(); + println(); print(')'); return false; } @@ -2057,10 +2071,11 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet @Override public boolean visit(SQLAllExpr x) { print0(ucase ? "ALL (" : "all ("); - incrementIndent(); + println(); x.getSubQuery().accept(this); decrementIndent(); + println(); print(')'); return false; } @@ -2095,9 +2110,10 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet public boolean visit(SQLSubqueryTableSource x) { print('('); incrementIndent(); - x.getSelect().accept(this); println(); + this.visit(x.getSelect()); decrementIndent(); + println(); print(')'); if (x.getAlias() != null) { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Count_MySql_0.java b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Count_MySql_0.java index 3bb8a8e81a..c9268d275d 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Count_MySql_0.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Count_MySql_0.java @@ -47,22 +47,24 @@ public class PagerUtilsTest_Count_MySql_0 extends TestCase { public void test_mysql_group_0() throws Exception { String sql = "select type, count(*) from t group by type"; String result = PagerUtils.count(sql, JdbcConstants.MYSQL); - Assert.assertEquals("SELECT COUNT(*)" + // - "\nFROM (SELECT type, COUNT(*)" + // - "\n\tFROM t" + // - "\n\tGROUP BY type" + // - "\n\t) ALIAS_COUNT", result); + Assert.assertEquals("SELECT COUNT(*)\n" + + "FROM (\n" + + "\tSELECT type, COUNT(*)\n" + + "\tFROM t\n" + + "\tGROUP BY type\n" + + ") ALIAS_COUNT", result); } public void test_mysql_union_0() throws Exception { String sql = "select id, name from t1 union select id, name from t2 order by id"; String result = PagerUtils.count(sql, JdbcConstants.MYSQL); - Assert.assertEquals("SELECT COUNT(*)\n" + // - "FROM ((SELECT id, name" + // - "\n\tFROM t1)" + // - "\n\tUNION" + // - "\n\t(SELECT id, name" + // - "\n\tFROM t2)" + // - "\n\t) ALIAS_COUNT", result); + Assert.assertEquals("SELECT COUNT(*)\n" + + "FROM (\n" + + "\t(SELECT id, name\n" + + "\tFROM t1)\n" + + "\tUNION\n" + + "\t(SELECT id, name\n" + + "\tFROM t2)\n" + + ") ALIAS_COUNT", result); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Count_Oracle_0.java b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Count_Oracle_0.java index c0858257d6..634a380d2f 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Count_Oracle_0.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Count_Oracle_0.java @@ -33,22 +33,24 @@ public class PagerUtilsTest_Count_Oracle_0 extends TestCase { public void test_oracle_group_0() throws Exception { String sql = "select type, count(*) from t group by type"; String result = PagerUtils.count(sql, JdbcConstants.ORACLE); - Assert.assertEquals("SELECT COUNT(*)" + // - "\nFROM (SELECT type, COUNT(*)" + // - "\n\tFROM t" + // - "\n\tGROUP BY type" + // - "\n\t) ALIAS_COUNT", result); + Assert.assertEquals("SELECT COUNT(*)\n" + + "FROM (\n" + + "\tSELECT type, COUNT(*)\n" + + "\tFROM t\n" + + "\tGROUP BY type\n" + + ") ALIAS_COUNT", result); } public void test_oracle_union_0() throws Exception { String sql = "select id, name from t1 union select id, name from t2 order by id"; String result = PagerUtils.count(sql, JdbcConstants.ORACLE); - Assert.assertEquals("SELECT COUNT(*)\n" + // - "FROM (SELECT id, name" + // - "\n\tFROM t1" + // - "\n\tUNION" + // - "\n\tSELECT id, name" + // - "\n\tFROM t2" + // - "\n\t) ALIAS_COUNT", result); + Assert.assertEquals("SELECT COUNT(*)\n" + + "FROM (\n" + + "\tSELECT id, name\n" + + "\tFROM t1\n" + + "\tUNION\n" + + "\tSELECT id, name\n" + + "\tFROM t2\n" + + ") ALIAS_COUNT", result); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Count_PG_0.java b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Count_PG_0.java index af2a7f7acf..c22683aa81 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Count_PG_0.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Count_PG_0.java @@ -33,22 +33,24 @@ public class PagerUtilsTest_Count_PG_0 extends TestCase { public void test_pg_group_0() throws Exception { String sql = "select type, count(*) from t group by type"; String result = PagerUtils.count(sql, JdbcConstants.POSTGRESQL); - Assert.assertEquals("SELECT COUNT(*)" + // - "\nFROM (SELECT type, COUNT(*)" + // - "\n\tFROM t" + // - "\n\tGROUP BY type" + // - "\n\t) ALIAS_COUNT", result); + Assert.assertEquals("SELECT COUNT(*)\n" + + "FROM (\n" + + "\tSELECT type, COUNT(*)\n" + + "\tFROM t\n" + + "\tGROUP BY type\n" + + ") ALIAS_COUNT", result); } public void test_pg_union_0() throws Exception { String sql = "select id, name from t1 union select id, name from t2 order by id"; String result = PagerUtils.count(sql, JdbcConstants.POSTGRESQL); - Assert.assertEquals("SELECT COUNT(*)\n" + // - "FROM (SELECT id, name" + // - "\n\tFROM t1" + // - "\n\tUNION" + // - "\n\tSELECT id, name" + // - "\n\tFROM t2" + // - "\n\t) ALIAS_COUNT", result); + Assert.assertEquals("SELECT COUNT(*)\n" + + "FROM (\n" + + "\tSELECT id, name\n" + + "\tFROM t1\n" + + "\tUNION\n" + + "\tSELECT id, name\n" + + "\tFROM t2\n" + + ") ALIAS_COUNT", result); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Count_SQLServer_0.java b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Count_SQLServer_0.java index 917982e81c..8f7fa189e0 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Count_SQLServer_0.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Count_SQLServer_0.java @@ -33,22 +33,24 @@ public class PagerUtilsTest_Count_SQLServer_0 extends TestCase { public void test_sqlserver_group_0() throws Exception { String sql = "select type, count(*) from t group by type"; String result = PagerUtils.count(sql, JdbcConstants.SQL_SERVER); - Assert.assertEquals("SELECT COUNT(*)" + // - "\nFROM (SELECT type, COUNT(*)" + // - "\n\tFROM t" + // - "\n\tGROUP BY type" + // - "\n\t) ALIAS_COUNT", result); + Assert.assertEquals("SELECT COUNT(*)\n" + + "FROM (\n" + + "\tSELECT type, COUNT(*)\n" + + "\tFROM t\n" + + "\tGROUP BY type\n" + + ") ALIAS_COUNT", result); } public void test_sqlserver_union_0() throws Exception { String sql = "select id, name from t1 union select id, name from t2 order by id"; String result = PagerUtils.count(sql, JdbcConstants.SQL_SERVER); - Assert.assertEquals("SELECT COUNT(*)\n" + // - "FROM (SELECT id, name" + // - "\n\tFROM t1" + // - "\n\tUNION" + // - "\n\tSELECT id, name" + // - "\n\tFROM t2" + // - "\n\t) ALIAS_COUNT", result); + Assert.assertEquals("SELECT COUNT(*)\n" + + "FROM (\n" + + "\tSELECT id, name\n" + + "\tFROM t1\n" + + "\tUNION\n" + + "\tSELECT id, name\n" + + "\tFROM t2\n" + + ") ALIAS_COUNT", result); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_SQLServer_1.java b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_SQLServer_1.java index f0c0f59c7b..562acc39b0 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_SQLServer_1.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_SQLServer_1.java @@ -12,16 +12,18 @@ public class PagerUtilsTest_Limit_SQLServer_1 extends TestCase { public void test_db2_union() throws Exception { String sql = "select * from t1 union select * from t2"; String result = PagerUtils.limit(sql, JdbcConstants.SQL_SERVER, 20, 10); - Assert.assertEquals("SELECT *" // - + "\nFROM (SELECT XX.*, ROW_NUMBER() OVER () AS ROWNUM" // - + "\n\tFROM (SELECT *" // - + "\n\t\tFROM t1" // - + "\n\t\tUNION" // - + "\n\t\tSELECT *" // - + "\n\t\tFROM t2" // - + "\n\t\t) XX" // - + "\n\t) XXX" // - + "\nWHERE ROWNUM > 20" // - + "\n\tAND ROWNUM <= 30", result); + Assert.assertEquals("SELECT *\n" + + "FROM (\n" + + "\tSELECT XX.*, ROW_NUMBER() OVER () AS ROWNUM\n" + + "\tFROM (\n" + + "\t\tSELECT *\n" + + "\t\tFROM t1\n" + + "\t\tUNION\n" + + "\t\tSELECT *\n" + + "\t\tFROM t2\n" + + "\t) XX\n" + + ") XXX\n" + + "WHERE ROWNUM > 20\n" + + "\tAND ROWNUM <= 30", result); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_SQLServer_2.java b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_SQLServer_2.java index 22b90f5453..4d01bf770f 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_SQLServer_2.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_SQLServer_2.java @@ -12,12 +12,13 @@ public class PagerUtilsTest_Limit_SQLServer_2 extends TestCase { public void test_db2_union() throws Exception { String sql = "select * from t1 union select * from t2"; String result = PagerUtils.limit(sql, JdbcConstants.SQL_SERVER, 0, 10); - Assert.assertEquals("SELECT TOP 10 XX.*" // - + "\nFROM (SELECT *" // - + "\n\tFROM t1" // - + "\n\tUNION" // - + "\n\tSELECT *" // - + "\n\tFROM t2" // - + "\n\t) XX", result); + Assert.assertEquals("SELECT TOP 10 XX.*\n" + + "FROM (\n" + + "\tSELECT *\n" + + "\tFROM t1\n" + + "\tUNION\n" + + "\tSELECT *\n" + + "\tFROM t2\n" + + ") XX", result); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_SQLServer_4.java b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_SQLServer_4.java index f3a38f5010..a6e6148aea 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_SQLServer_4.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_SQLServer_4.java @@ -12,12 +12,13 @@ public class PagerUtilsTest_Limit_SQLServer_4 extends TestCase { public void test_db2_union() throws Exception { String sql = "select * from t1 where id > 1"; String result = PagerUtils.limit(sql, JdbcConstants.SQL_SERVER, 100, 10); - Assert.assertEquals("SELECT *" // - + "\nFROM (SELECT *, ROW_NUMBER() OVER () AS ROWNUM" // - + "\n\tFROM t1" // - + "\n\tWHERE id > 1" // - + "\n\t) XX" // - + "\nWHERE ROWNUM > 100" // - + "\n\tAND ROWNUM <= 110", result); + Assert.assertEquals("SELECT *\n" + + "FROM (\n" + + "\tSELECT *, ROW_NUMBER() OVER () AS ROWNUM\n" + + "\tFROM t1\n" + + "\tWHERE id > 1\n" + + ") XX\n" + + "WHERE ROWNUM > 100\n" + + "\tAND ROWNUM <= 110", result); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_db2_0.java b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_db2_0.java index ea60c2d459..61575e978a 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_db2_0.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_db2_0.java @@ -20,35 +20,38 @@ public class PagerUtilsTest_Limit_db2_0 extends TestCase { public void test_mysql_1() throws Exception { String sql = "select * from t"; String result = PagerUtils.limit(sql, JdbcConstants.DB2, 10, 10); - Assert.assertEquals("SELECT *"// - + "\nFROM (SELECT *, ROW_NUMBER() OVER () AS ROWNUM"// - + "\n\tFROM t"// - + "\n\t) XX"// - + "\nWHERE ROWNUM > 10"// - + "\n\tAND ROWNUM <= 20", result); + Assert.assertEquals("SELECT *\n" + + "FROM (\n" + + "\tSELECT *, ROW_NUMBER() OVER () AS ROWNUM\n" + + "\tFROM t\n" + + ") XX\n" + + "WHERE ROWNUM > 10\n" + + "\tAND ROWNUM <= 20", result); } public void test_mysql_2() throws Exception { String sql = "select * from t where age > 100"; String result = PagerUtils.limit(sql, JdbcConstants.DB2, 20, 10); - Assert.assertEquals("SELECT *"// - + "\nFROM (SELECT *, ROW_NUMBER() OVER () AS ROWNUM"// - + "\n\tFROM t"// - + "\n\tWHERE age > 100"// - + "\n\t) XX"// - + "\nWHERE ROWNUM > 20"// - + "\n\tAND ROWNUM <= 30", result); + Assert.assertEquals("SELECT *\n" + + "FROM (\n" + + "\tSELECT *, ROW_NUMBER() OVER () AS ROWNUM\n" + + "\tFROM t\n" + + "\tWHERE age > 100\n" + + ") XX\n" + + "WHERE ROWNUM > 20\n" + + "\tAND ROWNUM <= 30", result); } public void test_mysql_3() throws Exception { String sql = "select id, name, salary from t order by id, name"; String result = PagerUtils.limit(sql, JdbcConstants.DB2, 20, 10); - Assert.assertEquals("SELECT *"// - + "\nFROM (SELECT id, name, salary, ROW_NUMBER() OVER (ORDER BY id, name) AS ROWNUM"// - + "\n\tFROM t"// - + "\n\t) XX"// - + "\nWHERE ROWNUM > 20"// - + "\n\tAND ROWNUM <= 30", result); + Assert.assertEquals("SELECT *\n" + + "FROM (\n" + + "\tSELECT id, name, salary, ROW_NUMBER() OVER (ORDER BY id, name) AS ROWNUM\n" + + "\tFROM t\n" + + ") XX\n" + + "WHERE ROWNUM > 20\n" + + "\tAND ROWNUM <= 30", result); } public void test_fetch_order() { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_db2_1.java b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_db2_1.java index 48c785bb6e..0af18935b6 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_db2_1.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_db2_1.java @@ -12,16 +12,18 @@ public class PagerUtilsTest_Limit_db2_1 extends TestCase { public void test_db2_union() throws Exception { String sql = "select * from t1 union select * from t2"; String result = PagerUtils.limit(sql, JdbcConstants.DB2, 20, 10); - Assert.assertEquals("SELECT *" // - + "\nFROM (SELECT XX.*, ROW_NUMBER() OVER () AS ROWNUM" // - + "\n\tFROM (SELECT *" // - + "\n\t\tFROM t1" // - + "\n\t\tUNION" // - + "\n\t\tSELECT *" // - + "\n\t\tFROM t2" // - + "\n\t\t) XX" // - + "\n\t) XXX" // - + "\nWHERE ROWNUM > 20" // - + "\n\tAND ROWNUM <= 30", result); + Assert.assertEquals("SELECT *\n" + + "FROM (\n" + + "\tSELECT XX.*, ROW_NUMBER() OVER () AS ROWNUM\n" + + "\tFROM (\n" + + "\t\tSELECT *\n" + + "\t\tFROM t1\n" + + "\t\tUNION\n" + + "\t\tSELECT *\n" + + "\t\tFROM t2\n" + + "\t) XX\n" + + ") XXX\n" + + "WHERE ROWNUM > 20\n" + + "\tAND ROWNUM <= 30", result); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_oracle_0.java b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_oracle_0.java index 5f6798739a..faf6b7061d 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_oracle_0.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/PagerUtilsTest_Limit_oracle_0.java @@ -12,12 +12,13 @@ public class PagerUtilsTest_Limit_oracle_0 extends TestCase { public void test_oracle_oderby_0() throws Exception { String sql = "select * from t order by id"; String result = PagerUtils.limit(sql, JdbcConstants.ORACLE, 0, 10); - Assert.assertEquals("SELECT XX.*, ROWNUM AS RN" + // - "\nFROM (SELECT *" + // - "\n\tFROM t" + // - "\n\tORDER BY id" + // - "\n\t) XX" + // - "\nWHERE ROWNUM <= 10", result); + Assert.assertEquals("SELECT XX.*, ROWNUM AS RN\n" + + "FROM (\n" + + "\tSELECT *\n" + + "\tFROM t\n" + + "\tORDER BY id\n" + + ") XX\n" + + "WHERE ROWNUM <= 10", result); } public void test_oracle_0() throws Exception { @@ -31,40 +32,46 @@ public class PagerUtilsTest_Limit_oracle_0 extends TestCase { public void test_oracle_1() throws Exception { String sql = "select * from t"; String result = PagerUtils.limit(sql, JdbcConstants.ORACLE, 10, 10); - Assert.assertEquals("SELECT *" + // - "\nFROM (SELECT XX.*, ROWNUM AS RN" + // - "\n\tFROM (SELECT *" + // - "\n\t\tFROM t" + // - "\n\t\t) XX" + // - "\n\tWHERE ROWNUM <= 20" + // - "\n\t) XXX" + // - "\nWHERE RN > 10", result); + Assert.assertEquals("SELECT *\n" + + "FROM (\n" + + "\tSELECT XX.*, ROWNUM AS RN\n" + + "\tFROM (\n" + + "\t\tSELECT *\n" + + "\t\tFROM t\n" + + "\t) XX\n" + + "\tWHERE ROWNUM <= 20\n" + + ") XXX\n" + + "WHERE RN > 10", result); } public void test_oracle_2() throws Exception { String sql = "select * from t"; String result = PagerUtils.limit(sql, JdbcConstants.ORACLE, 20, 10); - Assert.assertEquals("SELECT *" + // - "\nFROM (SELECT XX.*, ROWNUM AS RN" + // - "\n\tFROM (SELECT *" + // - "\n\t\tFROM t" + // - "\n\t\t) XX" + // - "\n\tWHERE ROWNUM <= 30" + // - "\n\t) XXX" + // - "\nWHERE RN > 20", result); + Assert.assertEquals("SELECT *\n" + + "FROM (\n" + + "\tSELECT XX.*, ROWNUM AS RN\n" + + "\tFROM (\n" + + "\t\tSELECT *\n" + + "\t\tFROM t\n" + + "\t) XX\n" + + "\tWHERE ROWNUM <= 30\n" + + ") XXX\n" + + "WHERE RN > 20", result); } public void test_oracle_3() throws Exception { String sql = "select id, name, salary from t order by id, name"; String result = PagerUtils.limit(sql, JdbcConstants.ORACLE, 20, 10); - Assert.assertEquals("SELECT *" + // - "\nFROM (SELECT XX.*, ROWNUM AS RN" + // - "\n\tFROM (SELECT id, name, salary" + // - "\n\t\tFROM t" + // - "\n\t\tORDER BY id, name" + // - "\n\t\t) XX" + // - "\n\tWHERE ROWNUM <= 30" + // - "\n\t) XXX" + // - "\nWHERE RN > 20", result); + Assert.assertEquals("SELECT *\n" + + "FROM (\n" + + "\tSELECT XX.*, ROWNUM AS RN\n" + + "\tFROM (\n" + + "\t\tSELECT id, name, salary\n" + + "\t\tFROM t\n" + + "\t\tORDER BY id, name\n" + + "\t) XX\n" + + "\tWHERE ROWNUM <= 30\n" + + ") XXX\n" + + "WHERE RN > 20", result); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_10.java b/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_10.java index 7792b590da..ed50efdb20 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_10.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_10.java @@ -64,30 +64,34 @@ public class DB2SelectTest_10 extends DB2Test { // Assert.assertTrue(visitor.getColumns().contains(new Column("mytable", "first_name"))); // Assert.assertTrue(visitor.getColumns().contains(new Column("mytable", "full_name"))); - Assert.assertEquals("SELECT *" - + "\nFROM (SELECT inner2_.*, ROWNUMBER() OVER (ORDER BY order OF inner2_) AS rownumber_" - + "\n\tFROM (SELECT tsuserstb0_.USERID AS USERID1_1_, tsuserstb0_.CREASTAF AS CREASTAF2_1_, tsuserstb0_.CREATIME AS CREATIME3_1_, tsuserstb0_.LOCORGNO AS LOCORGNO4_1_, tsuserstb0_.PWDMODIFYTIME AS PWDMODIF5_1_" - + "\n\t\t\t, tsuserstb0_.REMARK01 AS REMARK6_1_, tsuserstb0_.REMARK02 AS REMARK7_1_, tsuserstb0_.STAORGNO AS STAORGNO8_1_, tsuserstb0_.UPDASTAF AS UPDASTAF9_1_, tsuserstb0_.UPDATIME AS UPDATIM10_1_" - + "\n\t\t\t, tsuserstb0_.USERNAME AS USERNAM11_1_, tsuserstb0_.USERPWD AS USERPWD12_1_, tsuserstb0_.USERSTATE AS USERSTA13_1_" - + "\n\t\tFROM TS_USERSTB tsuserstb0_" - + "\n\t\tFETCH FIRST 20 ROWS ONLY" - + "\n\t\t) inner2_" - + "\n\t) inner1_" - + "\nWHERE rownumber_ > 10" - + "\nORDER BY rownumber_", // + Assert.assertEquals("SELECT *\n" + + "FROM (\n" + + "\tSELECT inner2_.*, ROWNUMBER() OVER (ORDER BY order OF inner2_) AS rownumber_\n" + + "\tFROM (\n" + + "\t\tSELECT tsuserstb0_.USERID AS USERID1_1_, tsuserstb0_.CREASTAF AS CREASTAF2_1_, tsuserstb0_.CREATIME AS CREATIME3_1_, tsuserstb0_.LOCORGNO AS LOCORGNO4_1_, tsuserstb0_.PWDMODIFYTIME AS PWDMODIF5_1_\n" + + "\t\t\t, tsuserstb0_.REMARK01 AS REMARK6_1_, tsuserstb0_.REMARK02 AS REMARK7_1_, tsuserstb0_.STAORGNO AS STAORGNO8_1_, tsuserstb0_.UPDASTAF AS UPDASTAF9_1_, tsuserstb0_.UPDATIME AS UPDATIM10_1_\n" + + "\t\t\t, tsuserstb0_.USERNAME AS USERNAM11_1_, tsuserstb0_.USERPWD AS USERPWD12_1_, tsuserstb0_.USERSTATE AS USERSTA13_1_\n" + + "\t\tFROM TS_USERSTB tsuserstb0_\n" + + "\t\tFETCH FIRST 20 ROWS ONLY\n" + + "\t) inner2_\n" + + ") inner1_\n" + + "WHERE rownumber_ > 10\n" + + "ORDER BY rownumber_", // SQLUtils.toSQLString(stmt, JdbcConstants.DB2)); - Assert.assertEquals("select *" - + "\nfrom (select inner2_.*, rownumber() over (order by order of inner2_) as rownumber_" - + "\n\tfrom (select tsuserstb0_.USERID as USERID1_1_, tsuserstb0_.CREASTAF as CREASTAF2_1_, tsuserstb0_.CREATIME as CREATIME3_1_, tsuserstb0_.LOCORGNO as LOCORGNO4_1_, tsuserstb0_.PWDMODIFYTIME as PWDMODIF5_1_" - + "\n\t\t\t, tsuserstb0_.REMARK01 as REMARK6_1_, tsuserstb0_.REMARK02 as REMARK7_1_, tsuserstb0_.STAORGNO as STAORGNO8_1_, tsuserstb0_.UPDASTAF as UPDASTAF9_1_, tsuserstb0_.UPDATIME as UPDATIM10_1_" - + "\n\t\t\t, tsuserstb0_.USERNAME as USERNAM11_1_, tsuserstb0_.USERPWD as USERPWD12_1_, tsuserstb0_.USERSTATE as USERSTA13_1_" - + "\n\t\tfrom TS_USERSTB tsuserstb0_" - + "\n\t\tfetch first 20 rows only" - + "\n\t\t) inner2_" - + "\n\t) inner1_" - + "\nwhere rownumber_ > 10" - + "\norder by rownumber_", // + Assert.assertEquals("select *\n" + + "from (\n" + + "\tselect inner2_.*, rownumber() over (order by order of inner2_) as rownumber_\n" + + "\tfrom (\n" + + "\t\tselect tsuserstb0_.USERID as USERID1_1_, tsuserstb0_.CREASTAF as CREASTAF2_1_, tsuserstb0_.CREATIME as CREATIME3_1_, tsuserstb0_.LOCORGNO as LOCORGNO4_1_, tsuserstb0_.PWDMODIFYTIME as PWDMODIF5_1_\n" + + "\t\t\t, tsuserstb0_.REMARK01 as REMARK6_1_, tsuserstb0_.REMARK02 as REMARK7_1_, tsuserstb0_.STAORGNO as STAORGNO8_1_, tsuserstb0_.UPDASTAF as UPDASTAF9_1_, tsuserstb0_.UPDATIME as UPDATIM10_1_\n" + + "\t\t\t, tsuserstb0_.USERNAME as USERNAM11_1_, tsuserstb0_.USERPWD as USERPWD12_1_, tsuserstb0_.USERSTATE as USERSTA13_1_\n" + + "\t\tfrom TS_USERSTB tsuserstb0_\n" + + "\t\tfetch first 20 rows only\n" + + "\t) inner2_\n" + + ") inner1_\n" + + "where rownumber_ > 10\n" + + "order by rownumber_", // SQLUtils.toSQLString(stmt, JdbcConstants.DB2, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_5.java b/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_5.java index c702a97885..8b676241d5 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_5.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/db2/DB2SelectTest_5.java @@ -73,18 +73,20 @@ public class DB2SelectTest_5 extends DB2Test { // Assert.assertTrue(visitor.getColumns().contains(new Column("mytable", "full_name"))); String output = SQLUtils.toSQLString(stmt, JdbcConstants.DB2); - Assert.assertEquals("SELECT *"// - + "\nFROM (SELECT TEMP_TAB.*, ROWNUMBER() OVER () AS IDX"// - + "\n\tFROM (SELECT DISTINCT OH.ORDER_ID"// - + "\n\t\tFROM ORDER_HEADER OH, ORDER_ITEM OI, ORDER_PAYMENT_PERFERENCE OPP, ORDER_SHIPMENT_PERFERENCE OSP"// - + "\n\t\tWHERE OH.ORDER_ID = OI.ORDER_ID"// - + "\n\t\t\tAND OH.ORDER_ID = OPP.ORDER_ID"// - + "\n\t\t\tAND OH.ORDER_ID = OSP.ORDER_ID"// - + "\n\t\t\tAND OH.ORDER_ID = ?"// - + "\n\t\t) TEMP_TAB"// - + "\n\t) TEMP_TAB_WITH_IDX"// - + "\nWHERE TEMP_TAB_WITH_IDX.IDX > 0"// - + "\n\tAND TEMP_TAB_WITH_IDX.IDX <= 20", // + Assert.assertEquals("SELECT *\n" + + "FROM (\n" + + "\tSELECT TEMP_TAB.*, ROWNUMBER() OVER () AS IDX\n" + + "\tFROM (\n" + + "\t\tSELECT DISTINCT OH.ORDER_ID\n" + + "\t\tFROM ORDER_HEADER OH, ORDER_ITEM OI, ORDER_PAYMENT_PERFERENCE OPP, ORDER_SHIPMENT_PERFERENCE OSP\n" + + "\t\tWHERE OH.ORDER_ID = OI.ORDER_ID\n" + + "\t\t\tAND OH.ORDER_ID = OPP.ORDER_ID\n" + + "\t\t\tAND OH.ORDER_ID = OSP.ORDER_ID\n" + + "\t\t\tAND OH.ORDER_ID = ?\n" + + "\t) TEMP_TAB\n" + + ") TEMP_TAB_WITH_IDX\n" + + "WHERE TEMP_TAB_WITH_IDX.IDX > 0\n" + + "\tAND TEMP_TAB_WITH_IDX.IDX <= 20", // output); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/CobarHintsTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/CobarHintsTest.java index 7739948e1e..ffe9e2f599 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/CobarHintsTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/CobarHintsTest.java @@ -37,14 +37,16 @@ public class CobarHintsTest extends TestCase { ") b Order by product_id desc ) a limit 25 offset (1-1)*20"; String mergedSql = ParameterizedOutputVisitorUtils.parameterize(sql, JdbcUtils.POSTGRESQL); - Assert.assertEquals("SELECT product_id, noeff_days, total_cnt" - + "\nFROM (SELECT product_id, noeff_days, COUNT(*) OVER () AS total_cnt" - + "\n\tFROM (SELECT product_id, noeff_days" - + "\n\t\tFROM ireport.dm_mdm_mem_prod_noeff_sdt0" - + "\n\t\tWHERE admin_member_seq = ?" - + "\n\t\t) b" - + "\n\tORDER BY product_id DESC" - + "\n\t) a" - + "\nLIMIT ? OFFSET (? - ?) * ?", mergedSql); + Assert.assertEquals("SELECT product_id, noeff_days, total_cnt\n" + + "FROM (\n" + + "\tSELECT product_id, noeff_days, COUNT(*) OVER () AS total_cnt\n" + + "\tFROM (\n" + + "\t\tSELECT product_id, noeff_days\n" + + "\t\tFROM ireport.dm_mdm_mem_prod_noeff_sdt0\n" + + "\t\tWHERE admin_member_seq = ?\n" + + "\t) b\n" + + "\tORDER BY product_id DESC\n" + + ") a\n" + + "LIMIT ? OFFSET (? - ?) * ?", mergedSql); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_3.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_3.java index 6c6d871815..e470a13403 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_3.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlDeleteTest_3.java @@ -42,38 +42,44 @@ public class MySqlDeleteTest_3 extends MysqlTest { MySqlStatementParser parser = new MySqlStatementParser(sql); List statementList = parser.parseStatementList(); SQLStatement stmt = statementList.get(0); - Assert.assertEquals("DELETE FROM t1" - + "\nWHERE s11 > ANY (SELECT COUNT(*)" - + "\n\t\tFROM t2" - + "\n\t\tWHERE NOT EXISTS (" - + "\n\t\t\tSELECT *" - + "\n\t\t\tFROM t3" - + "\n\t\t\tWHERE ROW(5 * t2.s1, 77) = (" - + "\n\t\t\t\t(SELECT 50, 11 * s1" - + "\n\t\t\t\tFROM t4)" - + "\n\t\t\t\tUNION" - + "\n\t\t\t\t(SELECT 50, 77" - + "\n\t\t\t\tFROM (SELECT *" - + "\n\t\t\t\t\tFROM t5" - + "\n\t\t\t\t\t) t5)" - + "\n\t\t\t\t)" - + "\n\t\t\t))", SQLUtils.toMySqlString(stmt)); - Assert.assertEquals("delete from t1" - + "\nwhere s11 > any (select count(*)" - + "\n\t\tfrom t2" - + "\n\t\twhere not exists (" - + "\n\t\t\tselect *" - + "\n\t\t\tfrom t3" - + "\n\t\t\twhere ROW(5 * t2.s1, 77) = (" - + "\n\t\t\t\t(select 50, 11 * s1" - + "\n\t\t\t\tfrom t4)" - + "\n\t\t\t\tunion" - + "\n\t\t\t\t(select 50, 77" - + "\n\t\t\t\tfrom (select *" - + "\n\t\t\t\t\tfrom t5" - + "\n\t\t\t\t\t) t5)" - + "\n\t\t\t\t)" - + "\n\t\t\t))", SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); + Assert.assertEquals("DELETE FROM t1\n" + + "WHERE s11 > ANY (\n" + + "\t\tSELECT COUNT(*)\n" + + "\t\tFROM t2\n" + + "\t\tWHERE NOT EXISTS (\n" + + "\t\t\tSELECT *\n" + + "\t\t\tFROM t3\n" + + "\t\t\tWHERE ROW(5 * t2.s1, 77) = (\n" + + "\t\t\t\t(SELECT 50, 11 * s1\n" + + "\t\t\t\tFROM t4)\n" + + "\t\t\t\tUNION\n" + + "\t\t\t\t(SELECT 50, 77\n" + + "\t\t\t\tFROM (\n" + + "\t\t\t\t\tSELECT *\n" + + "\t\t\t\t\tFROM t5\n" + + "\t\t\t\t) t5)\n" + + "\t\t\t\t)\n" + + "\t\t\t)\n" + + "\t)", SQLUtils.toMySqlString(stmt)); + assertEquals("delete from t1\n" + + "where s11 > any (\n" + + "\t\tselect count(*)\n" + + "\t\tfrom t2\n" + + "\t\twhere not exists (\n" + + "\t\t\tselect *\n" + + "\t\t\tfrom t3\n" + + "\t\t\twhere ROW(5 * t2.s1, 77) = (\n" + + "\t\t\t\t(select 50, 11 * s1\n" + + "\t\t\t\tfrom t4)\n" + + "\t\t\t\tunion\n" + + "\t\t\t\t(select 50, 77\n" + + "\t\t\t\tfrom (\n" + + "\t\t\t\t\tselect *\n" + + "\t\t\t\t\tfrom t5\n" + + "\t\t\t\t) t5)\n" + + "\t\t\t\t)\n" + + "\t\t\t)\n" + + "\t)", SQLUtils.toMySqlString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); Assert.assertEquals(1, statementList.size()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/SELECT_Syntax_Test.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/SELECT_Syntax_Test.java index c43f7d405d..e4c5429641 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/SELECT_Syntax_Test.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/SELECT_Syntax_Test.java @@ -162,7 +162,12 @@ public class SELECT_Syntax_Test extends TestCase { String text = output(stmtList); - Assert.assertEquals("SELECT s1\nFROM t1\nWHERE s1 = SOME (SELECT s1\n\tFROM t2);", text); + assertEquals("SELECT s1\n" + + "FROM t1\n" + + "WHERE s1 = SOME (\n" + + "\tSELECT s1\n" + + "\tFROM t2\n" + + ");", text); } public void test_10() throws Exception { @@ -173,7 +178,12 @@ public class SELECT_Syntax_Test extends TestCase { String text = output(stmtList); - Assert.assertEquals("SELECT s1\nFROM t1\nWHERE s1 = ANY (SELECT s1\n\tFROM t2);", text); + Assert.assertEquals("SELECT s1\n" + + "FROM t1\n" + + "WHERE s1 = ANY (\n" + + "\tSELECT s1\n" + + "\tFROM t2\n" + + ");", text); } public void test_11() throws Exception { @@ -184,7 +194,12 @@ public class SELECT_Syntax_Test extends TestCase { String text = output(stmtList); - Assert.assertEquals("SELECT s1\nFROM t1\nWHERE s1 > ALL (SELECT s1\n\tFROM t2);", text); + assertEquals("SELECT s1\n" + + "FROM t1\n" + + "WHERE s1 > ALL (\n" + + "\tSELECT s1\n" + + "\tFROM t2\n" + + ");", text); } public void test_12() throws Exception { diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_22.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_22.java index 7cc9c2c5a9..0e56cda110 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_22.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/param/MySqlParameterizedOutputVisitorTest_22.java @@ -30,7 +30,8 @@ public class MySqlParameterizedOutputVisitorTest_22 extends TestCase { "\t, `f`.`feature`, `f`.`domain_option`, `f`.`version`, `f`.`reference_type`, `f`.`dentry_type`\n" + "\t, `f`.`space_id`, `f`.`extension`, `f`.`creator_id`, `f`.`modifier_id`, `f`.`store_type`\n" + "\t, `f`.`link_mark`, `f`.`content_type`\n" + - "FROM (SELECT vfs_dentry.`id`\n" + + "FROM (\n" + + "\tSELECT vfs_dentry.`id`\n" + "\tFROM vfs_dentry FORCE INDEX (idx_gmt)\n" + "\tWHERE vfs_dentry.`extra_str1` = ?\n" + "\t\tAND vfs_dentry.`biz_id` = ?\n" + @@ -38,7 +39,7 @@ public class MySqlParameterizedOutputVisitorTest_22 extends TestCase { "\t\tAND vfs_dentry.`user_id` = ?\n" + "\t\tAND vfs_dentry.`dentry_type` = ?\n" + "\tLIMIT ?, ?\n" + - "\t) `t`\n" + + ") `t`\n" + "\tJOIN vfs_dentry `f` ON `t`.`id` = `f`.`id`\n" + "WHERE `t`.`id` = `f`.`id`\n" + "\tAND `f`.`user_id` = ?", psql); @@ -75,7 +76,8 @@ public class MySqlParameterizedOutputVisitorTest_22 extends TestCase { "\t, `f`.`feature`, `f`.`domain_option`, `f`.`version`, `f`.`reference_type`, `f`.`dentry_type`\n" + "\t, `f`.`space_id`, `f`.`extension`, `f`.`creator_id`, `f`.`modifier_id`, `f`.`store_type`\n" + "\t, `f`.`link_mark`, `f`.`content_type`\n" + - "FROM (SELECT vfs_dentry_001.`id`\n" + + "FROM (\n" + + "\tSELECT vfs_dentry_001.`id`\n" + "\tFROM vfs_dentry_001 FORCE INDEX (idx_gmt)\n" + "\tWHERE vfs_dentry_001.`extra_str1` = ?\n" + "\t\tAND vfs_dentry_001.`biz_id` = ?\n" + @@ -83,7 +85,7 @@ public class MySqlParameterizedOutputVisitorTest_22 extends TestCase { "\t\tAND vfs_dentry_001.`user_id` = ?\n" + "\t\tAND vfs_dentry_001.`dentry_type` = ?\n" + "\tLIMIT ?, ?\n" + - "\t) `t`\n" + + ") `t`\n" + "\tJOIN vfs_dentry_001 `f` ON `t`.`id` = `f`.`id`\n" + "WHERE `t`.`id` = `f`.`id`\n" + "\tAND `f`.`user_id` = ?", buf.toString()); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_12.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_12.java index 3d76c86213..a574ffc6be 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_12.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/select/MySqlSelectTest_12.java @@ -55,16 +55,17 @@ public class MySqlSelectTest_12 extends MysqlTest { Assert.assertEquals(1, visitor.getTables().size()); Assert.assertEquals(5, visitor.getColumns().size()); Assert.assertEquals(0, visitor.getConditions().size()); - Assert.assertEquals(1, visitor.getOrderByColumns().size()); + assertEquals(1, visitor.getOrderByColumns().size()); Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("ub_userdiscuss"))); String output = SQLUtils.toMySqlString(stmt); - Assert.assertEquals("SELECT COUNT(*) AS a" + // - "\nFROM (SELECT nickname, mobile, comment, createdate" + // - "\n\tFROM ub_userdiscuss" + // - "\n\tORDER BY discuss_id DESC" + // - "\n\t) b", // + assertEquals("SELECT COUNT(*) AS a\n" + + "FROM (\n" + + "\tSELECT nickname, mobile, comment, createdate\n" + + "\tFROM ub_userdiscuss\n" + + "\tORDER BY discuss_id DESC\n" + + ") b", // output); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest8.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest8.java index 65351d20b3..65ee73576e 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest8.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/OracleMergeTest8.java @@ -42,22 +42,23 @@ public class OracleMergeTest8 extends OracleTest { List stmtList = parser.parseStatementList(); SQLMergeStatement mergeStatement = (SQLMergeStatement) stmtList.get(0); String result = SQLUtils.toOracleString(mergeStatement); - Assert.assertEquals("MERGE INTO (SELECT *" - + "\n\tFROM T09_RULE_CAL_COUNT" - + "\n\tWHERE data_dt = '20160328'" - + "\n\t\tAND rule_type = '2'" - + "\n\t) t" - + "\nUSING (" - + "\n\tSELECT cust_no, organ_key" - + "\n\tFROM (" - + "\n\t\tSELECT t1.cust_no, t1.organ_key" - + "\n\t\tFROM t08_cust_result_c_mid t1" - + "\n\t\tUNION" - + "\n\t\tSELECT t2.cust_no, t2.organ_key" - + "\n\t\tFROM t08_cust_result_i_mid t2" - + "\n\t)" - + "\n) t3 ON (t3.cust_no = t.cust_no) " - + "\nWHEN MATCHED THEN UPDATE SET t.organ_key = t3.organ_key", + Assert.assertEquals("MERGE INTO (\n" + + "\tSELECT *\n" + + "\tFROM T09_RULE_CAL_COUNT\n" + + "\tWHERE data_dt = '20160328'\n" + + "\t\tAND rule_type = '2'\n" + + ") t\n" + + "USING (\n" + + "\tSELECT cust_no, organ_key\n" + + "\tFROM (\n" + + "\t\tSELECT t1.cust_no, t1.organ_key\n" + + "\t\tFROM t08_cust_result_c_mid t1\n" + + "\t\tUNION\n" + + "\t\tSELECT t2.cust_no, t2.organ_key\n" + + "\t\tFROM t08_cust_result_i_mid t2\n" + + "\t)\n" + + ") t3 ON (t3.cust_no = t.cust_no) \n" + + "WHEN MATCHED THEN UPDATE SET t.organ_key = t3.organ_key", result); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "employee_id"))); // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerRowNumberTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerRowNumberTest2.java index 0f2dbf911d..b3ffe9fc2f 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerRowNumberTest2.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerRowNumberTest2.java @@ -38,19 +38,21 @@ public class SQLServerRowNumberTest2 extends TestCase { SQLServerStatementParser parser = new SQLServerStatementParser(sql); SQLStatement stmt = parser.parseStatementList().get(0); - Assert.assertEquals("SELECT *" + - "\nFROM (SELECT ROW_NUMBER() OVER (ORDER BY FAlertDate DESC, FAlertLevel, FAlertType) AS RowNumber, *" + - "\n\tFROM monitor_business" + - "\n\tWHERE FRemoveAlert = ?" + - "\n\t) temp_table" + - "\nWHERE RowNumber BETWEEN ? AND ?", SQLUtils.toSQLServerString(stmt)); + assertEquals("SELECT *\n" + + "FROM (\n" + + "\tSELECT ROW_NUMBER() OVER (ORDER BY FAlertDate DESC, FAlertLevel, FAlertType) AS RowNumber, *\n" + + "\tFROM monitor_business\n" + + "\tWHERE FRemoveAlert = ?\n" + + ") temp_table\n" + + "WHERE RowNumber BETWEEN ? AND ?", SQLUtils.toSQLServerString(stmt)); - Assert.assertEquals("select *" + - "\nfrom (select row_number() over (order by FAlertDate desc, FAlertLevel, FAlertType) as RowNumber, *" + - "\n\tfrom monitor_business" + - "\n\twhere FRemoveAlert = ?" + - "\n\t) temp_table" + - "\nwhere RowNumber between ? and ?", SQLUtils.toSQLServerString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); + assertEquals("select *\n" + + "from (\n" + + "\tselect row_number() over (order by FAlertDate desc, FAlertLevel, FAlertType) as RowNumber, *\n" + + "\tfrom monitor_business\n" + + "\twhere FRemoveAlert = ?\n" + + ") temp_table\n" + + "where RowNumber between ? and ?", SQLUtils.toSQLServerString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); } public void test_isEmpty_2() throws Exception { @@ -66,18 +68,20 @@ public class SQLServerRowNumberTest2 extends TestCase { SQLServerStatementParser parser = new SQLServerStatementParser(sql); SQLStatement stmt = parser.parseStatementList().get(0); - Assert.assertEquals("SELECT *" + - "\nFROM (SELECT ROW_NUMBER() OVER (ORDER BY FAlertDate DESC, FAlertLevel, FAlertType) AS RowNumber, *" + - "\n\tFROM monitor_business" + - "\n\tWHERE FRemoveAlert = ?" + - "\n\t) temp_table" + - "\nWHERE RowNumber NOT BETWEEN ? AND ?", SQLUtils.toSQLServerString(stmt)); + Assert.assertEquals("SELECT *\n" + + "FROM (\n" + + "\tSELECT ROW_NUMBER() OVER (ORDER BY FAlertDate DESC, FAlertLevel, FAlertType) AS RowNumber, *\n" + + "\tFROM monitor_business\n" + + "\tWHERE FRemoveAlert = ?\n" + + ") temp_table\n" + + "WHERE RowNumber NOT BETWEEN ? AND ?", SQLUtils.toSQLServerString(stmt)); - Assert.assertEquals("select *" + - "\nfrom (select row_number() over (order by FAlertDate desc, FAlertLevel, FAlertType) as RowNumber, *" + - "\n\tfrom monitor_business" + - "\n\twhere FRemoveAlert = ?" + - "\n\t) temp_table" + - "\nwhere RowNumber not between ? and ?", SQLUtils.toSQLServerString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); + assertEquals("select *\n" + + "from (\n" + + "\tselect row_number() over (order by FAlertDate desc, FAlertLevel, FAlertType) as RowNumber, *\n" + + "\tfrom monitor_business\n" + + "\twhere FRemoveAlert = ?\n" + + ") temp_table\n" + + "where RowNumber not between ? and ?", SQLUtils.toSQLServerString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION)); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest12.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest12.java index 9c55f5b916..3cad341df7 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest12.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest12.java @@ -33,12 +33,13 @@ public class SQLServerSelectTest12 extends TestCase { ") AS ProductsWithRowNumbers " + // "WHERE Row >= 6 AND Row <= 10"; - String expect = "SELECT Row, Name" + // - "\nFROM (SELECT ROW_NUMBER() OVER (ORDER BY ProductID) AS Row, Name" + // - "\n\tFROM Product" + // - "\n\t) ProductsWithRowNumbers" + // - "\nWHERE Row >= 6" + // - "\n\tAND Row <= 10"; + String expect = "SELECT Row, Name\n" + + "FROM (\n" + + "\tSELECT ROW_NUMBER() OVER (ORDER BY ProductID) AS Row, Name\n" + + "\tFROM Product\n" + + ") ProductsWithRowNumbers\n" + + "WHERE Row >= 6\n" + + "\tAND Row <= 10"; SQLServerStatementParser parser = new SQLServerStatementParser(sql); SQLStatement stmt = parser.parseStatementList().get(0); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest13.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest13.java index b7def47ed3..33a8b04add 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest13.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest13.java @@ -66,22 +66,23 @@ public class SQLServerSelectTest13 extends TestCase { " a. ROW NOT BETWEEN (?+ 1) " + // "AND (?+?)"; // - String expect = "SELECT a.*" + - "\nFROM (SELECT ROW_NUMBER() OVER (ORDER BY a.time_add DESC) AS ROW, a.detail_no AS detailNo, a.ba_id AS baId, a.ba_name AS baName, a.tran_no AS tranNo" + - "\n\t\t, a.tran_name AS tranName, a.tran_type AS tranType, a.balance_type AS balanceType, a.detail_income AS detailIncome, a.detail_payout AS detailPayout" + - "\n\t\t, a.before_balance AS beforeBalance, a.after_balance AS afterBalance, a.time_add AS timeAdd, a.user_add AS userAdd, a.remark AS remark" + - "\n\t\t, (" + - "\n\t\t\tSELECT TOP 1 t.param_name" + - "\n\t\t\tFROM config.sys_params t" + - "\n\t\t\tWHERE t.param_type = ?" + - "\n\t\t\t\tAND t.param_value = a.tran_type" + - "\n\t\t\t) AS tranTypeName" + - "\n\tFROM bussiness.account_detail a" + - "\n\tWHERE 1 = 1" + - "\n\t\tAND a.time_add >= ?" + - "\n\t\tAND a.time_add <= ?" + - "\n\t) a" + - "\nWHERE a.ROW NOT BETWEEN ? + 1 AND ? + ?"; + String expect = "SELECT a.*\n" + + "FROM (\n" + + "\tSELECT ROW_NUMBER() OVER (ORDER BY a.time_add DESC) AS ROW, a.detail_no AS detailNo, a.ba_id AS baId, a.ba_name AS baName, a.tran_no AS tranNo\n" + + "\t\t, a.tran_name AS tranName, a.tran_type AS tranType, a.balance_type AS balanceType, a.detail_income AS detailIncome, a.detail_payout AS detailPayout\n" + + "\t\t, a.before_balance AS beforeBalance, a.after_balance AS afterBalance, a.time_add AS timeAdd, a.user_add AS userAdd, a.remark AS remark\n" + + "\t\t, (\n" + + "\t\t\tSELECT TOP 1 t.param_name\n" + + "\t\t\tFROM config.sys_params t\n" + + "\t\t\tWHERE t.param_type = ?\n" + + "\t\t\t\tAND t.param_value = a.tran_type\n" + + "\t\t\t) AS tranTypeName\n" + + "\tFROM bussiness.account_detail a\n" + + "\tWHERE 1 = 1\n" + + "\t\tAND a.time_add >= ?\n" + + "\t\tAND a.time_add <= ?\n" + + ") a\n" + + "WHERE a.ROW NOT BETWEEN ? + 1 AND ? + ?"; SQLServerStatementParser parser = new SQLServerStatementParser(sql); SQLStatement stmt = parser.parseStatementList().get(0); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest14.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest14.java index ae7d88c760..396f88d73c 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest14.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest14.java @@ -65,33 +65,30 @@ public class SQLServerSelectTest14 extends TestCase { "WHERE " + // " a.ROW BETWEEN (10+2) AND 20 "; // - String expect = "SELECT a.*" - + // - "\nFROM (SELECT ROW_NUMBER() OVER (ORDER BY a.time_add DESC) AS ROW, a.detail_no AS detailNo, a.ba_id AS baId, a.ba_name AS baName, a.tran_no AS tranNo" - + // - "\n\t\t, a.tran_name AS tranName, a.tran_type AS tranType, a.balance_type AS balanceType, a.detail_income AS detailIncome, a.detail_payout AS detailPayout" - + // - "\n\t\t, a.before_balance AS beforeBalance, a.after_balance AS afterBalance, a.time_add AS timeAdd, a.user_add AS userAdd, a.remark AS remark" - + // - "\n\t\t, (" + // - "\n\t\t\tSELECT TOP 1 t.param_name" + // - "\n\t\t\tFROM config.sys_params t" + // - "\n\t\t\tWHERE t.param_type = 2" + // - "\n\t\t\t\tAND t.param_value = a.tran_type" + // - "\n\t\t\t) AS tranTypeName" + // - "\n\tFROM bussiness.account_detail a" + // - "\n\tWHERE 1 = 1" + // - "\n\t\tAND a.time_add >= 2" + // - "\n\t\tAND a.time_add <= 3" + // - "\n\t) a" + // - "\nWHERE a.ROW BETWEEN 10 + 2 AND 20"; + String expect = "SELECT a.*\n" + + "FROM (\n" + + "\tSELECT ROW_NUMBER() OVER (ORDER BY a.time_add DESC) AS ROW, a.detail_no AS detailNo, a.ba_id AS baId, a.ba_name AS baName, a.tran_no AS tranNo\n" + + "\t\t, a.tran_name AS tranName, a.tran_type AS tranType, a.balance_type AS balanceType, a.detail_income AS detailIncome, a.detail_payout AS detailPayout\n" + + "\t\t, a.before_balance AS beforeBalance, a.after_balance AS afterBalance, a.time_add AS timeAdd, a.user_add AS userAdd, a.remark AS remark\n" + + "\t\t, (\n" + + "\t\t\tSELECT TOP 1 t.param_name\n" + + "\t\t\tFROM config.sys_params t\n" + + "\t\t\tWHERE t.param_type = 2\n" + + "\t\t\t\tAND t.param_value = a.tran_type\n" + + "\t\t\t) AS tranTypeName\n" + + "\tFROM bussiness.account_detail a\n" + + "\tWHERE 1 = 1\n" + + "\t\tAND a.time_add >= 2\n" + + "\t\tAND a.time_add <= 3\n" + + ") a\n" + + "WHERE a.ROW BETWEEN 10 + 2 AND 20"; SQLServerStatementParser parser = new SQLServerStatementParser(sql); SQLStatement stmt = parser.parseStatementList().get(0); String text = TestUtils.outputSqlServer(stmt); - Assert.assertEquals(expect, text); + assertEquals(expect, text); // System.out.println(text); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest2.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest2.java index f34e33f080..6a4db75f76 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest2.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerSelectTest2.java @@ -27,12 +27,13 @@ public class SQLServerSelectTest2 extends TestCase { public void test_isEmpty() throws Exception { String sql = "SELECT TOP 1 name FROM (SELECT TOP 9 name FROM master..syslogins ORDER BY name ASC) sq ORDER BY name DESC "; - String expect = "SELECT TOP 1 name\n" + // - "FROM (SELECT TOP 9 name\n" + // - "\tFROM master..syslogins\n" + // - "\tORDER BY name ASC\n" + // - "\t) sq\n" + // - "ORDER BY name DESC"; + String expect = "SELECT TOP 1 name\n" + + "FROM (\n" + + "\tSELECT TOP 9 name\n" + + "\tFROM master..syslogins\n" + + "\tORDER BY name ASC\n" + + ") sq\n" + + "ORDER BY name DESC"; SQLServerStatementParser parser = new SQLServerStatementParser(sql); SQLStatement stmt = parser.parseStatementList().get(0); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerUpdateTest.java b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerUpdateTest.java index e3d6015f3c..1ce5069c13 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerUpdateTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/sqlserver/SQLServerUpdateTest.java @@ -40,16 +40,17 @@ public class SQLServerUpdateTest extends TestCase { " ) b " + // "where a.FId = b.FId and a.FId = ?"; - String expect = "UPDATE reg_student_charge_item" + - "\nSET FAmountReceived = b.amount" + - "\nFROM reg_student_charge_item a, (SELECT a.FId, CASE WHEN SUM(b.FChargeAmount) IS NULL THEN 0 ELSE SUM(b.FChargeAmount) END AS amount" + - "\n\t\tFROM reg_student_charge_item a" + - "\n\t\t\tLEFT JOIN reg_student_charge_daybook b ON a.FId = b.FChargeItemId" + - "\n\t\tWHERE a.FId = ?" + - "\n\t\tGROUP BY a.FId" + - "\n\t\t) b" + - "\nWHERE a.FId = b.FId" + - "\n\tAND a.FId = ?"; + String expect = "UPDATE reg_student_charge_item\n" + + "SET FAmountReceived = b.amount\n" + + "FROM reg_student_charge_item a, (\n" + + "\t\tSELECT a.FId, CASE WHEN SUM(b.FChargeAmount) IS NULL THEN 0 ELSE SUM(b.FChargeAmount) END AS amount\n" + + "\t\tFROM reg_student_charge_item a\n" + + "\t\t\tLEFT JOIN reg_student_charge_daybook b ON a.FId = b.FChargeItemId\n" + + "\t\tWHERE a.FId = ?\n" + + "\t\tGROUP BY a.FId\n" + + "\t) b\n" + + "WHERE a.FId = b.FId\n" + + "\tAND a.FId = ?"; SQLServerStatementParser parser = new SQLServerStatementParser(sql); SQLStatement stmt = parser.parseStatementList().get(0); diff --git a/src/test/resources/bvt/parser/mysql-3.txt b/src/test/resources/bvt/parser/mysql-3.txt index 2f39323390..e476225e42 100644 --- a/src/test/resources/bvt/parser/mysql-3.txt +++ b/src/test/resources/bvt/parser/mysql-3.txt @@ -5,7 +5,8 @@ AND (1=0 OR c_URI in (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, GROUP BY c_URI) A --------------------------- SELECT COUNT(*) -FROM (SELECT COUNT(*) +FROM ( + SELECT COUNT(*) FROM m_web_uri_m5 WHERE monitor_item_id = ? AND app_num = ? @@ -17,4 +18,4 @@ FROM (SELECT COUNT(*) AND (1 = 0 OR c_URI IN (0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83)) GROUP BY c_URI - ) A \ No newline at end of file +) A \ No newline at end of file diff --git a/src/test/resources/bvt/parser/mysql-8.txt b/src/test/resources/bvt/parser/mysql-8.txt index 99f1b41baa..86185787f5 100644 --- a/src/test/resources/bvt/parser/mysql-8.txt +++ b/src/test/resources/bvt/parser/mysql-8.txt @@ -7,13 +7,13 @@ WHERE a.examine_id = b.examine_id --------------------------- SELECT a.examine_id AS examineId, a.examine_name AS examineName, a.level_limit AS levelLimit -FROM c_examinepaper a, (SELECT examine_id +FROM c_examinepaper a, ( + (SELECT examine_id FROM c_examinepaper WHERE level_limit = ? - AND status = 1 + AND status = 1) MINUS - SELECT DISTINCT examine_id - FROM course - ) b + (SELECT DISTINCT examine_id + FROM course) + ) b WHERE a.examine_id = b.examine_id -