diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 42cf1616e9..6d77b0e11b 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -172,6 +172,8 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat private volatile boolean keepAlive = false; + private boolean asyncInit = false; + protected boolean killWhenSocketReadTimeout = false; public DruidDataSource(){ @@ -816,22 +818,24 @@ public class DruidDataSource extends DruidAbstractDataSource implements DruidDat SQLException connectError = null; - try { - // init connections - for (int i = 0, size = getInitialSize(); i < size; ++i) { - PhysicalConnectionInfo pyConnectInfo = createPhysicalConnection(); - DruidConnectionHolder holder = new DruidConnectionHolder(this, pyConnectInfo); - connections[poolingCount] = holder; - incrementPoolingCount(); - } + if (!asyncInit) { + try { + // init connections + for (int i = 0, size = getInitialSize(); i < size; ++i) { + PhysicalConnectionInfo pyConnectInfo = createPhysicalConnection(); + DruidConnectionHolder holder = new DruidConnectionHolder(this, pyConnectInfo); + connections[poolingCount] = holder; + incrementPoolingCount(); + } - if (poolingCount > 0) { - poolingPeak = poolingCount; - poolingPeakTime = System.currentTimeMillis(); + if (poolingCount > 0) { + poolingPeak = poolingCount; + poolingPeakTime = System.currentTimeMillis(); + } + } catch (SQLException ex) { + LOG.error("init datasource error, url: " + this.getUrl(), ex); + connectError = ex; } - } catch (SQLException ex) { - LOG.error("init datasource error, url: " + this.getUrl(), ex); - connectError = ex; } createAndLogThread(); diff --git a/src/main/java/com/alibaba/druid/proxy/jdbc/PreparedStatementProxyImpl.java b/src/main/java/com/alibaba/druid/proxy/jdbc/PreparedStatementProxyImpl.java index 8aee65bee6..1d8213ecd5 100644 --- a/src/main/java/com/alibaba/druid/proxy/jdbc/PreparedStatementProxyImpl.java +++ b/src/main/java/com/alibaba/druid/proxy/jdbc/PreparedStatementProxyImpl.java @@ -100,7 +100,7 @@ public class PreparedStatementProxyImpl extends StatementProxyImpl implements Pr this.statement = statement; } - void setParameter(int jdbcIndex, JdbcParameter parameter) { + public void setParameter(int jdbcIndex, JdbcParameter parameter) { int index = jdbcIndex - 1; if (jdbcIndex > parametersSize) { diff --git a/src/main/java/com/alibaba/druid/sql/SQLTransformUtils.java b/src/main/java/com/alibaba/druid/sql/SQLTransformUtils.java index bc0aadc22b..040f1e2a4c 100644 --- a/src/main/java/com/alibaba/druid/sql/SQLTransformUtils.java +++ b/src/main/java/com/alibaba/druid/sql/SQLTransformUtils.java @@ -23,7 +23,6 @@ import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleSysdateExpr; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.*; import com.alibaba.druid.util.FnvHash; -import oracle.jdbc.rowset.OracleJoinable; import java.util.List; @@ -553,6 +552,8 @@ public class SQLTransformUtils { SQLExpr arg0 = argumentns.get(0); if (arg0 instanceof SQLNumericLiteralExpr) { len = ((SQLNumericLiteralExpr) arg0).getNumber().intValue(); + } else if (arg0 instanceof SQLVariantRefExpr) { + len = 2000; } else { throw new UnsupportedOperationException(SQLUtils.toOracleString(x)); } @@ -680,6 +681,53 @@ public class SQLTransformUtils { return xx; } + if (nameHashCode64 == FnvHash.Constants.USERENV) { + if (x.getParameters().size() == 1) { + SQLExpr param0 = x.getParameters().get(0); + if (param0 instanceof SQLCharExpr) { + String text = ((SQLCharExpr) param0).getText(); + if ("SESSIONID".equalsIgnoreCase(text)) { + SQLMethodInvokeExpr xx = new SQLMethodInvokeExpr(); + xx.setMethodName("get_session_id"); + xx.setParent(x.getParent()); + return xx; + } + } + } + } + + if (nameHashCode64 == FnvHash.Constants.USERENV) { + if (x.getParameters().size() == 1) { + SQLExpr param0 = x.getParameters().get(0); + if (param0 instanceof SQLCharExpr) { + String text = ((SQLCharExpr) param0).getText(); + if ("SESSIONID".equalsIgnoreCase(text)) { + SQLMethodInvokeExpr xx = new SQLMethodInvokeExpr(); + xx.setMethodName("get_session_id"); + xx.setParent(x.getParent()); + return xx; + } + } + } + } + + if (nameHashCode64 == FnvHash.Constants.NUMTODSINTERVAL) { + if (x.getParameters().size() == 2) { + SQLExpr param0 = x.getParameters().get(0); + SQLExpr param1 = x.getParameters().get(1); + + if (param0 instanceof SQLIntegerExpr && param1 instanceof SQLCharExpr) { + String text = ((SQLCharExpr) param1).getText(); + if ("DAY".equalsIgnoreCase(text)) { + SQLIntervalExpr intervalExpr = new SQLIntervalExpr(); + intervalExpr.setValue(new SQLCharExpr(param0.toString() + " DAYS")); + intervalExpr.setParent(x.getParent()); + return intervalExpr; + } + } + } + } + return x; } diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLExpr.java b/src/main/java/com/alibaba/druid/sql/ast/SQLExpr.java index f5a6fd8aa8..b039decb12 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLExpr.java @@ -15,7 +15,10 @@ */ package com.alibaba.druid.sql.ast; +import java.util.List; + public interface SQLExpr extends SQLObject, Cloneable { SQLExpr clone(); SQLDataType computeDataType(); + List getChildren(); } diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLStatement.java b/src/main/java/com/alibaba/druid/sql/ast/SQLStatement.java index d407202f03..0a17054651 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLStatement.java @@ -15,9 +15,12 @@ */ package com.alibaba.druid.sql.ast; +import java.util.List; + public interface SQLStatement extends SQLObject { String getDbType(); boolean isAfterSemi(); void setAfterSemi(boolean afterSemi); SQLStatement clone(); + List getChildren(); } diff --git a/src/main/java/com/alibaba/druid/sql/ast/SQLStatementImpl.java b/src/main/java/com/alibaba/druid/sql/ast/SQLStatementImpl.java index 71277a136b..a7d05bfe1a 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/SQLStatementImpl.java +++ b/src/main/java/com/alibaba/druid/sql/ast/SQLStatementImpl.java @@ -50,6 +50,10 @@ public abstract class SQLStatementImpl extends SQLObjectImpl implements SQLState throw new UnsupportedOperationException(this.getClass().getName()); } + public List getChildren() { + throw new UnsupportedOperationException(this.getClass().getName()); + } + public boolean isAfterSemi() { return afterSemi; } 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 a85706cf74..45e76bc842 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 @@ -17,6 +17,7 @@ package com.alibaba.druid.sql.ast.expr; import java.io.Serializable; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import com.alibaba.druid.sql.SQLUtils; @@ -140,6 +141,22 @@ public class SQLAggregateExpr extends SQLExprImpl implements Serializable, SQLRe visitor.endVisit(this); } + @Override + public List getChildren() { + List children = new ArrayList(); + children.addAll(this.arguments); + if (keep != null) { + children.add(this.keep); + } + if (over != null) { + children.add(over); + } + if (withinGroup != null) { + children.add(withinGroup); + } + return children; + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAllColumnExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAllColumnExpr.java index 7472f02cb4..6e14bbbe47 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAllColumnExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAllColumnExpr.java @@ -19,6 +19,9 @@ import com.alibaba.druid.sql.ast.SQLExprImpl; import com.alibaba.druid.sql.ast.statement.SQLTableSource; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.Collections; +import java.util.List; + public final class SQLAllColumnExpr extends SQLExprImpl { private transient SQLTableSource resolvedTableSource; @@ -57,4 +60,9 @@ public final class SQLAllColumnExpr extends SQLExprImpl { public void setResolvedTableSource(SQLTableSource resolvedTableSource) { this.resolvedTableSource = resolvedTableSource; } + + @Override + public List getChildren() { + return Collections.emptyList(); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAllExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAllExpr.java index 2dad15903e..1e19b2efef 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAllExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAllExpr.java @@ -16,9 +16,13 @@ package com.alibaba.druid.sql.ast.expr; import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.Collections; +import java.util.List; + public final class SQLAllExpr extends SQLExprImpl { public SQLSelect subQuery; @@ -63,6 +67,10 @@ public final class SQLAllExpr extends SQLExprImpl { visitor.endVisit(this); } + public List getChildren() { + return Collections.singletonList(this.subQuery); + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAnyExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAnyExpr.java index 1e191a9da5..d2fd994a86 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAnyExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAnyExpr.java @@ -17,11 +17,13 @@ package com.alibaba.druid.sql.ast.expr; import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.ast.statement.SQLSelectItem; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.Collections; import java.util.List; public class SQLAnyExpr extends SQLExprImpl { @@ -68,6 +70,10 @@ public class SQLAnyExpr extends SQLExprImpl { visitor.endVisit(this); } + public List getChildren() { + return Collections.singletonList(this.subQuery); + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLArrayExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLArrayExpr.java index 7f4943001e..8edae5bfe6 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLArrayExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLArrayExpr.java @@ -20,6 +20,7 @@ import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLArrayExpr extends SQLExprImpl { @@ -66,6 +67,13 @@ public class SQLArrayExpr extends SQLExprImpl { visitor.endVisit(this); } + public List getChildren() { + List children = new ArrayList(); + children.add(this.expr); + children.addAll(this.values); + return children; + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBetweenExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBetweenExpr.java index efbedc81ac..01c5ac4983 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBetweenExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBetweenExpr.java @@ -16,10 +16,14 @@ package com.alibaba.druid.sql.ast.expr; import java.io.Serializable; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLBetweenExpr extends SQLExprImpl implements Serializable { @@ -69,6 +73,10 @@ public class SQLBetweenExpr extends SQLExprImpl implements Serializable { visitor.endVisit(this); } + public List getChildren() { + return Arrays.asList(this.testExpr, beginExpr, this.endExpr); + } + public SQLExpr getTestExpr() { return this.testExpr; } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryExpr.java index 12cbd0b664..eade2148be 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryExpr.java @@ -16,8 +16,12 @@ package com.alibaba.druid.sql.ast.expr; import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.Collections; +import java.util.List; + public class SQLBinaryExpr extends SQLExprImpl implements SQLLiteralExpr, SQLValuableExpr { private String value; @@ -63,6 +67,11 @@ public class SQLBinaryExpr extends SQLExprImpl implements SQLLiteralExpr, SQLVal return new SQLBinaryExpr(value); } + @Override + public List getChildren() { + return Collections.emptyList(); + } + @Override public boolean equals(Object obj) { if (this == obj) { diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOpExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOpExpr.java index 129d35e3dc..6da7287cef 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOpExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOpExpr.java @@ -17,6 +17,8 @@ package com.alibaba.druid.sql.ast.expr; import java.io.Serializable; import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; import java.util.List; import com.alibaba.druid.sql.SQLUtils; @@ -137,6 +139,11 @@ public class SQLBinaryOpExpr extends SQLExprImpl implements SQLReplaceable, Seri visitor.endVisit(this); } + @Override + public List getChildren() { + return Arrays.asList(this.left, this.right); + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOpExprGroup.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOpExprGroup.java index b84c4138b7..ae9cd49349 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOpExprGroup.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBinaryOpExprGroup.java @@ -18,6 +18,7 @@ package com.alibaba.druid.sql.ast.expr; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.visitor.SQLASTVisitor; import java.util.ArrayList; @@ -77,6 +78,11 @@ public class SQLBinaryOpExprGroup extends SQLExprImpl { return x; } + @Override + public List getChildren() { + return items; + } + public void add(SQLExpr item) { if (item != null) { item.setParent(this); diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBooleanExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBooleanExpr.java index 27af46114e..6893c21bc8 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBooleanExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLBooleanExpr.java @@ -22,6 +22,9 @@ import com.alibaba.druid.sql.ast.SQLExprImpl; import com.alibaba.druid.sql.ast.statement.SQLCharacterDataType; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.Collections; +import java.util.List; + public final class SQLBooleanExpr extends SQLExprImpl implements SQLExpr, SQLLiteralExpr, SQLValuableExpr { public static final SQLDataType DEFAULT_DATA_TYPE = new SQLDataTypeImpl(SQLDataType.Constants.BOOLEAN); @@ -93,6 +96,11 @@ public final class SQLBooleanExpr extends SQLExprImpl implements SQLExpr, SQLLit return new SQLBooleanExpr(value); } + @Override + public List getChildren() { + return Collections.emptyList(); + } + public static enum Type { ON_OFF } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLCaseExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLCaseExpr.java index 9b18daa02b..df0a4e7461 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLCaseExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLCaseExpr.java @@ -17,6 +17,7 @@ package com.alibaba.druid.sql.ast.expr; import java.io.Serializable; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import com.alibaba.druid.sql.SQLUtils; @@ -76,6 +77,19 @@ public class SQLCaseExpr extends SQLExprImpl implements SQLReplaceable, Serializ visitor.endVisit(this); } + @Override + public List getChildren() { + List children = new ArrayList(); + if (valueExpr != null) { + children.add(this.valueExpr); + } + children.addAll(this.items); + if (elseExpr != null) { + children.add(this.elseExpr); + } + return children; + } + @Override public boolean replace(SQLExpr expr, SQLExpr target) { if (valueExpr == expr) { diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLCaseStatement.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLCaseStatement.java index 06a39fcac5..6da44dd749 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLCaseStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLCaseStatement.java @@ -66,6 +66,17 @@ public class SQLCaseStatement extends SQLStatementImpl implements Serializable { visitor.endVisit(this); } + @Override + public List getChildren() { + List children = new ArrayList(); + if (valueExpr != null) { + children.add(valueExpr); + } + children.addAll(this.items); + children.addAll(this.elseStatements); + return children; + } + public static class Item extends SQLObjectImpl implements Serializable { private static final long serialVersionUID = 1L; diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLCastExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLCastExpr.java index 44d1998233..c7bfeadac6 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLCastExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLCastExpr.java @@ -21,6 +21,10 @@ import com.alibaba.druid.sql.ast.SQLExprImpl; import com.alibaba.druid.sql.ast.SQLObjectWithDataType; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + public class SQLCastExpr extends SQLExprImpl implements SQLObjectWithDataType { protected SQLExpr expr; @@ -60,6 +64,11 @@ public class SQLCastExpr extends SQLExprImpl implements SQLObjectWithDataType { visitor.endVisit(this); } + @Override + public List getChildren() { + return Arrays.asList(this.expr, this.dataType); + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLCharExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLCharExpr.java index 905caa147a..f1193a5a7b 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLCharExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLCharExpr.java @@ -17,10 +17,15 @@ package com.alibaba.druid.sql.ast.expr; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLDataType; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.statement.SQLCharacterDataType; import com.alibaba.druid.sql.visitor.SQLASTOutputVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + public class SQLCharExpr extends SQLTextLiteralExpr implements SQLValuableExpr{ public static final SQLDataType DEFAULT_DATA_TYPE = new SQLCharacterDataType("varchar"); @@ -62,4 +67,8 @@ public class SQLCharExpr extends SQLTextLiteralExpr implements SQLValuableExpr{ public SQLDataType computeDataType() { return DEFAULT_DATA_TYPE; } + + public List getChildren() { + return Collections.emptyList(); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLCurrentOfCursorExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLCurrentOfCursorExpr.java index c347303ba3..8db0f6b4a7 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLCurrentOfCursorExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLCurrentOfCursorExpr.java @@ -17,8 +17,12 @@ package com.alibaba.druid.sql.ast.expr; import com.alibaba.druid.sql.ast.SQLExprImpl; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.Collections; +import java.util.List; + public class SQLCurrentOfCursorExpr extends SQLExprImpl { private SQLName cursorName; @@ -64,6 +68,11 @@ public class SQLCurrentOfCursorExpr extends SQLExprImpl { visitor.endVisit(this); } + public List getChildren() { + return Collections.singletonList(this.cursorName); + } + + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLDateExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLDateExpr.java index f3cad98ba3..9382843ad8 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLDateExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLDateExpr.java @@ -17,11 +17,15 @@ package com.alibaba.druid.sql.ast.expr; import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.statement.SQLCharacterDataType; import com.alibaba.druid.sql.dialect.oracle.ast.expr.OracleExpr; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.Collections; +import java.util.List; + public class SQLDateExpr extends SQLExprImpl implements SQLLiteralExpr, SQLValuableExpr { public static final SQLDataType DEFAULT_DATA_TYPE = new SQLCharacterDataType("date"); @@ -86,4 +90,9 @@ public class SQLDateExpr extends SQLExprImpl implements SQLLiteralExpr, SQLValua public SQLDateExpr clone() { return new SQLDateExpr(literal); } + + @Override + public List getChildren() { + return Collections.emptyList(); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLDefaultExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLDefaultExpr.java index 7ac062a2d7..63680ef7a5 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLDefaultExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLDefaultExpr.java @@ -16,8 +16,13 @@ package com.alibaba.druid.sql.ast.expr; import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + public class SQLDefaultExpr extends SQLExprImpl implements SQLLiteralExpr { @Override @@ -43,4 +48,8 @@ public class SQLDefaultExpr extends SQLExprImpl implements SQLLiteralExpr { public SQLDefaultExpr clone() { return new SQLDefaultExpr(); } + + public List getChildren() { + return Collections.emptyList(); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLExistsExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLExistsExpr.java index 645f65dc6a..041b95d03f 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLExistsExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLExistsExpr.java @@ -16,6 +16,8 @@ package com.alibaba.druid.sql.ast.expr; import java.io.Serializable; +import java.util.Collections; +import java.util.List; import com.alibaba.druid.sql.ast.SQLExprImpl; import com.alibaba.druid.sql.ast.statement.SQLSelect; @@ -67,6 +69,11 @@ public final class SQLExistsExpr extends SQLExprImpl implements Serializable { visitor.endVisit(this); } + @Override + public List getChildren() { + return Collections.singletonList(this.subQuery); + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLFlashbackExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLFlashbackExpr.java index 96c8660410..8db975dea1 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLFlashbackExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLFlashbackExpr.java @@ -17,8 +17,12 @@ package com.alibaba.druid.sql.ast.expr; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.Collections; +import java.util.List; + /** * Created by wenshao on 14/06/2017. */ @@ -62,6 +66,11 @@ public class SQLFlashbackExpr extends SQLExprImpl { visitor.endVisit(this); } + @Override + public List getChildren() { + return Collections.singletonList(expr); + } + public SQLFlashbackExpr clone() { SQLFlashbackExpr x = new SQLFlashbackExpr(); x.type = this.type; diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLGroupingSetExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLGroupingSetExpr.java index 6f6474bd66..355f77ce51 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLGroupingSetExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLGroupingSetExpr.java @@ -16,10 +16,12 @@ package com.alibaba.druid.sql.ast.expr; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.statement.SQLExplainStatement; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -56,6 +58,11 @@ public class SQLGroupingSetExpr extends SQLExprImpl { visitor.endVisit(this); } + @Override + public List getChildren() { + return this.parameters; + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLHexExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLHexExpr.java index 63e8c03134..3b707762c5 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLHexExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLHexExpr.java @@ -19,6 +19,9 @@ import com.alibaba.druid.sql.ast.SQLExprImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; import com.alibaba.druid.util.HexBin; +import java.util.Collections; +import java.util.List; + public class SQLHexExpr extends SQLExprImpl implements SQLLiteralExpr, SQLValuableExpr { private final String hex; @@ -88,4 +91,9 @@ public class SQLHexExpr extends SQLExprImpl implements SQLLiteralExpr, SQLValuab public byte[] getValue() { return toBytes(); } + + @Override + public List getChildren() { + return Collections.emptyList(); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLIdentifierExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLIdentifierExpr.java index 1910778eb6..c26b64c53a 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLIdentifierExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLIdentifierExpr.java @@ -21,6 +21,9 @@ import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.visitor.SQLASTVisitor; import com.alibaba.druid.util.FnvHash; +import java.util.Collections; +import java.util.List; + public final class SQLIdentifierExpr extends SQLExprImpl implements SQLName { protected String name; private long hashCode64; @@ -212,4 +215,17 @@ public final class SQLIdentifierExpr extends SQLExprImpl implements SQLName { public boolean nameEquals(String name) { return SQLUtils.nameEquals(this.name, name); } + + @Override + public List getChildren() { + return Collections.emptyList(); + } + + public static boolean matchIgnoreCase(SQLExpr expr, String name) { + if (!(expr instanceof SQLIdentifierExpr)) { + return false; + } + SQLIdentifierExpr ident = (SQLIdentifierExpr) expr; + return ident.getName().equalsIgnoreCase(name); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLInListExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLInListExpr.java index 9816152cc2..4054429653 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLInListExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLInListExpr.java @@ -22,6 +22,7 @@ import java.util.List; import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.visitor.SQLASTVisitor; public final class SQLInListExpr extends SQLExprImpl implements Serializable { @@ -95,6 +96,15 @@ public final class SQLInListExpr extends SQLExprImpl implements Serializable { visitor.endVisit(this); } + public List getChildren() { + List children = new ArrayList(); + if (this.expr != null) { + children.add(this.expr); + } + children.addAll(this.targetList); + return children; + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLInSubQueryExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLInSubQueryExpr.java index c9143658e5..cf85fc4933 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLInSubQueryExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLInSubQueryExpr.java @@ -16,10 +16,14 @@ package com.alibaba.druid.sql.ast.expr; import java.io.Serializable; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -96,6 +100,10 @@ public class SQLInSubQueryExpr extends SQLExprImpl implements Serializable { visitor.endVisit(this); } + public List getChildren() { + return Arrays.asList(this.expr, this.subQuery); + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLIntegerExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLIntegerExpr.java index 0f0ce69d77..ea980d0c69 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLIntegerExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLIntegerExpr.java @@ -19,6 +19,9 @@ import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLDataTypeImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.Collections; +import java.util.List; + public class SQLIntegerExpr extends SQLNumericLiteralExpr implements SQLValuableExpr{ public static final SQLDataType DEFAULT_DATA_TYPE = new SQLDataTypeImpl("bigint"); @@ -93,4 +96,5 @@ public class SQLIntegerExpr extends SQLNumericLiteralExpr implements SQLValuable public SQLDataType computeDataType() { return DEFAULT_DATA_TYPE; } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlIntervalExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLIntervalExpr.java similarity index 71% rename from src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlIntervalExpr.java rename to src/main/java/com/alibaba/druid/sql/ast/expr/SQLIntervalExpr.java index c97249a5d4..d7be259c99 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlIntervalExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLIntervalExpr.java @@ -13,23 +13,25 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alibaba.druid.sql.dialect.mysql.ast.expr; +package com.alibaba.druid.sql.ast.expr; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLExprImpl; -import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; -public class MySqlIntervalExpr extends SQLExprImpl implements MySqlExpr { +import java.util.Collections; +import java.util.List; + +public class SQLIntervalExpr extends SQLExprImpl { private SQLExpr value; - private MySqlIntervalUnit unit; + private SQLIntervalUnit unit; - public MySqlIntervalExpr(){ + public SQLIntervalExpr(){ } - public MySqlIntervalExpr clone() { - MySqlIntervalExpr x = new MySqlIntervalExpr(); + public SQLIntervalExpr clone() { + SQLIntervalExpr x = new SQLIntervalExpr(); if (value != null) { x.setValue(value.clone()); } @@ -45,27 +47,34 @@ public class MySqlIntervalExpr extends SQLExprImpl implements MySqlExpr { this.value = value; } - public MySqlIntervalUnit getUnit() { + public SQLIntervalUnit getUnit() { return unit; } - public void setUnit(MySqlIntervalUnit unit) { + public void setUnit(SQLIntervalUnit unit) { this.unit = unit; } @Override public void output(StringBuffer buf) { + buf.append("INTERVAL "); value.output(buf); - buf.append(' '); - buf.append(unit.name()); + if (unit != null) { + buf.append(' '); + buf.append(unit.name()); + } } protected void accept0(SQLASTVisitor visitor) { - MySqlASTVisitor mysqlVisitor = (MySqlASTVisitor) visitor; - if (mysqlVisitor.visit(this)) { + if (visitor.visit(this)) { acceptChild(visitor, this.value); } - mysqlVisitor.endVisit(this); + visitor.endVisit(this); + } + + @Override + public List getChildren() { + return Collections.singletonList(value); } @Override @@ -88,7 +97,7 @@ public class MySqlIntervalExpr extends SQLExprImpl implements MySqlExpr { if (getClass() != obj.getClass()) { return false; } - MySqlIntervalExpr other = (MySqlIntervalExpr) obj; + SQLIntervalExpr other = (SQLIntervalExpr) obj; if (unit != other.unit) { return false; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlIntervalUnit.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLIntervalUnit.java similarity index 86% rename from src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlIntervalUnit.java rename to src/main/java/com/alibaba/druid/sql/ast/expr/SQLIntervalUnit.java index eb7d4c194f..490b1f0f0a 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlIntervalUnit.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLIntervalUnit.java @@ -13,9 +13,9 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.alibaba.druid.sql.dialect.mysql.ast.expr; +package com.alibaba.druid.sql.ast.expr; -public enum MySqlIntervalUnit { +public enum SQLIntervalUnit { YEAR, YEAR_MONTH, QUARTER, @@ -32,7 +32,7 @@ public enum MySqlIntervalUnit { public final String name_lcase; - private MySqlIntervalUnit() { + private SQLIntervalUnit() { this.name_lcase = name().toLowerCase(); } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLListExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLListExpr.java index a27c6387ce..960367920d 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLListExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLListExpr.java @@ -16,10 +16,12 @@ package com.alibaba.druid.sql.ast.expr; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLListExpr extends SQLExprImpl { @@ -85,4 +87,7 @@ public class SQLListExpr extends SQLExprImpl { return x; } + public List getChildren() { + return this.items; + } } 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 686bda1e45..044d7d892f 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 @@ -17,13 +17,11 @@ package com.alibaba.druid.sql.ast.expr; import java.io.Serializable; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import com.alibaba.druid.sql.SQLUtils; -import com.alibaba.druid.sql.ast.SQLDataType; -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLExprImpl; -import com.alibaba.druid.sql.ast.SQLReplaceable; +import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; import com.alibaba.druid.util.FnvHash; @@ -145,6 +143,17 @@ public class SQLMethodInvokeExpr extends SQLExprImpl implements SQLReplaceable, visitor.endVisit(this); } + public List getChildren() { + if (this.owner == null) { + return this.parameters; + } + + List children = new ArrayList(); + children.add(owner); + children.addAll(this.parameters); + return children; + } + protected void accept0(OracleASTVisitor visitor) { if (visitor.visit(this)) { acceptChild(visitor, this.owner); diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLNotExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLNotExpr.java index 97c5c7e6fa..9806b55ce4 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLNotExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLNotExpr.java @@ -16,6 +16,8 @@ package com.alibaba.druid.sql.ast.expr; import java.io.Serializable; +import java.util.Collections; +import java.util.List; import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLExpr; @@ -58,6 +60,11 @@ public final class SQLNotExpr extends SQLExprImpl implements Serializable { visitor.endVisit(this); } + @Override + public List getChildren() { + return Collections.singletonList(this.expr); + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLNullExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLNullExpr.java index c196496c3d..896630b245 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLNullExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLNullExpr.java @@ -18,6 +18,9 @@ package com.alibaba.druid.sql.ast.expr; import com.alibaba.druid.sql.ast.SQLExprImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.Collections; +import java.util.List; + import static com.alibaba.druid.sql.visitor.SQLEvalVisitor.EVAL_VALUE_NULL; public final class SQLNullExpr extends SQLExprImpl implements SQLLiteralExpr, SQLValuableExpr { @@ -52,4 +55,9 @@ public final class SQLNullExpr extends SQLExprImpl implements SQLLiteralExpr, SQ public SQLNullExpr clone() { return new SQLNullExpr(); } + + @Override + public List getChildren() { + return Collections.emptyList(); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLNumericLiteralExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLNumericLiteralExpr.java index 126ccc8e05..3ae3254116 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLNumericLiteralExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLNumericLiteralExpr.java @@ -17,6 +17,9 @@ package com.alibaba.druid.sql.ast.expr; import com.alibaba.druid.sql.ast.SQLExprImpl; +import java.util.Collections; +import java.util.List; + public abstract class SQLNumericLiteralExpr extends SQLExprImpl implements SQLLiteralExpr { public SQLNumericLiteralExpr(){ @@ -28,4 +31,9 @@ public abstract class SQLNumericLiteralExpr extends SQLExprImpl implements SQLLi public abstract void setNumber(Number number); public abstract SQLNumericLiteralExpr clone(); + + @Override + public List getChildren() { + return Collections.emptyList(); + } } 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 4020b462d5..8d458b9a90 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 @@ -21,6 +21,9 @@ import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.visitor.SQLASTVisitor; import com.alibaba.druid.util.FnvHash; +import java.util.Collections; +import java.util.List; + public final class SQLPropertyExpr extends SQLExprImpl implements SQLName { private SQLExpr owner; private String name; @@ -132,6 +135,11 @@ public final class SQLPropertyExpr extends SQLExprImpl implements SQLName { visitor.endVisit(this); } + @Override + public List getChildren() { + return Collections.singletonList(this.owner); + } + @Override public int hashCode() { long hash = hashCode64(); diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLQueryExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLQueryExpr.java index fed31ad1ff..e6222c7a88 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLQueryExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLQueryExpr.java @@ -16,10 +16,12 @@ package com.alibaba.druid.sql.ast.expr; import java.io.Serializable; +import java.util.Collections; import java.util.List; import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.ast.statement.SQLSelectItem; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; @@ -62,6 +64,10 @@ public class SQLQueryExpr extends SQLExprImpl implements Serializable { visitor.endVisit(this); } + public List getChildren() { + return Collections.singletonList(subQuery); + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLSequenceExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLSequenceExpr.java index 879b14f1e1..1510b3df02 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLSequenceExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLSequenceExpr.java @@ -17,8 +17,12 @@ package com.alibaba.druid.sql.ast.expr; import com.alibaba.druid.sql.ast.SQLExprImpl; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.Collections; +import java.util.List; + public class SQLSequenceExpr extends SQLExprImpl { private SQLName sequence; @@ -62,6 +66,10 @@ public class SQLSequenceExpr extends SQLExprImpl { } } + public List getChildren() { + return Collections.singletonList(sequence); + } + public SQLName getSequence() { return sequence; } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLSomeExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLSomeExpr.java index c00fe8e493..c0dc100cc6 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLSomeExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLSomeExpr.java @@ -17,11 +17,14 @@ package com.alibaba.druid.sql.ast.expr; import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.ast.statement.SQLSelectItem; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.Collection; +import java.util.Collections; import java.util.List; public final class SQLSomeExpr extends SQLExprImpl { @@ -115,4 +118,9 @@ public final class SQLSomeExpr extends SQLExprImpl { return null; } + + @Override + public List getChildren() { + return Collections.singletonList(this.subQuery); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLTextLiteralExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLTextLiteralExpr.java index 232c38807b..d7ef99cb98 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLTextLiteralExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLTextLiteralExpr.java @@ -17,6 +17,9 @@ package com.alibaba.druid.sql.ast.expr; import com.alibaba.druid.sql.ast.SQLExprImpl; +import java.util.Collections; +import java.util.List; + public abstract class SQLTextLiteralExpr extends SQLExprImpl implements SQLLiteralExpr { protected String text; @@ -69,4 +72,9 @@ public abstract class SQLTextLiteralExpr extends SQLExprImpl implements SQLLiter } public abstract SQLTextLiteralExpr clone(); + + @Override + public List getChildren() { + return Collections.emptyList(); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLTimestampExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLTimestampExpr.java index a63d5afefb..4e727ef198 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLTimestampExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLTimestampExpr.java @@ -1,11 +1,3 @@ -package com.alibaba.druid.sql.ast.expr; - -import com.alibaba.druid.sql.SQLUtils; -import com.alibaba.druid.sql.ast.SQLDataType; -import com.alibaba.druid.sql.ast.SQLExprImpl; -import com.alibaba.druid.sql.ast.statement.SQLCharacterDataType; -import com.alibaba.druid.sql.visitor.SQLASTVisitor; - /* * Copyright 1999-2017 Alibaba Group Holding Ltd. * @@ -21,6 +13,17 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor; * See the License for the specific language governing permissions and * limitations under the License. */ +package com.alibaba.druid.sql.ast.expr; + +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLDataType; +import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.ast.statement.SQLCharacterDataType; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +import java.util.Collections; +import java.util.List; + public class SQLTimestampExpr extends SQLExprImpl implements SQLValuableExpr { public static final SQLDataType DEFAULT_DATA_TYPE = new SQLCharacterDataType("datetime"); @@ -124,4 +127,9 @@ public class SQLTimestampExpr extends SQLExprImpl implements SQLValuableExpr { public SQLDataType computeDataType() { return DEFAULT_DATA_TYPE; } + + @Override + public List getChildren() { + return Collections.emptyList(); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLUnaryExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLUnaryExpr.java index 5bc6e201ff..1881e42b0a 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLUnaryExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLUnaryExpr.java @@ -16,9 +16,12 @@ package com.alibaba.druid.sql.ast.expr; import java.io.Serializable; +import java.util.Collections; +import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLUnaryExpr extends SQLExprImpl implements Serializable { @@ -72,6 +75,11 @@ public class SQLUnaryExpr extends SQLExprImpl implements Serializable { visitor.endVisit(this); } + @Override + public List getChildren() { + return Collections.singletonList(this.expr); + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLVariantRefExpr.java b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLVariantRefExpr.java index 1b32dbbe5e..03b84d2af5 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/expr/SQLVariantRefExpr.java +++ b/src/main/java/com/alibaba/druid/sql/ast/expr/SQLVariantRefExpr.java @@ -16,8 +16,12 @@ package com.alibaba.druid.sql.ast.expr; import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.Collections; +import java.util.List; + public class SQLVariantRefExpr extends SQLExprImpl { private String name; @@ -109,4 +113,9 @@ public class SQLVariantRefExpr extends SQLExprImpl { var.index = index; return var; } + + @Override + public List getChildren() { + return Collections.emptyList(); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterDatabaseStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterDatabaseStatement.java index d72f660641..72c9c5e899 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterDatabaseStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterDatabaseStatement.java @@ -16,9 +16,13 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.Collections; +import java.util.List; + public class SQLAlterDatabaseStatement extends SQLStatementImpl implements SQLAlterStatement { private SQLName name; @@ -59,4 +63,9 @@ public class SQLAlterDatabaseStatement extends SQLStatementImpl implements SQLAl } visitor.endVisit(this); } + + @Override + public List getChildren() { + return Collections.singletonList(name); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableStatement.java index 2952992848..81826638d0 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableStatement.java @@ -156,6 +156,16 @@ public class SQLAlterTableStatement extends SQLStatementImpl implements SQLDDLSt visitor.endVisit(this); } + @Override + public List getChildren() { + List children = new ArrayList(); + if (tableSource != null) { + children.add(tableSource); + } + children.addAll(this.items); + return children; + } + public String getTableName() { if (tableSource == null) { return null; diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTypeStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTypeStatement.java index c0499fdde9..5a4a4dc5b5 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTypeStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTypeStatement.java @@ -16,9 +16,13 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.Collections; +import java.util.List; + public class SQLAlterTypeStatement extends SQLStatementImpl { private SQLName name; @@ -76,4 +80,9 @@ public class SQLAlterTypeStatement extends SQLStatementImpl { } visitor.endVisit(this); } + + @Override + public List getChildren() { + return Collections.singletonList(this.name); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCallStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCallStatement.java index 5887c8f753..85f08be77a 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCallStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCallStatement.java @@ -20,6 +20,7 @@ import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.ast.expr.SQLVariantRefExpr; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -79,4 +80,12 @@ public class SQLCallStatement extends SQLStatementImpl { visitor.endVisit(this); } + @Override + public List getChildren() { + List children = new ArrayList(); + children.add(outParameter); + children.add(procedureName); + children.addAll(parameters); + return null; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCloseStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCloseStatement.java index 2a065110d6..b3662d7f82 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCloseStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCloseStatement.java @@ -15,8 +15,15 @@ */ package com.alibaba.druid.sql.ast.statement; +import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatementImpl; +import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +import java.util.Collections; +import java.util.List; + /** * * MySql cursor close statement @@ -25,21 +32,34 @@ import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLCloseStatement extends SQLStatementImpl{ //cursor name - private String cursorName; + private SQLName cursorName; - public String getCursorName() { + public SQLName getCursorName() { return cursorName; } - + public void setCursorName(String cursorName) { + setCursorName(new SQLIdentifierExpr(cursorName)); + } + + public void setCursorName(SQLName cursorName) { + if (cursorName != null) { + cursorName.setParent(this); + } this.cursorName = cursorName; } @Override protected void accept0(SQLASTVisitor visitor) { - visitor.visit(this); + if (visitor.visit(this)) { + acceptChild(visitor, cursorName); + } visitor.endVisit(this); } + @Override + public List getChildren() { + return Collections.emptyList(); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCommentStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCommentStatement.java index fe0eaf7d87..67795a3c3b 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCommentStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCommentStatement.java @@ -15,12 +15,12 @@ */ package com.alibaba.druid.sql.ast.statement; -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLName; -import com.alibaba.druid.sql.ast.SQLStatement; -import com.alibaba.druid.sql.ast.SQLStatementImpl; +import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.ArrayList; +import java.util.List; + public class SQLCommentStatement extends SQLStatementImpl { public static enum Type { @@ -71,4 +71,15 @@ public class SQLCommentStatement extends SQLStatementImpl { visitor.endVisit(this); } + @Override + public List getChildren() { + List children = new ArrayList(); + if (on != null) { + children.add(on); + } + if (comment != null) { + children.add(comment); + } + return children; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateDatabaseStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateDatabaseStatement.java index ca6a255372..c3fe1f0f8e 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateDatabaseStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateDatabaseStatement.java @@ -15,10 +15,12 @@ */ package com.alibaba.druid.sql.ast.statement; +import java.util.ArrayList; import java.util.List; import com.alibaba.druid.sql.ast.SQLCommentHint; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -48,6 +50,15 @@ public class SQLCreateDatabaseStatement extends SQLStatementImpl implements SQLC visitor.endVisit(this); } + @Override + public List getChildren() { + List children = new ArrayList(); + if (name != null) { + children.add(name); + } + return children; + } + public SQLName getName() { return name; } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateIndexStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateIndexStatement.java index 7362160b37..bb413e58d1 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateIndexStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateIndexStatement.java @@ -20,6 +20,7 @@ import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; @@ -109,13 +110,28 @@ public class SQLCreateIndexStatement extends SQLStatementImpl implements SQLCrea @Override protected void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { - acceptChild(visitor, getName()); - acceptChild(visitor, getTable()); - acceptChild(visitor, getItems()); + acceptChild(visitor, name); + acceptChild(visitor, table); + acceptChild(visitor, items); } visitor.endVisit(this); } + @Override + public List getChildren() { + List children = new ArrayList(); + if (name != null) { + children.add(name); + } + + if (table != null) { + children.add(table); + } + + children.addAll(this.items); + return children; + } + public String getSchema() { SQLName name = null; if (table instanceof SQLExprTableSource) { diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateSequenceStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateSequenceStatement.java index 1f0902980f..ce9e2aa16d 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateSequenceStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateSequenceStatement.java @@ -15,14 +15,14 @@ */ package com.alibaba.druid.sql.ast.statement; -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLName; -import com.alibaba.druid.sql.ast.SQLStatement; -import com.alibaba.druid.sql.ast.SQLStatementImpl; +import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.ArrayList; +import java.util.List; + /** * Created by wenshao on 16/9/14. */ @@ -54,6 +54,27 @@ public class SQLCreateSequenceStatement extends SQLStatementImpl implements SQLC visitor.endVisit(this); } + @Override + public List getChildren() { + List children = new ArrayList(); + if (name != null) { + children.add(name); + } + if (startWith != null) { + children.add(startWith); + } + if (incrementBy != null) { + children.add(incrementBy); + } + if (minValue != null) { + children.add(minValue); + } + if (maxValue != null) { + children.add(maxValue); + } + return children; + } + public SQLName getName() { return name; } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java index 872af6995e..3b80811f6b 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java @@ -186,7 +186,21 @@ public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLS } visitor.endVisit(this); } - + + @Override + public List getChildren() { + List children = new ArrayList(); + children.add(tableSource); + children.addAll(tableElementList); + if (inherits != null) { + children.add(inherits); + } + if (select != null) { + children.add(select); + } + return children; + } + @SuppressWarnings("unchecked") public void addBodyBeforeComment(List comments) { if (attributes == null) { diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTriggerStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTriggerStatement.java index 0ba042ea77..6a0990dc7d 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTriggerStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTriggerStatement.java @@ -18,10 +18,7 @@ package com.alibaba.druid.sql.ast.statement; import java.util.ArrayList; import java.util.List; -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLName; -import com.alibaba.druid.sql.ast.SQLStatement; -import com.alibaba.druid.sql.ast.SQLStatementImpl; +import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.visitor.SQLASTVisitor; public class SQLCreateTriggerStatement extends SQLStatementImpl implements SQLCreateStatement { @@ -64,6 +61,25 @@ public class SQLCreateTriggerStatement extends SQLStatementImpl implements SQLCr visitor.endVisit(this); } + @Override + public List getChildren() { + List children = new ArrayList(); + if (name != null) { + children.add(name); + } + children.addAll(updateOfColumns); + if (on != null) { + children.add(on); + } + if (when != null) { + children.add(when); + } + if (body != null) { + children.add(body); + } + return children; + } + public SQLExprTableSource getOn() { return on; } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateViewStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateViewStatement.java index 7f9c51ce66..3f462edfd7 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateViewStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateViewStatement.java @@ -19,10 +19,7 @@ import java.util.ArrayList; import java.util.List; import com.alibaba.druid.sql.SQLUtils; -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLName; -import com.alibaba.druid.sql.ast.SQLObjectImpl; -import com.alibaba.druid.sql.ast.SQLStatementImpl; +import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr; @@ -241,6 +238,21 @@ public class SQLCreateViewStatement extends SQLStatementImpl implements SQLCreat visitor.endVisit(this); } + public List getChildren() { + List children = new ArrayList(); + if (tableSource != null) { + children.add(tableSource); + } + children.addAll(this.columns); + if (comment != null) { + children.add(comment); + } + if (subQuery != null) { + children.add(subQuery); + } + return children; + } + public static enum Level { CASCADED, LOCAL } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDeleteStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDeleteStatement.java index 852d150436..e87eb6a2b3 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDeleteStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDeleteStatement.java @@ -19,6 +19,9 @@ import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.ArrayList; +import java.util.List; + public class SQLDeleteStatement extends SQLStatementImpl implements SQLReplaceable { protected SQLWithSubqueryClause with; @@ -148,6 +151,19 @@ public class SQLDeleteStatement extends SQLStatementImpl implements SQLReplaceab visitor.endVisit(this); } + @Override + public List getChildren() { + List children = new ArrayList(); + if (with != null) { + children.add(with); + } + children.add(tableSource); + if (where != null) { + children.add(where); + } + return children; + } + public SQLTableSource getFrom() { return from; } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDescribeStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDescribeStatement.java index 9c0e278b1e..5c2d415e8b 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDescribeStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDescribeStatement.java @@ -17,10 +17,12 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; public class SQLDescribeStatement extends SQLStatementImpl { @@ -76,4 +78,10 @@ public class SQLDescribeStatement extends SQLStatementImpl { } visitor.endVisit(this); } + + @Override + public List getChildren() { + return Arrays.asList(this.object, column); + + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropDatabaseStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropDatabaseStatement.java index 109d0900a1..6bcc238058 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropDatabaseStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropDatabaseStatement.java @@ -16,9 +16,13 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.ArrayList; +import java.util.List; + public class SQLDropDatabaseStatement extends SQLStatementImpl implements SQLDropStatement { private SQLExpr database; @@ -59,4 +63,13 @@ public class SQLDropDatabaseStatement extends SQLStatementImpl implements SQLDro this.ifExists = ifExists; } + @Override + public List getChildren() { + List children = new ArrayList(); + if (database != null) { + children.add(database); + } + return children; + } + } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropIndexStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropIndexStatement.java index 7db426e18d..8d449ff225 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropIndexStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropIndexStatement.java @@ -17,9 +17,13 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.ArrayList; +import java.util.List; + public class SQLDropIndexStatement extends SQLStatementImpl implements SQLDropStatement { private SQLName indexName; @@ -61,4 +65,16 @@ public class SQLDropIndexStatement extends SQLStatementImpl implements SQLDropSt } visitor.endVisit(this); } + + @Override + public List getChildren() { + List children = new ArrayList(); + if (indexName != null) { + children.add(indexName); + } + if (tableName != null) { + children.add(tableName); + } + return children; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropSequenceStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropSequenceStatement.java index cfe3d27ebe..af455ebaac 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropSequenceStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropSequenceStatement.java @@ -16,10 +16,14 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.ArrayList; +import java.util.List; + public class SQLDropSequenceStatement extends SQLStatementImpl implements SQLDropStatement { private SQLName name; @@ -41,6 +45,15 @@ public class SQLDropSequenceStatement extends SQLStatementImpl implements SQLDro visitor.endVisit(this); } + @Override + public List getChildren() { + List children = new ArrayList(); + if (name != null) { + children.add(name); + } + return children; + } + public SQLName getName() { return name; } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTableStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTableStatement.java index ec9e7dc8fb..6ab29eacb7 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTableStatement.java @@ -20,6 +20,7 @@ import java.util.List; import com.alibaba.druid.sql.ast.SQLCommentHint; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -92,6 +93,11 @@ public class SQLDropTableStatement extends SQLStatementImpl implements SQLDropSt visitor.endVisit(this); } + @Override + public List getChildren() { + return this.tableSources; + } + public boolean isPurge() { return purge; } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTriggerStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTriggerStatement.java index 0469b660de..4a962fd9f2 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTriggerStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTriggerStatement.java @@ -16,9 +16,13 @@ package com.alibaba.druid.sql.ast.statement; * limitations under the License. */ import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.ArrayList; +import java.util.List; + public class SQLDropTriggerStatement extends SQLStatementImpl implements SQLDropStatement { private SQLName name; @@ -48,6 +52,15 @@ public class SQLDropTriggerStatement extends SQLStatementImpl implements SQLDrop visitor.endVisit(this); } + @Override + public List getChildren() { + List children = new ArrayList(); + if (name != null) { + children.add(name); + } + return children; + } + public boolean isIfExists() { return ifExists; } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropUserStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropUserStatement.java index 41b031b784..a76b24221c 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropUserStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropUserStatement.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.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -51,4 +52,9 @@ public class SQLDropUserStatement extends SQLStatementImpl implements SQLDropSta } visitor.endVisit(this); } + + @Override + public List getChildren() { + return users; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropViewStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropViewStatement.java index 8477f966b0..68fa727a03 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropViewStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropViewStatement.java @@ -19,6 +19,7 @@ import java.util.ArrayList; import java.util.List; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -101,4 +102,8 @@ public class SQLDropViewStatement extends SQLStatementImpl implements SQLDropSta this.ifExists = ifExists; } + @Override + public List getChildren() { + return tableSources; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExplainStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExplainStatement.java index 16678db7c6..03a501da14 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExplainStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExplainStatement.java @@ -15,9 +15,11 @@ */ package com.alibaba.druid.sql.ast.statement; +import java.util.ArrayList; import java.util.List; import com.alibaba.druid.sql.ast.SQLCommentHint; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -72,4 +74,13 @@ public class SQLExplainStatement extends SQLStatementImpl { public void setHints(List hints) { this.hints = hints; } + + @Override + public List getChildren() { + List children = new ArrayList(); + if (statement != null) { + children.add(statement); + } + return children; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLGrantStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLGrantStatement.java index a4862e50e0..6017dacea1 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLGrantStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLGrantStatement.java @@ -55,6 +55,7 @@ public class SQLGrantStatement extends SQLStatementImpl { @Override protected void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { + acceptChild(visitor, this.privileges); acceptChild(visitor, on); acceptChild(visitor, to); acceptChild(visitor, identifiedBy); @@ -62,6 +63,22 @@ public class SQLGrantStatement extends SQLStatementImpl { visitor.endVisit(this); } + @Override + public List getChildren() { + List children = new ArrayList(); + children.addAll(privileges); + if (on != null) { + children.add(on); + } + if (to != null) { + children.add(to); + } + if (identifiedBy != null) { + children.add(identifiedBy); + } + return children; + } + public SQLObjectType getObjectType() { return objectType; } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertStatement.java index b273bf108d..55b049f236 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLInsertStatement.java @@ -20,6 +20,7 @@ import java.util.List; import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLObjectImpl; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -67,6 +68,20 @@ public class SQLInsertStatement extends SQLInsertInto implements SQLStatement { visitor.endVisit(this); } + @Override + public List getChildren() { + List children = new ArrayList(); + + children.add(tableSource); + children.addAll(this.columns); + children.addAll(this.valuesList); + if (query != null) { + children.add(query); + } + + return children; + } + public boolean isUpsert() { return upsert; } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLLoopStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLLoopStatement.java index 909b00d043..750d736d3c 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLLoopStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLLoopStatement.java @@ -18,6 +18,7 @@ package com.alibaba.druid.sql.ast.statement; import java.util.ArrayList; import java.util.List; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -54,4 +55,9 @@ public class SQLLoopStatement extends SQLStatementImpl { } statements.add(stmt); } + + @Override + public List getChildren() { + return statements; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLOpenStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLOpenStatement.java index 53c337d476..acd35082dc 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLOpenStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLOpenStatement.java @@ -18,6 +18,7 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLStatementImpl; +import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.visitor.SQLASTVisitor; import java.util.ArrayList; @@ -30,7 +31,7 @@ import java.util.List; public class SQLOpenStatement extends SQLStatementImpl{ //cursor name - private String cursorName; + private SQLName cursorName; private final List columns = new ArrayList(); @@ -40,17 +41,25 @@ public class SQLOpenStatement extends SQLStatementImpl{ } - public String getCursorName() { + public SQLName getCursorName() { return cursorName; } public void setCursorName(String cursorName) { + setCursorName(new SQLIdentifierExpr(cursorName)); + } + + public void setCursorName(SQLName cursorName) { + if (cursorName != null) { + cursorName.setParent(this); + } this.cursorName = cursorName; } @Override protected void accept0(SQLASTVisitor visitor) { if (visitor.visit(this)) { + acceptChild(visitor, cursorName); acceptChild(visitor, forExpr); acceptChild(visitor, columns); } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLReleaseSavePointStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLReleaseSavePointStatement.java index b4a8c4cb91..c871274549 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLReleaseSavePointStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLReleaseSavePointStatement.java @@ -16,9 +16,13 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.ArrayList; +import java.util.List; + public class SQLReleaseSavePointStatement extends SQLStatementImpl { private SQLExpr name; @@ -46,4 +50,13 @@ public class SQLReleaseSavePointStatement extends SQLStatementImpl { } visitor.endVisit(this); } + + @Override + public List getChildren() { + List children = new ArrayList(); + if (name != null) { + children.add(name); + } + return children; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLReturnStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLReturnStatement.java index ad9438b5f9..35a1c2eee0 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLReturnStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLReturnStatement.java @@ -16,9 +16,13 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.Collections; +import java.util.List; + public class SQLReturnStatement extends SQLStatementImpl { private SQLExpr expr; @@ -57,4 +61,9 @@ public class SQLReturnStatement extends SQLStatementImpl { } return x; } + + @Override + public List getChildren() { + return Collections.singletonList(this.expr); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLRollbackStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLRollbackStatement.java index 7eb3e672c3..beba88a246 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLRollbackStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLRollbackStatement.java @@ -17,9 +17,13 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.ArrayList; +import java.util.List; + public class SQLRollbackStatement extends SQLStatementImpl { private SQLName to; @@ -47,6 +51,18 @@ public class SQLRollbackStatement extends SQLStatementImpl { visitor.endVisit(this); } + @Override + public List getChildren() { + List children = new ArrayList(); + if (to != null) { + children.add(to); + } + if (force != null) { + children.add(force); + } + return children; + } + public SQLName getTo() { return to; } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSavePointStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSavePointStatement.java index fbcc8fa33c..0de2d64290 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSavePointStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSavePointStatement.java @@ -16,9 +16,13 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.ArrayList; +import java.util.List; + public class SQLSavePointStatement extends SQLStatementImpl { private SQLExpr name; @@ -46,4 +50,13 @@ public class SQLSavePointStatement extends SQLStatementImpl { } visitor.endVisit(this); } + + @Override + public List getChildren() { + List children = new ArrayList(); + if (name != null) { + children.add(name); + } + return children; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectStatement.java index b3d19a1cb3..f62224f3b0 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSelectStatement.java @@ -16,9 +16,11 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.sql.ast.SQLCommentHint; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.Collections; import java.util.List; public class SQLSelectStatement extends SQLStatementImpl { @@ -78,4 +80,9 @@ public class SQLSelectStatement extends SQLStatementImpl { } return x; } + + @Override + public List getChildren() { + return Collections.singletonList(select); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSetStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSetStatement.java index 2a37101171..f38eee9d38 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSetStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLSetStatement.java @@ -18,10 +18,7 @@ package com.alibaba.druid.sql.ast.statement; import java.util.ArrayList; import java.util.List; -import com.alibaba.druid.sql.ast.SQLCommentHint; -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLName; -import com.alibaba.druid.sql.ast.SQLStatementImpl; +import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.ast.expr.SQLBinaryOpExpr; import com.alibaba.druid.sql.ast.expr.SQLBinaryOperator; import com.alibaba.druid.sql.ast.expr.SQLIntegerExpr; @@ -126,6 +123,10 @@ public class SQLSetStatement extends SQLStatementImpl { return x; } + public List getChildren() { + return this.items; + } + public static enum Option { IDENTITY_INSERT, PASSWORD, // mysql diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLStartTransactionStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLStartTransactionStatement.java index d96bad82f1..63bcd47591 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLStartTransactionStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLStartTransactionStatement.java @@ -15,12 +15,10 @@ */ package com.alibaba.druid.sql.ast.statement; +import java.util.Collections; import java.util.List; -import com.alibaba.druid.sql.ast.SQLCommentHint; -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLStatement; -import com.alibaba.druid.sql.ast.SQLStatementImpl; +import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStatementImpl; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -83,4 +81,12 @@ public class SQLStartTransactionStatement extends SQLStatementImpl { } this.name = name; } + + @Override + public List getChildren() { + if (name != null) { + return Collections.singletonList(name); + } + return Collections.emptyList(); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTruncateStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTruncateStatement.java index 9b4d7d3659..0c17944e11 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTruncateStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLTruncateStatement.java @@ -19,6 +19,7 @@ import java.util.ArrayList; import java.util.List; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -150,4 +151,8 @@ public class SQLTruncateStatement extends SQLStatementImpl { this.continueIdentity = continueIdentity; } + @Override + public List getChildren() { + return tableSources; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUpdateSetItem.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUpdateSetItem.java index 8ccc66f285..b5853a6051 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUpdateSetItem.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUpdateSetItem.java @@ -18,11 +18,12 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLObjectImpl; +import com.alibaba.druid.sql.ast.SQLReplaceable; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; import com.alibaba.druid.sql.visitor.SQLASTVisitor; -public class SQLUpdateSetItem extends SQLObjectImpl { +public class SQLUpdateSetItem extends SQLObjectImpl implements SQLReplaceable { private SQLExpr column; private SQLExpr value; @@ -44,6 +45,9 @@ public class SQLUpdateSetItem extends SQLObjectImpl { } public void setValue(SQLExpr value) { + if (value != null) { + value.setParent(this); + } this.value = value; } @@ -79,4 +83,18 @@ public class SQLUpdateSetItem extends SQLObjectImpl { return false; } + + @Override + public boolean replace(SQLExpr expr, SQLExpr target) { + if (expr == this.column) { + this.column = target; + return true; + } + + if (expr == this.value) { + this.value = target; + return true; + } + return false; + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUpdateStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUpdateStatement.java index 6331e58b5e..143efc8f48 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUpdateStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUpdateStatement.java @@ -142,6 +142,24 @@ public class SQLUpdateStatement extends SQLStatementImpl implements SQLReplaceab visitor.endVisit(this); } + public List getChildren() { + List children = new ArrayList(); + if (tableSource != null) { + children.add(tableSource); + } + if (from != null) { + children.add(from); + } + children.addAll(this.items); + if (where != null) { + children.add(where); + } + if (orderBy != null) { + children.add(orderBy); + } + return children; + } + @Override public boolean replace(SQLExpr expr, SQLExpr target) { if (where == expr) { diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUseStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUseStatement.java index a5b5cf370a..a9e2f479bb 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUseStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUseStatement.java @@ -16,10 +16,14 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.Collections; +import java.util.List; + public class SQLUseStatement extends SQLStatementImpl { private SQLName database; @@ -48,4 +52,8 @@ public class SQLUseStatement extends SQLStatementImpl { visitor.endVisit(this); } + @Override + public List getChildren() { + return Collections.singletonList(database); + } } diff --git a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLWhileStatement.java b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLWhileStatement.java index 04eb7bd762..cd58855c28 100644 --- a/src/main/java/com/alibaba/druid/sql/ast/statement/SQLWhileStatement.java +++ b/src/main/java/com/alibaba/druid/sql/ast/statement/SQLWhileStatement.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.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStatementImpl; @@ -54,7 +55,15 @@ public class SQLWhileStatement extends SQLStatementImpl { visitor.endVisit(this); } - public List getStatements() { + @Override + public List getChildren() { + List children = new ArrayList(); + children.add(condition); + children.addAll(this.statements); + return children; + } + + public List getStatements() { return statements; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlCaseStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlCaseStatement.java index 55e8d981c4..a6ee2ab800 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlCaseStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlCaseStatement.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.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.statement.SQLIfStatement; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl; @@ -33,7 +34,7 @@ public class MySqlCaseStatement extends MySqlStatementImpl{ //case expr private SQLExpr condition; //when statement list - private List whenList=new ArrayList(); + private List whenList = new ArrayList(); //else statement private SQLIfStatement.Else elseItem; @@ -76,7 +77,19 @@ public class MySqlCaseStatement extends MySqlStatementImpl{ } visitor.endVisit(this); } - + + @Override + public List getChildren() { + List children = new ArrayList(); + children.addAll(children); + children.addAll(whenList); + children.addAll(whenList); + if (elseItem != null) { + children.add(elseItem); + } + return children; + } + /** * case when statement * @author zz diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlDeclareStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlDeclareStatement.java index f1189c55fe..e0ec39abf0 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlDeclareStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlDeclareStatement.java @@ -19,6 +19,7 @@ import java.util.ArrayList; import java.util.List; import com.alibaba.druid.sql.ast.SQLDeclareItem; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStatementImpl; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; @@ -49,4 +50,8 @@ public class MySqlDeclareStatement extends MySqlStatementImpl { visitor.endVisit(this); } + @Override + public List getChildren() { + return varList; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlLeaveStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlLeaveStatement.java index 8e4f00379b..6586504e1c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlLeaveStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/clause/MySqlLeaveStatement.java @@ -15,9 +15,13 @@ */ package com.alibaba.druid.sql.dialect.mysql.ast.clause; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlStatementImpl; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; +import java.util.Collections; +import java.util.List; + /** * * @author zz [455910092@qq.com] @@ -47,5 +51,10 @@ public class MySqlLeaveStatement extends MySqlStatementImpl { public void setLabelName(String labelName) { this.labelName = labelName; } + + @Override + public List getChildren() { + return Collections.emptyList(); + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlExtractExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlExtractExpr.java index 3e80263d0b..e6c535657a 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlExtractExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlExtractExpr.java @@ -17,13 +17,17 @@ package com.alibaba.druid.sql.dialect.mysql.ast.expr; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.ast.expr.SQLIntervalUnit; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.Collections; +import java.util.List; + public class MySqlExtractExpr extends SQLExprImpl implements MySqlExpr { private SQLExpr value; - private MySqlIntervalUnit unit; + private SQLIntervalUnit unit; public MySqlExtractExpr(){ } @@ -48,19 +52,25 @@ public class MySqlExtractExpr extends SQLExprImpl implements MySqlExpr { this.value = value; } - public MySqlIntervalUnit getUnit() { + public SQLIntervalUnit getUnit() { return unit; } - public void setUnit(MySqlIntervalUnit unit) { + public void setUnit(SQLIntervalUnit unit) { this.unit = unit; } protected void accept0(SQLASTVisitor visitor) { MySqlASTVisitor mysqlVisitor = (MySqlASTVisitor) visitor; - mysqlVisitor.visit(this); + if (mysqlVisitor.visit(this)) { + acceptChild(visitor, value); + } mysqlVisitor.endVisit(this); } + @Override + public List getChildren() { + return Collections.singletonList(value); + } @Override public int hashCode() { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlMatchAgainstExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlMatchAgainstExpr.java index 33da1590d5..85a98bf630 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlMatchAgainstExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlMatchAgainstExpr.java @@ -16,10 +16,12 @@ package com.alibaba.druid.sql.dialect.mysql.ast.expr; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -101,6 +103,14 @@ public class MySqlMatchAgainstExpr extends SQLExprImpl implements MySqlExpr { mysqlVisitor.endVisit(this); } + @Override + public List getChildren() { + List children = new ArrayList(); + children.addAll(this.columns); + children.add(this.against); + return children; + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlOrderingExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlOrderingExpr.java index f75509251d..11410c60c0 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlOrderingExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlOrderingExpr.java @@ -21,6 +21,9 @@ import com.alibaba.druid.sql.ast.SQLOrderingSpecification; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.Collections; +import java.util.List; + public class MySqlOrderingExpr extends SQLExprImpl implements MySqlExpr { protected SQLExpr expr; @@ -55,6 +58,11 @@ public class MySqlOrderingExpr extends SQLExprImpl implements MySqlExpr { mysqlVisitor.endVisit(this); } + @Override + public List getChildren() { + return Collections.singletonList(this.expr); + } + public SQLExpr getExpr() { return expr; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlOutFileExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlOutFileExpr.java index cc243d33b5..949cf6e5bc 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlOutFileExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlOutFileExpr.java @@ -20,6 +20,9 @@ import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlObjectImpl; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; +import java.util.Collections; +import java.util.List; + public class MySqlOutFileExpr extends MySqlObjectImpl implements SQLExpr { private SQLExpr file; @@ -50,6 +53,11 @@ public class MySqlOutFileExpr extends MySqlObjectImpl implements SQLExpr { visitor.endVisit(this); } + @Override + public List getChildren() { + return Collections.singletonList(file); + } + public SQLExpr getFile() { return file; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlUserName.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlUserName.java index e595e67753..c5b3ead088 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlUserName.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/expr/MySqlUserName.java @@ -16,9 +16,13 @@ package com.alibaba.druid.sql.dialect.mysql.ast.expr; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; import com.alibaba.druid.util.FnvHash; +import java.util.Collections; +import java.util.List; + public class MySqlUserName extends MySqlExprImpl implements SQLName, Cloneable { private String userName; @@ -72,6 +76,11 @@ public class MySqlUserName extends MySqlExprImpl implements SQLName, Cloneable { return x; } + @Override + public List getChildren() { + return Collections.emptyList(); + } + public long nameHashCode64() { if (userNameHashCod64 == 0 && userName != null) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlExecuteStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlExecuteStatement.java index 2162fff650..e469673763 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlExecuteStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlExecuteStatement.java @@ -16,10 +16,12 @@ package com.alibaba.druid.sql.dialect.mysql.ast.statement; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; public class MySqlExecuteStatement extends MySqlStatementImpl { @@ -46,4 +48,14 @@ public class MySqlExecuteStatement extends MySqlStatementImpl { } visitor.endVisit(this); } + + @Override + public List getChildren() { + List children = new ArrayList(); + if (statementName != null) { + children.add(statementName); + } + children.addAll(this.parameters); + return children; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlKillStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlKillStatement.java index 45e3240af0..1096581fab 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlKillStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlKillStatement.java @@ -16,9 +16,11 @@ package com.alibaba.druid.sql.dialect.mysql.ast.statement; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; public class MySqlKillStatement extends MySqlStatementImpl { @@ -56,4 +58,9 @@ public class MySqlKillStatement extends MySqlStatementImpl { } visitor.endVisit(this); } + + @Override + public List getChildren() { + return Collections.emptyList(); + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlLoadDataInFileStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlLoadDataInFileStatement.java index 59ce4c4b0f..fdb868d941 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlLoadDataInFileStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlLoadDataInFileStatement.java @@ -20,6 +20,7 @@ import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; @@ -191,6 +192,36 @@ public class MySqlLoadDataInFileStatement extends MySqlStatementImpl { visitor.endVisit(this); } + @Override + public List getChildren() { + List children = new ArrayList(); + if (fileName != null) { + children.add(fileName); + } + if (tableName != null) { + children.add(tableName); + } + if (columnsTerminatedBy != null) { + children.add(columnsTerminatedBy); + } + if (columnsEnclosedBy != null) { + children.add(columnsEnclosedBy); + } + if (columnsEscaped != null) { + children.add(columnsEscaped); + } + if (linesStartingBy != null) { + children.add(linesStartingBy); + } + if (linesTerminatedBy != null) { + children.add(linesTerminatedBy); + } + if (ignoreLinesNumber != null) { + children.add(ignoreLinesNumber); + } + return children; + } + public List getColumns() { return columns; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlLoadXmlStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlLoadXmlStatement.java index 186a485083..0b7f2af8a4 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlLoadXmlStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlLoadXmlStatement.java @@ -20,6 +20,7 @@ import java.util.List; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; @@ -143,4 +144,23 @@ public class MySqlLoadXmlStatement extends MySqlStatementImpl { } visitor.endVisit(this); } + + @Override + public List getChildren() { + List children = new ArrayList(); + if (fileName != null) { + children.add(fileName); + } + if (tableName != null) { + children.add(tableName); + } + if (rowsIdentifiedBy != null) { + children.add(rowsIdentifiedBy); + } + if (ignoreLinesNumber != null) { + children.add(ignoreLinesNumber); + } + children.addAll(this.setList); + return children; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPrepareStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPrepareStatement.java index 76d78fc68c..ee97dc9cc9 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPrepareStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlPrepareStatement.java @@ -17,8 +17,12 @@ package com.alibaba.druid.sql.dialect.mysql.ast.statement; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; +import java.util.ArrayList; +import java.util.List; + public class MySqlPrepareStatement extends MySqlStatementImpl { private SQLName name; @@ -55,4 +59,16 @@ public class MySqlPrepareStatement extends MySqlStatementImpl { } visitor.endVisit(this); } + + @Override + public List getChildren() { + List children = new ArrayList(); + if (name != null) { + children.add(name); + } + if (this.from != null) { + children.add(from); + } + return children; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSetTransactionStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSetTransactionStatement.java index 3bf630b221..e6630f4568 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSetTransactionStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlSetTransactionStatement.java @@ -15,8 +15,12 @@ */ package com.alibaba.druid.sql.dialect.mysql.ast.statement; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; +import java.util.Collections; +import java.util.List; + public class MySqlSetTransactionStatement extends MySqlStatementImpl { private Boolean global; @@ -54,4 +58,8 @@ public class MySqlSetTransactionStatement extends MySqlStatementImpl { this.accessModel = accessModel; } + @Override + public List getChildren() { + return Collections.emptyList(); + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowCharacterSetStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowCharacterSetStatement.java index 58e240c643..979a50057d 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowCharacterSetStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowCharacterSetStatement.java @@ -16,8 +16,13 @@ package com.alibaba.druid.sql.dialect.mysql.ast.statement; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + public class MySqlShowCharacterSetStatement extends MySqlStatementImpl implements MySqlShowStatement { private SQLExpr where; @@ -47,4 +52,9 @@ public class MySqlShowCharacterSetStatement extends MySqlStatementImpl implement this.pattern = pattern; } + @Override + public List getChildren() { + return Arrays.asList(this.where, pattern); + } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowColumnsStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowColumnsStatement.java index b726c32d34..18f9c48c7f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowColumnsStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlShowColumnsStatement.java @@ -17,10 +17,14 @@ package com.alibaba.druid.sql.dialect.mysql.ast.statement; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; +import java.util.ArrayList; +import java.util.List; + public class MySqlShowColumnsStatement extends MySqlStatementImpl implements MySqlShowStatement { private boolean full; @@ -85,4 +89,21 @@ public class MySqlShowColumnsStatement extends MySqlStatementImpl implements MyS } visitor.endVisit(this); } + + public List getChildren() { + List children = new ArrayList(); + if (table != null) { + children.add(table); + } + if (database != null) { + children.add(database); + } + if (like != null) { + children.add(like); + } + if (where != null) { + children.add(where); + } + return children; + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlStatementImpl.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlStatementImpl.java index 589655d65b..df20690592 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlStatementImpl.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MySqlStatementImpl.java @@ -15,11 +15,14 @@ */ package com.alibaba.druid.sql.dialect.mysql.ast.statement; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; import com.alibaba.druid.util.JdbcConstants; +import java.util.List; + public abstract class MySqlStatementImpl extends SQLStatementImpl implements MySqlStatement { public MySqlStatementImpl() { @@ -38,4 +41,8 @@ public abstract class MySqlStatementImpl extends SQLStatementImpl implements MyS public void accept0(MySqlASTVisitor visitor) { throw new UnsupportedOperationException(this.getClass().getName()); } + + public List getChildren() { + throw new UnsupportedOperationException(this.getClass().getName()); + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MysqlDeallocatePrepareStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MysqlDeallocatePrepareStatement.java index df3c836e45..55bfc0d875 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MysqlDeallocatePrepareStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/ast/statement/MysqlDeallocatePrepareStatement.java @@ -16,8 +16,12 @@ package com.alibaba.druid.sql.dialect.mysql.ast.statement; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; +import java.util.Collections; +import java.util.List; + public class MysqlDeallocatePrepareStatement extends MySqlStatementImpl { private SQLName statementName; @@ -37,4 +41,8 @@ public class MysqlDeallocatePrepareStatement extends MySqlStatementImpl { visitor.endVisit(this); } + @Override + public List getChildren() { + return Collections.singletonList(statementName); + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java index ecc4eaa86d..d796b7d6ea 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/parser/MySqlExprParser.java @@ -42,8 +42,8 @@ import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey.Match; import com.alibaba.druid.sql.dialect.mysql.ast.MysqlForeignKey.Option; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExtractExpr; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalUnit; +import com.alibaba.druid.sql.ast.expr.SQLIntervalExpr; +import com.alibaba.druid.sql.ast.expr.SQLIntervalUnit; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlMatchAgainstExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlMatchAgainstExpr.SearchModifier; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOrderingExpr; @@ -352,7 +352,7 @@ public class MySqlExprParser extends SQLExprParser { } String unitVal = lexer.stringVal(); - MySqlIntervalUnit unit = MySqlIntervalUnit.valueOf(unitVal.toUpperCase()); + SQLIntervalUnit unit = SQLIntervalUnit.valueOf(unitVal.toUpperCase()); lexer.nextToken(); accept(Token.FROM); @@ -441,9 +441,9 @@ public class MySqlExprParser extends SQLExprParser { String unit = lexer.stringVal(); lexer.nextToken(); - MySqlIntervalExpr intervalExpr = new MySqlIntervalExpr(); + SQLIntervalExpr intervalExpr = new SQLIntervalExpr(); intervalExpr.setValue(value); - intervalExpr.setUnit(MySqlIntervalUnit.valueOf(unit.toUpperCase())); + intervalExpr.setUnit(SQLIntervalUnit.valueOf(unit.toUpperCase())); return intervalExpr; } else { return primaryRest(methodInvokeExpr); @@ -458,9 +458,9 @@ public class MySqlExprParser extends SQLExprParser { String unit = lexer.stringVal(); lexer.nextToken(); - MySqlIntervalExpr intervalExpr = new MySqlIntervalExpr(); + SQLIntervalExpr intervalExpr = new SQLIntervalExpr(); intervalExpr.setValue(value); - intervalExpr.setUnit(MySqlIntervalUnit.valueOf(unit.toUpperCase())); + intervalExpr.setUnit(SQLIntervalUnit.valueOf(unit.toUpperCase())); return intervalExpr; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java index d5b6ea254d..406e5bef2d 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitor.java @@ -34,7 +34,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlRepeatStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlSelectIntoStatement; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExtractExpr; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr; +import com.alibaba.druid.sql.ast.expr.SQLIntervalExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlMatchAgainstExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOrderingExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr; @@ -63,10 +63,6 @@ public interface MySqlASTVisitor extends SQLASTVisitor { void endVisit(MysqlForeignKey x); - void endVisit(MySqlIntervalExpr x); - - boolean visit(MySqlIntervalExpr x); - void endVisit(MySqlExtractExpr x); boolean visit(MySqlExtractExpr x); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java index 37830264dc..2488b192f5 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlASTVisitorAdapter.java @@ -34,7 +34,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlRepeatStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlSelectIntoStatement; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExtractExpr; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr; +import com.alibaba.druid.sql.ast.expr.SQLIntervalExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlMatchAgainstExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOrderingExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr; @@ -78,13 +78,11 @@ public class MySqlASTVisitorAdapter extends SQLASTVisitorAdapter implements MySq } @Override - public void endVisit(MySqlIntervalExpr x) { - + public void endVisit(SQLIntervalExpr x) { } @Override - public boolean visit(MySqlIntervalExpr x) { - + public boolean visit(SQLIntervalExpr x) { return true; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java index 281b7ad8e4..761f72af98 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlOutputVisitor.java @@ -39,7 +39,6 @@ import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlRepeatStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlSelectIntoStatement; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExtractExpr; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlMatchAgainstExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOrderingExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr; @@ -689,21 +688,6 @@ public class MySqlOutputVisitor extends SQLASTOutputVisitor implements MySqlASTV return false; } - @Override - public void endVisit(MySqlIntervalExpr x) { - - } - - @Override - public boolean visit(MySqlIntervalExpr x) { - print0(ucase ? "INTERVAL " : "interval "); - SQLExpr value = x.getValue(); - value.accept(this); - print(' '); - print0(ucase ? x.getUnit().name() : x.getUnit().name_lcase); - return false; - } - @Override public boolean visit(MySqlExtractExpr x) { print0(ucase ? "EXTRACT(" : "extract("); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java index 2ee0d88c36..a107fa1e73 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/mysql/visitor/MySqlSchemaStatVisitor.java @@ -15,12 +15,9 @@ */ package com.alibaba.druid.sql.dialect.mysql.visitor; -import com.alibaba.druid.sql.ast.SQLDeclareItem; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLObject; -import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; -import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlForceIndexHint; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlIgnoreIndexHint; @@ -41,7 +38,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlRepeatStatement; import com.alibaba.druid.sql.dialect.mysql.ast.clause.MySqlSelectIntoStatement; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlExtractExpr; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr; +import com.alibaba.druid.sql.ast.expr.SQLIntervalExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlMatchAgainstExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOrderingExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr; @@ -55,8 +52,6 @@ import com.alibaba.druid.stat.TableStat.Mode; import com.alibaba.druid.util.JdbcConstants; import com.alibaba.druid.util.JdbcUtils; -import java.util.Map; - public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlASTVisitor { public MySqlSchemaStatVisitor() { @@ -172,17 +167,6 @@ public class MySqlSchemaStatVisitor extends SchemaStatVisitor implements MySqlAS } - @Override - public void endVisit(MySqlIntervalExpr x) { - - } - - @Override - public boolean visit(MySqlIntervalExpr x) { - - return true; - } - @Override public void endVisit(MySqlExtractExpr x) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsShowStatisticStmt.java b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsShowStatisticStmt.java index c73dfbe740..97345685a6 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsShowStatisticStmt.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsShowStatisticStmt.java @@ -15,6 +15,7 @@ */ package com.alibaba.druid.sql.dialect.odps.ast; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLStatement; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; @@ -22,6 +23,9 @@ import com.alibaba.druid.sql.dialect.odps.visitor.OdpsASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; import com.alibaba.druid.util.JdbcConstants; +import java.util.Collections; +import java.util.List; + public class OdpsShowStatisticStmt extends SQLStatementImpl { private SQLExprTableSource tableSource; @@ -49,4 +53,9 @@ public class OdpsShowStatisticStmt extends SQLStatementImpl { } visitor.endVisit(this); } + + @Override + public List getChildren() { + return Collections.singletonList(this.tableSource); + } } 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 bfba082260..a367519ad6 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 @@ -16,10 +16,15 @@ package com.alibaba.druid.sql.dialect.oracle.ast.expr; import com.alibaba.druid.sql.ast.SQLDataType; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLOver; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + public class OracleAnalytic extends SQLOver implements OracleExpr { private OracleAnalyticWindowing windowing; @@ -42,6 +47,19 @@ public class OracleAnalytic extends SQLOver implements OracleExpr { visitor.endVisit(this); } + @Override + public List getChildren() { + List children = new ArrayList(); + children.addAll(this.partitionBy); + if (this.orderBy != null) { + children.add(orderBy); + } + if (this.windowing != null) { + children.add(windowing); + } + return children; + } + public OracleAnalyticWindowing getWindowing() { return this.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 f63806665b..e833cd3581 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 @@ -16,10 +16,14 @@ package com.alibaba.druid.sql.dialect.oracle.ast.expr; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.SQLObjectImpl; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.Collections; +import java.util.List; + public class OracleAnalyticWindowing extends SQLObjectImpl implements OracleExpr { private Type type; @@ -69,4 +73,9 @@ public class OracleAnalyticWindowing extends SQLObjectImpl implements OracleExpr public static enum Type { ROWS, RANGE; } + + @Override + public List getChildren() { + return Collections.singletonList(this.expr); + } } 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 8d0f117f86..3306be0097 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 @@ -16,9 +16,13 @@ package com.alibaba.druid.sql.dialect.oracle.ast.expr; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; +import java.util.Collections; +import java.util.List; + public class OracleArgumentExpr extends OracleSQLObjectImpl implements SQLExpr { private String argumentName; @@ -67,4 +71,10 @@ public class OracleArgumentExpr extends OracleSQLObjectImpl implements SQLExpr { return x; } + + @Override + public List getChildren() { + return Collections.singletonList(this.value); + } + } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleBinaryFloatExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleBinaryFloatExpr.java index fb8fbb0e9f..db6fc4ca6f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleBinaryFloatExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleBinaryFloatExpr.java @@ -15,10 +15,14 @@ */ package com.alibaba.druid.sql.dialect.oracle.ast.expr; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.expr.SQLNumericLiteralExpr; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.Collections; +import java.util.List; + public class OracleBinaryFloatExpr extends SQLNumericLiteralExpr implements OracleExpr { private Float value; @@ -36,6 +40,11 @@ public class OracleBinaryFloatExpr extends SQLNumericLiteralExpr implements Orac return new OracleBinaryFloatExpr(value); } + @Override + public List getChildren() { + return Collections.emptyList(); + } + @Override public Number getNumber() { return value; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleCursorExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleCursorExpr.java index 699bfb9222..119502fcde 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleCursorExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleCursorExpr.java @@ -16,10 +16,14 @@ package com.alibaba.druid.sql.dialect.oracle.ast.expr; import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.statement.SQLSelect; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.Collections; +import java.util.List; + public class OracleCursorExpr extends SQLExprImpl implements OracleExpr { private SQLSelect query; @@ -60,6 +64,11 @@ public class OracleCursorExpr extends SQLExprImpl implements OracleExpr { visitor.endVisit(this); } + @Override + public List getChildren() { + return Collections.singletonList(this.query); + } + @Override public int hashCode() { final int prime = 31; 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 dd2e55ad1b..eac33332ca 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,10 +16,15 @@ package com.alibaba.druid.sql.dialect.oracle.ast.expr; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLObject; 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; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + public class OracleDatetimeExpr extends OracleSQLObjectImpl implements SQLExpr { private SQLExpr expr; @@ -72,4 +77,9 @@ public class OracleDatetimeExpr extends OracleSQLObjectImpl implements SQLExpr { return x; } + + @Override + public List getChildren() { + return Arrays.asList(this.expr, this.timeZone); + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleDbLinkExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleDbLinkExpr.java index 66c26134fb..abb45ca764 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleDbLinkExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleDbLinkExpr.java @@ -18,10 +18,14 @@ package com.alibaba.druid.sql.dialect.oracle.ast.expr; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLExprImpl; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; import com.alibaba.druid.util.FnvHash; +import java.util.Collections; +import java.util.List; + public class OracleDbLinkExpr extends SQLExprImpl implements SQLName, OracleExpr { private SQLExpr expr; @@ -74,6 +78,11 @@ public class OracleDbLinkExpr extends SQLExprImpl implements SQLName, OracleExpr visitor.endVisit(this); } + @Override + public List getChildren() { + return Collections.singletonList(this.expr); + } + @Override public int hashCode() { long value = hashCode64(); @@ -97,12 +106,10 @@ public class OracleDbLinkExpr extends SQLExprImpl implements SQLName, OracleExpr public OracleDbLinkExpr clone() { OracleDbLinkExpr x = new OracleDbLinkExpr(); - if (expr != null) { - expr = expr.clone(); + x.setExpr(expr.clone()); } x.dbLink = dbLink; - return x; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleIntervalExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleIntervalExpr.java index 71658a5eff..0362ddd30d 100755 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleIntervalExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleIntervalExpr.java @@ -17,10 +17,14 @@ package com.alibaba.druid.sql.dialect.oracle.ast.expr; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.Collections; +import java.util.List; + public class OracleIntervalExpr extends SQLExprImpl implements SQLLiteralExpr, OracleExpr { private SQLExpr value; @@ -47,6 +51,11 @@ public class OracleIntervalExpr extends SQLExprImpl implements SQLLiteralExpr, O return x; } + @Override + public List getChildren() { + return Collections.singletonList(this.value); + } + public SQLExpr getValue() { return this.value; } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleIsSetExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleIsSetExpr.java index 7e6982c74c..5cb84ece8f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleIsSetExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleIsSetExpr.java @@ -17,9 +17,13 @@ package com.alibaba.druid.sql.dialect.oracle.ast.expr; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.Collections; +import java.util.List; + public class OracleIsSetExpr extends SQLExprImpl implements OracleExpr { private SQLExpr nestedTable; @@ -63,6 +67,11 @@ public class OracleIsSetExpr extends SQLExprImpl implements OracleExpr { visitor.endVisit(this); } + @Override + public List getChildren() { + return Collections.singletonList(this.nestedTable); + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleOuterExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleOuterExpr.java index 773c5b87a3..30f8b7a919 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleOuterExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleOuterExpr.java @@ -17,9 +17,13 @@ package com.alibaba.druid.sql.dialect.oracle.ast.expr; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLExprImpl; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; import com.alibaba.druid.sql.visitor.SQLASTVisitor; +import java.util.Collections; +import java.util.List; + public class OracleOuterExpr extends SQLExprImpl implements OracleExpr { private SQLExpr expr; @@ -67,6 +71,11 @@ public class OracleOuterExpr extends SQLExprImpl implements OracleExpr { visitor.endVisit(this); } + @Override + public List getChildren() { + return Collections.singletonList(this.expr); + } + @Override public int hashCode() { final int prime = 31; 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 023cbe5524..c7096d1fc4 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 @@ -16,9 +16,14 @@ package com.alibaba.druid.sql.dialect.oracle.ast.expr; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + public class OracleRangeExpr extends OracleSQLObjectImpl implements SQLExpr { private SQLExpr lowBound; @@ -42,6 +47,10 @@ public class OracleRangeExpr extends OracleSQLObjectImpl implements SQLExpr { visitor.endVisit(this); } + public List getChildren() { + return Arrays.asList(this.lowBound, this.upBound); + } + public SQLExpr getLowBound() { return lowBound; } 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 512456a5dd..72b2dcf9aa 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 @@ -16,9 +16,13 @@ package com.alibaba.druid.sql.dialect.oracle.ast.expr; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; +import java.util.Collections; +import java.util.List; + public class OracleSizeExpr extends OracleSQLObjectImpl implements OracleExpr { private SQLExpr value; @@ -42,6 +46,10 @@ public class OracleSizeExpr extends OracleSQLObjectImpl implements OracleExpr { visitor.endVisit(this); } + public List getChildren() { + return Collections.singletonList(value); + } + public SQLExpr getValue() { return value; } 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 2da3a86d3f..950681d794 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 @@ -15,10 +15,15 @@ */ package com.alibaba.druid.sql.dialect.oracle.ast.expr; +import com.alibaba.druid.sql.SQLUtils; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; +import java.util.Collections; +import java.util.List; + public class OracleSysdateExpr extends OracleSQLObjectImpl implements SQLExpr { private String option; @@ -42,4 +47,13 @@ public class OracleSysdateExpr extends OracleSQLObjectImpl implements SQLExpr { x.option = option; return x; } + + @Override + public List getChildren() { + return Collections.emptyList(); + } + + public String toString() { + return SQLUtils.toOracleString(this); + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleTreatExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleTreatExpr.java index 6c318d9ecb..70b217e88f 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleTreatExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/expr/OracleTreatExpr.java @@ -17,9 +17,14 @@ package com.alibaba.druid.sql.dialect.oracle.ast.expr; import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.dialect.oracle.ast.OracleSQLObjectImpl; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + public class OracleTreatExpr extends OracleSQLObjectImpl implements SQLExpr { private SQLExpr expr; @@ -65,6 +70,10 @@ public class OracleTreatExpr extends OracleSQLObjectImpl implements SQLExpr { visitor.endVisit(this); } + public List getChildren() { + return Arrays.asList(this.expr, this.type); + } + public OracleTreatExpr clone() { OracleTreatExpr x = new OracleTreatExpr(); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleLockTableStatement.java b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleLockTableStatement.java index 34977a2d1b..a9e989d10c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleLockTableStatement.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleLockTableStatement.java @@ -17,9 +17,13 @@ package com.alibaba.druid.sql.dialect.oracle.ast.stmt; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.statement.SQLExprTableSource; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; +import java.util.ArrayList; +import java.util.List; + public class OracleLockTableStatement extends OracleStatementImpl { private SQLExprTableSource table; @@ -76,6 +80,17 @@ public class OracleLockTableStatement extends OracleStatementImpl { visitor.endVisit(this); } + public List getChildren() { + List children = new ArrayList(); + if (table != null) { + children.add(table); + } + if (wait != null) { + children.add(wait); + } + return children; + } + public static enum LockMode { ROW_SHARE, ROW_EXCLUSIVE, 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 92f8afd1fc..e2e53605dc 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 @@ -108,6 +108,9 @@ public class OracleSelectParser extends SQLSelectParser { if (lexer.token() == Token.OF) { lexer.nextToken(); this.exprParser.exprList(queryBlock.getForUpdateOf(), queryBlock); + } else if (lexer.token() == Token.LPAREN + && queryBlock.isForUpdate()) { + this.exprParser.exprList(queryBlock.getForUpdateOf(), queryBlock); } if (lexer.token() == Token.NOWAIT) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGBoxExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGBoxExpr.java index d3d7574a95..97ed69b928 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGBoxExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGBoxExpr.java @@ -16,8 +16,12 @@ package com.alibaba.druid.sql.dialect.postgresql.ast.expr; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitor; +import java.util.Collections; +import java.util.List; + public class PGBoxExpr extends PGExprImpl { private SQLExpr value; @@ -46,6 +50,10 @@ public class PGBoxExpr extends PGExprImpl { visitor.endVisit(this); } + public List getChildren() { + return Collections.singletonList(value); + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGCidrExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGCidrExpr.java index 59fba1934f..597c70f77b 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGCidrExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGCidrExpr.java @@ -16,8 +16,12 @@ package com.alibaba.druid.sql.dialect.postgresql.ast.expr; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitor; +import java.util.Collections; +import java.util.List; + public class PGCidrExpr extends PGExprImpl { private SQLExpr value; @@ -46,6 +50,10 @@ public class PGCidrExpr extends PGExprImpl { visitor.endVisit(this); } + public List getChildren() { + return Collections.singletonList(value); + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGCircleExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGCircleExpr.java index f07533e9a5..0c9f6b838d 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGCircleExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGCircleExpr.java @@ -16,8 +16,12 @@ package com.alibaba.druid.sql.dialect.postgresql.ast.expr; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitor; +import java.util.Collections; +import java.util.List; + public class PGCircleExpr extends PGExprImpl { private SQLExpr value; @@ -46,6 +50,11 @@ public class PGCircleExpr extends PGExprImpl { visitor.endVisit(this); } + @Override + public List getChildren() { + return Collections.singletonList(value); + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGExtractExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGExtractExpr.java index 6ffa71b9b0..da8228bc1c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGExtractExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGExtractExpr.java @@ -16,8 +16,12 @@ package com.alibaba.druid.sql.dialect.postgresql.ast.expr; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitor; +import java.util.Collections; +import java.util.List; + public class PGExtractExpr extends PGExprImpl { private PGDateField field; @@ -59,6 +63,10 @@ public class PGExtractExpr extends PGExprImpl { visitor.endVisit(this); } + public List getChildren() { + return Collections.singletonList(source); + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGInetExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGInetExpr.java index 85b27ee8ea..944892318a 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGInetExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGInetExpr.java @@ -16,8 +16,12 @@ package com.alibaba.druid.sql.dialect.postgresql.ast.expr; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitor; +import java.util.Collections; +import java.util.List; + public class PGInetExpr extends PGExprImpl { private SQLExpr value; @@ -46,6 +50,10 @@ public class PGInetExpr extends PGExprImpl { visitor.endVisit(this); } + public List getChildren() { + return Collections.singletonList(value); + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGIntervalExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGIntervalExpr.java deleted file mode 100644 index 8fa46f540e..0000000000 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGIntervalExpr.java +++ /dev/null @@ -1,76 +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.postgresql.ast.expr; - -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLExprImpl; -import com.alibaba.druid.sql.ast.expr.SQLLiteralExpr; -import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitor; -import com.alibaba.druid.sql.visitor.SQLASTVisitor; - -/** - * Created by tianzhen.wtz on 2014/12/29 0029 16:10. - * 类说明: - */ -public class PGIntervalExpr extends SQLExprImpl implements SQLLiteralExpr,PGExpr{ - - private SQLExpr value; - - - public SQLExpr getValue() { - return value; - } - - public void setValue(SQLExpr value) { - this.value = value; - } - - @Override - public void accept0(PGASTVisitor visitor) { - visitor.visit(this); - visitor.endVisit(this); - } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - PGIntervalExpr that = (PGIntervalExpr) o; - - if (value != null ? !value.equals(that.value) : that.value != null) return false; - - return true; - } - - @Override - public int hashCode() { - return value != null ? value.hashCode() : 0; - } - - @Override - protected void accept0(SQLASTVisitor visitor) { - this.accept0((PGASTVisitor) visitor); - } - - public PGIntervalExpr clone() { - PGIntervalExpr x = new PGIntervalExpr(); - if (value != null) { - x.setValue(value.clone()); - } - return x; - } -} diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGLineSegmentsExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGLineSegmentsExpr.java index fb654905ff..abf42f914c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGLineSegmentsExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGLineSegmentsExpr.java @@ -16,8 +16,12 @@ package com.alibaba.druid.sql.dialect.postgresql.ast.expr; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitor; +import java.util.Collections; +import java.util.List; + public class PGLineSegmentsExpr extends PGExprImpl { private SQLExpr value; @@ -46,6 +50,11 @@ public class PGLineSegmentsExpr extends PGExprImpl { visitor.endVisit(this); } + @Override + public List getChildren() { + return Collections.singletonList(value); + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGMacAddrExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGMacAddrExpr.java index e211f1ba78..bec29dbc3c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGMacAddrExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGMacAddrExpr.java @@ -16,8 +16,12 @@ package com.alibaba.druid.sql.dialect.postgresql.ast.expr; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitor; +import java.util.Collections; +import java.util.List; + public class PGMacAddrExpr extends PGExprImpl { @@ -47,6 +51,10 @@ public class PGMacAddrExpr extends PGExprImpl { visitor.endVisit(this); } + public List getChildren() { + return Collections.singletonList(value); + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGPointExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGPointExpr.java index ecebd08516..ff5e40a3f2 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGPointExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGPointExpr.java @@ -16,8 +16,12 @@ package com.alibaba.druid.sql.dialect.postgresql.ast.expr; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitor; +import java.util.Collections; +import java.util.List; + public class PGPointExpr extends PGExprImpl { private SQLExpr value; @@ -46,6 +50,10 @@ public class PGPointExpr extends PGExprImpl { visitor.endVisit(this); } + public List getChildren() { + return Collections.singletonList(value); + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGPolygonExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGPolygonExpr.java index 16e3d6e874..35f0460af9 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGPolygonExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/ast/expr/PGPolygonExpr.java @@ -16,8 +16,12 @@ package com.alibaba.druid.sql.dialect.postgresql.ast.expr; import com.alibaba.druid.sql.ast.SQLExpr; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitor; +import java.util.Collections; +import java.util.List; + public class PGPolygonExpr extends PGExprImpl { @@ -47,6 +51,10 @@ public class PGPolygonExpr extends PGExprImpl { visitor.endVisit(this); } + public List getChildren() { + return Collections.singletonList(value); + } + @Override public int hashCode() { final int prime = 31; diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java index 1a46dbddef..3e7cadc704 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/parser/PGExprParser.java @@ -17,21 +17,13 @@ package com.alibaba.druid.sql.dialect.postgresql.parser; import com.alibaba.druid.sql.ast.SQLDataType; import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.expr.SQLArrayExpr; -import com.alibaba.druid.sql.ast.expr.SQLBinaryExpr; -import com.alibaba.druid.sql.ast.expr.SQLCharExpr; -import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; -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.expr.*; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGBoxExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGCidrExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGCircleExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGDateField; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGExtractExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGInetExpr; -import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGIntervalExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGLineSegmentsExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGMacAddrExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGPointExpr; @@ -125,7 +117,7 @@ public class PGExprParser extends SQLExprParser { @Override protected SQLExpr parseInterval() { accept(Token.INTERVAL); - PGIntervalExpr intervalExpr=new PGIntervalExpr(); + SQLIntervalExpr intervalExpr = new SQLIntervalExpr(); if (lexer.token() != Token.LITERAL_CHARS) { return new SQLIdentifierExpr("INTERVAL"); } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitor.java index 2319408d21..d6adfbb197 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitor.java @@ -101,10 +101,6 @@ public interface PGASTVisitor extends SQLASTVisitor { boolean visit(PGLineSegmentsExpr x); - void endVisit(PGIntervalExpr x); - - boolean visit(PGIntervalExpr x); - void endVisit(PGShowStatement x); boolean visit(PGShowStatement x); diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitorAdapter.java index 550b8af2dc..d04e12d50c 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGASTVisitorAdapter.java @@ -20,7 +20,6 @@ import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGCidrExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGCircleExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGExtractExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGInetExpr; -import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGIntervalExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGLineSegmentsExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGMacAddrExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGPointExpr; @@ -238,16 +237,6 @@ public class PGASTVisitorAdapter extends SQLASTVisitorAdapter implements PGASTVi return true; } - @Override - public void endVisit(PGIntervalExpr x) { - - } - - @Override - public boolean visit(PGIntervalExpr x) { - return true; - } - @Override public void endVisit(PGShowStatement x) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java index a94734340b..08d1052847 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGOutputVisitor.java @@ -23,13 +23,11 @@ import com.alibaba.druid.sql.ast.expr.*; import com.alibaba.druid.sql.ast.statement.*; import com.alibaba.druid.sql.dialect.oracle.ast.expr.*; import com.alibaba.druid.sql.dialect.oracle.ast.stmt.*; -import com.alibaba.druid.sql.dialect.oracle.visitor.OracleOutputVisitor; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGBoxExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGCidrExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGCircleExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGExtractExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGInetExpr; -import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGIntervalExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGLineSegmentsExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGMacAddrExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGPointExpr; @@ -551,18 +549,6 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor return false; } - @Override - public void endVisit(PGIntervalExpr x) { - - } - - @Override - public boolean visit(PGIntervalExpr x) { - print0(ucase ? "INTERVAL " : "interval "); - x.getValue().accept(this); - return true; - } - @Override public void endVisit(PGLineSegmentsExpr x) { @@ -873,4 +859,108 @@ public class PGOutputVisitor extends SQLASTOutputVisitor implements PGASTVisitor visit((SQLUnique) x); return false; } + + public boolean visit(OracleSelectSubqueryTableSource x) { + print('('); + this.indentCount++; + println(); + x.getSelect().accept(this); + this.indentCount--; + println(); + print(')'); + + if (x.getPivot() != null) { + println(); + x.getPivot().accept(this); + } + + printFlashback(x.getFlashback()); + + if ((x.getAlias() != null) && (x.getAlias().length() != 0)) { + print(' '); + print0(x.getAlias()); + } + + return false; + } + + public boolean visit(OracleSelectJoin x) { + x.getLeft().accept(this); + SQLTableSource right = x.getRight(); + + if (x.getJoinType() == SQLJoinTableSource.JoinType.COMMA) { + print0(", "); + x.getRight().accept(this); + } else { + boolean isRoot = x.getParent() instanceof SQLSelectQueryBlock; + if (isRoot) { + this.indentCount++; + } + + println(); + print0(ucase ? x.getJoinType().name : x.getJoinType().name_lcase); + print(' '); + + if (right instanceof SQLJoinTableSource) { + print('('); + right.accept(this); + print(')'); + } else { + right.accept(this); + } + + if (isRoot) { + this.indentCount--; + } + + if (x.getCondition() != null) { + print0(ucase ? " ON " : " on "); + x.getCondition().accept(this); + print(' '); + } + + if (x.getUsing().size() > 0) { + print0(ucase ? " USING (" : " using ("); + printAndAccept(x.getUsing(), ", "); + print(')'); + } + + printFlashback(x.getFlashback()); + } + + return false; + } + + public boolean visit(OracleDbLinkExpr x) { + SQLExpr expr = x.getExpr(); + if (expr != null) { + expr.accept(this); + print('@'); + } + print0(x.getDbLink()); + return false; + } + + public void endVisit(OracleDbLinkExpr x) { + + } + + public boolean visit(OracleDeleteStatement x) { + return visit((SQLDeleteStatement) x); + } + + private void printFlashback(SQLExpr flashback) { + if (flashback == null) { + return; + } + + println(); + + if (flashback instanceof SQLBetweenExpr) { + flashback.accept(this); + } else { + print0(ucase ? "AS OF " : "as of "); + flashback.accept(this); + } + } } diff --git a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGSchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGSchemaStatVisitor.java index 328c94c370..240a1a4b4b 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGSchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/postgresql/visitor/PGSchemaStatVisitor.java @@ -18,7 +18,6 @@ package com.alibaba.druid.sql.dialect.postgresql.visitor; import java.util.Map; import com.alibaba.druid.sql.ast.SQLName; -import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import com.alibaba.druid.sql.ast.statement.SQLSelectStatement; import com.alibaba.druid.sql.ast.statement.SQLTableSource; @@ -27,7 +26,6 @@ import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGCidrExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGCircleExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGExtractExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGInetExpr; -import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGIntervalExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGLineSegmentsExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGMacAddrExpr; import com.alibaba.druid.sql.dialect.postgresql.ast.expr.PGPointExpr; @@ -311,16 +309,6 @@ public class PGSchemaStatVisitor extends SchemaStatVisitor implements PGASTVisit return true; } - @Override - public void endVisit(PGIntervalExpr x) { - - } - - @Override - public boolean visit(PGIntervalExpr x) { - return true; - } - @Override public void endVisit(PGLineSegmentsExpr x) { diff --git a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/expr/SQLServerObjectReferenceExpr.java b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/expr/SQLServerObjectReferenceExpr.java index a4c5108afd..f1146030a6 100644 --- a/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/expr/SQLServerObjectReferenceExpr.java +++ b/src/main/java/com/alibaba/druid/sql/dialect/sqlserver/ast/expr/SQLServerObjectReferenceExpr.java @@ -17,12 +17,16 @@ package com.alibaba.druid.sql.dialect.sqlserver.ast.expr; import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLName; +import com.alibaba.druid.sql.ast.SQLObject; import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr; import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr; import com.alibaba.druid.sql.dialect.sqlserver.ast.SQLServerObjectImpl; import com.alibaba.druid.sql.dialect.sqlserver.visitor.SQLServerASTVisitor; import com.alibaba.druid.util.FnvHash; +import java.util.Collections; +import java.util.List; + public class SQLServerObjectReferenceExpr extends SQLServerObjectImpl implements SQLServerExpr, SQLName { private String server; @@ -151,4 +155,8 @@ public class SQLServerObjectReferenceExpr extends SQLServerObjectImpl implements } return hashCode64; } + + public List getChildren() { + return Collections.emptyList(); + } } diff --git a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java index 52a7f4378e..17498091cf 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/Lexer.java +++ b/src/main/java/com/alibaba/druid/sql/parser/Lexer.java @@ -21,6 +21,7 @@ import static com.alibaba.druid.sql.parser.CharTypes.isWhitespace; import static com.alibaba.druid.sql.parser.LayoutCharacters.EOI; import static com.alibaba.druid.sql.parser.SQLParserFeature.KeepComments; import static com.alibaba.druid.sql.parser.SQLParserFeature.OptimizedForParameterized; +import static com.alibaba.druid.sql.parser.SQLParserFeature.SkipComments; import static com.alibaba.druid.sql.parser.Token.*; import java.math.BigDecimal; @@ -1924,6 +1925,8 @@ public class Lexer { optimizedForParameterized = state; } else if (feature == KeepComments) { this.keepComments = state; + } else if (feature == SkipComments) { + this.skipComment = state; } } diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index 171380f74b..8eebcb2cbb 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -2034,13 +2034,21 @@ public class SQLExprParser extends SQLParser { } } else if (lexer.token == Token.IN) { lexer.nextToken(); - accept(Token.LPAREN); SQLInListExpr inListExpr = new SQLInListExpr(expr, true); - exprList(inListExpr.getTargetList(), inListExpr); - expr = inListExpr; + if (lexer.token == Token.LPAREN) { + lexer.nextToken(); - accept(Token.RPAREN); + exprList(inListExpr.getTargetList(), inListExpr); + expr = inListExpr; + + accept(Token.RPAREN); + } else { + SQLExpr valueExpr = this.primary(); + valueExpr.setParent(inListExpr); + inListExpr.getTargetList().add(valueExpr); + expr = inListExpr; + } if (inListExpr.getTargetList().size() == 1) { SQLExpr targetExpr = inListExpr.getTargetList().get(0); @@ -2670,14 +2678,17 @@ public class SQLExprParser extends SQLParser { if (token == Token.AS) { lexer.nextToken(); - String as = lexer.stringVal(); + String as = null; + if (lexer.token != Token.COMMA && lexer.token != Token.FROM) { + as = lexer.stringVal(); - lexer.nextTokenComma(); + lexer.nextTokenComma(); - if (lexer.token == Token.DOT) { - lexer.nextToken(); - as += '.' + lexer.stringVal(); - lexer.nextToken(); + if (lexer.token == Token.DOT) { + lexer.nextToken(); + as += '.' + lexer.stringVal(); + lexer.nextToken(); + } } return new SQLSelectItem(expr, as, connectByRoot); @@ -2689,7 +2700,8 @@ public class SQLExprParser extends SQLParser { return new SQLSelectItem(expr, as, connectByRoot); } - if (token == Token.IDENTIFIER && hash_lower != FnvHash.Constants.CURRENT) { + if ((token == Token.IDENTIFIER && hash_lower != FnvHash.Constants.CURRENT) + || token == Token.MODEL) { String as = lexer.stringVal(); lexer.nextTokenComma(); return new SQLSelectItem(expr, as, connectByRoot); @@ -2716,6 +2728,7 @@ public class SQLExprParser extends SQLParser { final String alias; switch (lexer.token) { case FULL: + case MODEL: alias = lexer.stringVal(); lexer.nextToken(); break; diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLParserFeature.java b/src/main/java/com/alibaba/druid/sql/parser/SQLParserFeature.java index fc33d77784..4a944aa0fe 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLParserFeature.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLParserFeature.java @@ -19,7 +19,8 @@ public enum SQLParserFeature { KeepInsertValueClauseOriginalString, EnableSQLBinaryOpExprGroup, OptimizedForParameterized, - KeepComments + KeepComments, + SkipComments ; private SQLParserFeature(){ diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLSelectListCache.java b/src/main/java/com/alibaba/druid/sql/parser/SQLSelectListCache.java index eaa84a2e33..b4b73c35b0 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLSelectListCache.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLSelectListCache.java @@ -21,11 +21,12 @@ import com.alibaba.druid.sql.ast.statement.SQLSelectQueryBlock; import java.util.ArrayList; import java.util.List; import java.util.Map; +import java.util.concurrent.CopyOnWriteArrayList; public class SQLSelectListCache { private final String dbType; - private List sqlCache = new ArrayList(); - private List queryBlockCache = new ArrayList(); + private List sqlCache = new CopyOnWriteArrayList(); + private List queryBlockCache = new CopyOnWriteArrayList(); private List printSqlList = new ArrayList(); public SQLSelectListCache(String dbType) { diff --git a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index 9f56f4905f..3d0be2ef58 100644 --- a/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -2621,7 +2621,7 @@ public class SQLStatementParser extends SQLParser { public SQLOpenStatement parseOpen() { SQLOpenStatement stmt = new SQLOpenStatement(); accept(Token.OPEN); - stmt.setCursorName(exprParser.name().getSimpleName()); + stmt.setCursorName(exprParser.name()); if (lexer.token == Token.LPAREN) { lexer.nextToken(); @@ -2674,7 +2674,7 @@ public class SQLStatementParser extends SQLParser { public SQLStatement parseClose() { SQLCloseStatement stmt = new SQLCloseStatement(); accept(Token.CLOSE); - stmt.setCursorName(exprParser.name().getSimpleName()); + stmt.setCursorName(exprParser.name()); accept(Token.SEMI); stmt.setAfterSemi(true); return stmt; diff --git a/src/main/java/com/alibaba/druid/sql/repository/SchemaRepository.java b/src/main/java/com/alibaba/druid/sql/repository/SchemaRepository.java index cee9b4929c..9fe861c219 100644 --- a/src/main/java/com/alibaba/druid/sql/repository/SchemaRepository.java +++ b/src/main/java/com/alibaba/druid/sql/repository/SchemaRepository.java @@ -44,7 +44,6 @@ public class SchemaRepository { protected String dbType; protected SQLASTVisitor consoleVisitor; - public SchemaRepository() { } diff --git a/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitorFactory.java b/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitorFactory.java index 3341af3019..22c3d5c779 100644 --- a/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitorFactory.java +++ b/src/main/java/com/alibaba/druid/sql/repository/SchemaResolveVisitorFactory.java @@ -630,6 +630,11 @@ class SchemaResolveVisitorFactory { return false; } + public boolean visit(SQLFetchStatement x) { + resolve(this, x); + return false; + } + @Override public boolean isEnabled(Option option) { return (options & option.mask) != 0; @@ -1685,6 +1690,36 @@ class SchemaResolveVisitorFactory { SQLUtils.replaceInParent(x, propertyExpr); } } + + if (x.getResolvedColumn() == null + && x.getResolvedTableSource() == null) { + for (SchemaResolveVisitor.Context parentCtx = ctx; + parentCtx != null; + parentCtx = parentCtx.parent) + { + SQLDeclareItem declareItem = parentCtx.findDeclare(hash); + if (declareItem != null) { + x.setResolvedDeclareItem(declareItem); + return; + } + + if (parentCtx.object instanceof SQLBlockStatement) { + SQLBlockStatement block = (SQLBlockStatement) parentCtx.object; + SQLParameter parameter = block.findParameter(hash); + if (parameter != null) { + x.setResolvedParameter(parameter); + return; + } + } else if (parentCtx.object instanceof SQLCreateProcedureStatement) { + SQLCreateProcedureStatement createProc = (SQLCreateProcedureStatement) parentCtx.object; + SQLParameter parameter = createProc.findParameter(hash); + if (parameter != null) { + x.setResolvedParameter(parameter); + return; + } + } + } + } } static void resolve(SchemaResolveVisitor visitor, SQLPropertyExpr x) { @@ -2464,6 +2499,13 @@ class SchemaResolveVisitorFactory { visitor.popContext(); } + static void resolve(SchemaResolveVisitor visitor, SQLFetchStatement x) { + resolveExpr(visitor, x.getCursorName()); + for (SQLExpr expr : x.getInto()) { + resolveExpr(visitor, expr); + } + } + static void resolve(SchemaResolveVisitor visitor, SQLForeignKeyConstraint x) { SchemaRepository repository = visitor.getRepository(); SQLObject parent = x.getParent(); 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 98542d9a2d..2dc27f17a2 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -4110,7 +4110,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet @Override public boolean visit(SQLOpenStatement x) { print0(ucase ? "OPEN " : "open "); - print0(x.getCursorName()); + printExpr(x.getCursorName()); List columns = x.getColumns(); if (columns.size() > 0) { @@ -4143,7 +4143,7 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet @Override public boolean visit(SQLCloseStatement x) { print0(ucase ? "CLOSE " : "close "); - print0(x.getCursorName()); + printExpr(x.getCursorName()); return false; } @@ -5352,6 +5352,20 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet return false; } + @Override + public boolean visit(SQLIntervalExpr x) { + print0(ucase ? "INTERVAL " : "interval "); + SQLExpr value = x.getValue(); + value.accept(this); + + SQLIntervalUnit unit = x.getUnit(); + if (unit != null) { + print(' '); + print0(ucase ? unit.name() : unit.name_lcase); + } + return false; + } + public Boolean getPrintStatementAfterSemi() { return printStatementAfterSemi; } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java index c6790bc3e3..40d7a44c9d 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java @@ -64,9 +64,9 @@ public interface SQLASTVisitor { void endVisit(SQLSelectStatement selectStatement); - void postVisit(SQLObject astNode); + void postVisit(SQLObject x); - void preVisit(SQLObject astNode); + void preVisit(SQLObject x); boolean visit(SQLAllColumnExpr x); @@ -758,4 +758,8 @@ public interface SQLASTVisitor { boolean visit(SQLAlterTypeStatement x); void endVisit(SQLAlterTypeStatement x); + + boolean visit(SQLIntervalExpr x); + + void endVisit(SQLIntervalExpr x); } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java index 2f22226ea1..432a74d948 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitorAdapter.java @@ -1739,6 +1739,16 @@ public class SQLASTVisitorAdapter implements SQLASTVisitor { } + @Override + public boolean visit(SQLIntervalExpr x) { + return true; + } + + @Override + public void endVisit(SQLIntervalExpr x) { + + } + public final boolean isEnabled(VisitorFeature feature) { return VisitorFeature.isEnabled(this.features, feature); } diff --git a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java index 4063799307..e79454cd13 100644 --- a/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java +++ b/src/main/java/com/alibaba/druid/sql/visitor/SchemaStatVisitor.java @@ -1113,6 +1113,10 @@ public class SchemaStatVisitor extends SQLASTVisitorAdapter { return false; } + if (x.getResolvedOwnerObject() instanceof SQLParameter) { + return false; + } + boolean skip = false; for (SQLObject parent = x.getParent();parent != null;parent = parent.getParent()) { if (parent instanceof SQLSelectQueryBlock) { diff --git a/src/main/java/com/alibaba/druid/util/FnvHash.java b/src/main/java/com/alibaba/druid/util/FnvHash.java index 44a6336668..dacd724de6 100644 --- a/src/main/java/com/alibaba/druid/util/FnvHash.java +++ b/src/main/java/com/alibaba/druid/util/FnvHash.java @@ -506,5 +506,7 @@ public final class FnvHash { long MEMBER = fnv1a_64_lower("MEMBER"); long STATIC = fnv1a_64_lower("STATIC"); long UNSUPPORTED = fnv1a_64_lower("UNSUPPORTED"); + long USERENV = fnv1a_64_lower("USERENV"); + long NUMTODSINTERVAL = fnv1a_64_lower("NUMTODSINTERVAL"); } } diff --git a/src/main/java/com/alibaba/druid/wall/WallConfig.java b/src/main/java/com/alibaba/druid/wall/WallConfig.java index 3eb61754de..3a104da653 100644 --- a/src/main/java/com/alibaba/druid/wall/WallConfig.java +++ b/src/main/java/com/alibaba/druid/wall/WallConfig.java @@ -277,6 +277,7 @@ public class WallConfig implements WallConfigMBean { } public WallConfig(String dir){ + this(); this.dir = dir; this.init(); } diff --git a/src/main/resources/META-INF/druid/parser/postgresql/keywords b/src/main/resources/META-INF/druid/parser/postgresql/keywords index 270c836e62..b20e8794be 100644 --- a/src/main/resources/META-INF/druid/parser/postgresql/keywords +++ b/src/main/resources/META-INF/druid/parser/postgresql/keywords @@ -21,6 +21,7 @@ binary bit_length blob both +by call cardinality case @@ -61,8 +62,10 @@ current_user datalink date default +deferrable dense_rank deref +desc describe deterministic disconnect @@ -93,6 +96,7 @@ exec exp false fetch +final first_value floor for @@ -115,6 +119,7 @@ inner intersect intersection into +instantiable is isnull join @@ -126,6 +131,7 @@ leading left like like_regex +limit ln localtime localtimestamp @@ -157,6 +163,7 @@ open or order outer +over overlaps parameter percent @@ -164,6 +171,7 @@ percentile_cont percentile_disc percent_rank period +placing portion position_regex power @@ -183,6 +191,7 @@ regr_sxy regr_syy result return +returning right row_number scope diff --git a/src/test/java/com/alibaba/druid/bvt/bug/Issue2002.java b/src/test/java/com/alibaba/druid/bvt/bug/Issue2002.java new file mode 100644 index 0000000000..e603892b6c --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/bug/Issue2002.java @@ -0,0 +1,29 @@ +package com.alibaba.druid.bvt.bug; + +import com.alibaba.druid.filter.stat.StatFilter; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; + +public class Issue2002 extends TestCase { + public void test_for_issue() throws Exception { + String sql = "select id,sum(uv[1]) uv1,sum(uv[2]) uv2\n" + + "from xxxxx where a in\n" + + " ( \n" + + " ?\n" + + " ) \n" + + " and ta->'taAge' ??|\n" + + " \n" + + " '{ \n" + + " 1\n" + + " , \n" + + " 2\n" + + " , \n" + + " 3\n" + + " }' \n" + + "group by id"; + + StatFilter filter = new StatFilter(); + String psql = filter.mergeSql(sql, JdbcConstants.POSTGRESQL); + System.out.println(psql); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_interval_mysql.java b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_interval_mysql.java index 36c337fb46..2b0d18e2a5 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_interval_mysql.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/EqualTest_interval_mysql.java @@ -4,7 +4,7 @@ import junit.framework.TestCase; import org.junit.Assert; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr; +import com.alibaba.druid.sql.ast.expr.SQLIntervalExpr; import com.alibaba.druid.sql.dialect.mysql.parser.MySqlExprParser; import com.alibaba.druid.sql.parser.SQLExprParser; @@ -13,18 +13,18 @@ public class EqualTest_interval_mysql extends TestCase { public void test_exits() throws Exception { String sql = "INTERVAL 3 YEAR"; String sql_c = "INTERVAL 3 MONTH"; - MySqlIntervalExpr exprA, exprB, exprC; + SQLIntervalExpr exprA, exprB, exprC; { SQLExprParser parser = new MySqlExprParser(sql); - exprA = (MySqlIntervalExpr) parser.expr(); + exprA = (SQLIntervalExpr) parser.expr(); } { SQLExprParser parser = new MySqlExprParser(sql); - exprB = (MySqlIntervalExpr) parser.expr(); + exprB = (SQLIntervalExpr) parser.expr(); } { SQLExprParser parser = new MySqlExprParser(sql_c); - exprC = (MySqlIntervalExpr) parser.expr(); + exprC = (SQLIntervalExpr) parser.expr(); } Assert.assertEquals(exprA, exprB); Assert.assertNotEquals(exprA, exprC); @@ -32,7 +32,7 @@ public class EqualTest_interval_mysql extends TestCase { Assert.assertFalse(exprA.equals(new Object())); Assert.assertEquals(exprA.hashCode(), exprB.hashCode()); - Assert.assertEquals(new MySqlIntervalExpr(), new MySqlIntervalExpr()); - Assert.assertEquals(new MySqlIntervalExpr().hashCode(), new MySqlIntervalExpr().hashCode()); + Assert.assertEquals(new SQLIntervalExpr(), new SQLIntervalExpr()); + Assert.assertEquals(new SQLIntervalExpr().hashCode(), new SQLIntervalExpr().hashCode()); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlASTVisitorAdapterTest.java b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlASTVisitorAdapterTest.java index b28eda42c3..99a5b689a5 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlASTVisitorAdapterTest.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/mysql/MySqlASTVisitorAdapterTest.java @@ -10,7 +10,7 @@ import com.alibaba.druid.sql.dialect.mysql.ast.MySqlPrimaryKey; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUnique; import com.alibaba.druid.sql.dialect.mysql.ast.MySqlUseIndexHint; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlCharExpr; -import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlIntervalExpr; +import com.alibaba.druid.sql.ast.expr.SQLIntervalExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlOutFileExpr; import com.alibaba.druid.sql.dialect.mysql.ast.expr.MySqlUserName; import com.alibaba.druid.sql.dialect.mysql.ast.statement.CobarShowStatus; @@ -94,7 +94,7 @@ public class MySqlASTVisitorAdapterTest extends TestCase { new MySqlTableIndex().accept(adapter); new MySqlKey().accept(adapter); new MySqlPrimaryKey().accept(adapter); - new MySqlIntervalExpr().accept(adapter); + new SQLIntervalExpr().accept(adapter); new SQLBinaryExpr().accept(adapter); new MySqlPrepareStatement().accept(adapter); new MySqlExecuteStatement().accept(adapter); diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateFunctionTest_3.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateFunctionTest_3.java index e6a026005f..7bea7f0829 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateFunctionTest_3.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateFunctionTest_3.java @@ -134,7 +134,7 @@ public class OracleCreateFunctionTest_3 extends OracleTest { assertEquals(1, visitor.getTables().size()); - assertEquals(2, visitor.getColumns().size()); + assertEquals(1, visitor.getColumns().size()); // assertTrue(visitor.getColumns().contains(new TableStat.Column("orders", "order_total"))); } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateProcedureTest4.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateProcedureTest4.java index 7c2dc924c1..3a8160bc78 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateProcedureTest4.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateProcedureTest4.java @@ -172,7 +172,7 @@ public class OracleCreateProcedureTest4 extends OracleTest { List statementList = parser.parseStatementList(); print(statementList); - Assert.assertEquals(1, statementList.size()); + assertEquals(1, statementList.size()); OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); for (SQLStatement statement : statementList) { @@ -185,15 +185,15 @@ public class OracleCreateProcedureTest4 extends OracleTest { System.out.println("relationships : " + visitor.getRelationships()); System.out.println("orderBy : " + visitor.getOrderByColumns()); - Assert.assertEquals(5, visitor.getTables().size()); + assertEquals(5, visitor.getTables().size()); - Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("fact_brand_provider"))); + assertTrue(visitor.getTables().containsKey(new TableStat.Name("fact_brand_provider"))); - Assert.assertEquals(32, visitor.getColumns().size()); - Assert.assertEquals(7, visitor.getConditions().size()); - Assert.assertEquals(5, visitor.getRelationships().size()); + assertEquals(22, visitor.getColumns().size()); + assertEquals(6, visitor.getConditions().size()); + assertEquals(4, visitor.getRelationships().size()); - Assert.assertTrue(visitor.containsColumn("fact_brand_provider", "gyscode")); - Assert.assertTrue(visitor.containsColumn("fact_brand_provider", "gysname")); + assertTrue(visitor.containsColumn("fact_brand_provider", "gyscode")); + assertTrue(visitor.containsColumn("fact_brand_provider", "gysname")); } } diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest13.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest13.java new file mode 100644 index 0000000000..41e2a0fd21 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/create/OracleCreateViewTest13.java @@ -0,0 +1,78 @@ +/* + * 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.bvt.sql.oracle.create; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.stat.TableStat; +import com.alibaba.druid.util.JdbcConstants; + +import java.util.List; + +public class OracleCreateViewTest13 extends OracleTest { + + public void test_types() throws Exception { + String sql = // + "SELECT rbi.rma_id, rbi.last_update_time\n" + + "FROM ktv_epm.ktv_eq_rprboarditem rbi\n" + + "JOIN ktv_epm.ktv_eq_rma_header rma ON rma.rma_id = rbi.rma_id \n" + + "\tJOIN ktv_epm.ktv_eq_rprsenditem rsi ON rsi.e_rprboardid = rbi.e_rprboardid\n" + + "AND rsi.e_boardid = rbi.e_boardid \n" + + "WHERE rbi.rma_id > ?\n" + + "\tAND rsi.e_rprsendid = ?\n" + + "\tAND rsi.e_boardid IN (?)\n" + + "FOR UPDATE(rbi.rma_id)\n" + ; + + System.out.println(sql); + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + assertEquals(1, statementList.size()); + + assertEquals("SELECT rbi.rma_id, rbi.last_update_time\n" + + "FROM ktv_epm.ktv_eq_rprboarditem rbi\n" + + "JOIN ktv_epm.ktv_eq_rma_header rma ON rma.rma_id = rbi.rma_id \n" + + "\tJOIN ktv_epm.ktv_eq_rprsenditem rsi ON rsi.e_rprboardid = rbi.e_rprboardid\n" + + "AND rsi.e_boardid = rbi.e_boardid \n" + + "WHERE rbi.rma_id > ?\n" + + "\tAND rsi.e_rprsendid = ?\n" + + "\tAND rsi.e_boardid IN (?)\n" + + "FOR UPDATE(rbi.rma_id)",// + SQLUtils.toSQLString(stmt, JdbcConstants.ORACLE)); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + assertEquals(3, visitor.getTables().size()); + + assertEquals(8, visitor.getColumns().size()); + + assertTrue(visitor.getColumns().contains(new TableStat.Column("ktv_epm.ktv_eq_rma_header", "rma_id"))); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/pl/Oracle_pl_3.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/pl/Oracle_pl_3.java deleted file mode 100644 index 2272858d9b..0000000000 --- a/src/test/java/com/alibaba/druid/bvt/sql/oracle/pl/Oracle_pl_3.java +++ /dev/null @@ -1,139 +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.bvt.sql.oracle.pl; - -import com.alibaba.druid.sql.OracleTest; -import com.alibaba.druid.sql.SQLUtils; -import com.alibaba.druid.sql.ast.SQLStatement; -import com.alibaba.druid.sql.visitor.SchemaStatVisitor; -import com.alibaba.druid.util.JdbcConstants; - -import java.util.List; - -public class Oracle_pl_3 extends OracleTest { - - public void test_0() throws Exception { - String sql = "FUNCTION F_PINYIN(P_NAME IN VARCHAR2) RETURN VARCHAR2 AS\n" + - " V_COMPARE VARCHAR2(100);\n" + - " V_RETURN VARCHAR2(4000);\n" + - " FUNCTION F_NLSSORT(P_WORD IN VARCHAR2) RETURN VARCHAR2 AS\n" + - " BEGIN\n" + - " RETURN NLSSORT(P_WORD, 'NLS_SORT=SCHINESE_PINYIN_M');\n" + - " END;\n" + - " BEGIN\n" + - " FOR I IN 1..NVL(LENGTH(P_NAME), 0) LOOP\n" + - " V_COMPARE := F_NLSSORT(SUBSTR(P_NAME, I, 1));\n" + - " IF V_COMPARE >= F_NLSSORT('?') AND V_COMPARE <= F_NLSSORT('?') THEN\n" + - " V_RETURN := V_RETURN || 'A';\n" + - " ELSIF V_COMPARE >= F_NLSSORT('?') AND V_COMPARE <= F_NLSSORT('?') THEN\n" + - " V_RETURN := V_RETURN || 'B';\n" + - " ELSIF V_COMPARE >= F_NLSSORT('?') AND V_COMPARE <= F_NLSSORT('?') THEN\n" + - " V_RETURN := V_RETURN || 'C';\n" + - " ELSIF V_COMPARE >= F_NLSSORT('?') AND V_COMPARE <= F_NLSSORT('?') THEN\n" + - " V_RETURN := V_RETURN || 'D';\n" + - " ELSIF V_COMPARE >= F_NLSSORT('?') AND V_COMPARE <= F_NLSSORT('?') THEN\n" + - " V_RETURN := V_RETURN || 'E';\n" + - " ELSIF V_COMPARE >= F_NLSSORT('?') AND V_COMPARE <= F_NLSSORT('?') THEN\n" + - " V_RETURN := V_RETURN || 'F';\n" + - " ELSIF V_COMPARE >= F_NLSSORT('?') AND V_COMPARE <= F_NLSSORT('?') THEN\n" + - " V_RETURN := V_RETURN || 'G';\n" + - " ELSIF V_COMPARE >= F_NLSSORT('?') AND V_COMPARE <= F_NLSSORT('?') THEN\n" + - " V_RETURN := V_RETURN || 'H';\n" + - " ELSIF V_COMPARE >= F_NLSSORT('?') AND V_COMPARE <= F_NLSSORT('?') THEN\n" + - " V_RETURN := V_RETURN || 'J';\n" + - " ELSIF V_COMPARE >= F_NLSSORT('?') AND V_COMPARE <= F_NLSSORT('?') THEN\n" + - " V_RETURN := V_RETURN || 'K';\n" + - " ELSIF V_COMPARE >= F_NLSSORT('?') AND V_COMPARE <= F_NLSSORT('?') THEN\n" + - " V_RETURN := V_RETURN || 'L';\n" + - " ELSIF V_COMPARE >= F_NLSSORT('?') AND V_COMPARE <= F_NLSSORT('?') THEN\n" + - " V_RETURN := V_RETURN || 'M';\n" + - " ELSIF V_COMPARE >= F_NLSSORT('?') AND V_COMPARE <= F_NLSSORT('?') THEN\n" + - " V_RETURN := V_RETURN || 'N';\n" + - " ELSIF V_COMPARE >= F_NLSSORT('?') AND V_COMPARE <= F_NLSSORT('?') THEN\n" + - " V_RETURN := V_RETURN || 'O';\n" + - " ELSIF V_COMPARE >= F_NLSSORT('?') AND V_COMPARE <= F_NLSSORT('?') THEN\n" + - " V_RETURN := V_RETURN || 'P';\n" + - " ELSIF V_COMPARE >= F_NLSSORT('?') AND V_COMPARE <= F_NLSSORT('?') THEN\n" + - " V_RETURN := V_RETURN || 'Q';\n" + - " ELSIF V_COMPARE >= F_NLSSORT('?') AND V_COMPARE <= F_NLSSORT('?') THEN\n" + - " V_RETURN := V_RETURN || 'R';\n" + - " ELSIF V_COMPARE >= F_NLSSORT('?') AND V_COMPARE <= F_NLSSORT('?') THEN\n" + - " V_RETURN := V_RETURN || 'S';\n" + - " ELSIF V_COMPARE >= F_NLSSORT('?') AND V_COMPARE <= F_NLSSORT('?') THEN\n" + - " V_RETURN := V_RETURN || 'T';\n" + - " ELSIF V_COMPARE >= F_NLSSORT('?') AND V_COMPARE <= F_NLSSORT('?') THEN\n" + - " V_RETURN := V_RETURN || 'W';\n" + - " ELSIF V_COMPARE >= F_NLSSORT('?') AND V_COMPARE <= F_NLSSORT('?') THEN\n" + - " V_RETURN := V_RETURN || 'X';\n" + - " ELSIF V_COMPARE >= F_NLSSORT('?') AND V_COMPARE <= F_NLSSORT('?') THEN\n" + - " V_RETURN := V_RETURN || 'Y';\n" + - " ELSIF V_COMPARE >= F_NLSSORT('?') AND V_COMPARE <= F_NLSSORT('?') THEN\n" + - " V_RETURN := V_RETURN || 'Z';\n" + - " END IF;\n" + - " END LOOP;\n" + - " RETURN V_RETURN;\n"; // - - List statementList = SQLUtils.parseStatements(sql, JdbcConstants.ORACLE); - SQLStatement stmt = statementList.get(0); - - assertEquals(1, statementList.size()); - - SchemaStatVisitor visitor = SQLUtils.createSchemaStatVisitor(JdbcConstants.ORACLE); - for (SQLStatement statement : statementList) { - statement.accept(visitor); - } - -// System.out.println("Tables : " + visitor.getTables()); -// System.out.println("fields : " + visitor.getColumns()); -// System.out.println("coditions : " + visitor.getConditions()); -// System.out.println("relationships : " + visitor.getRelationships()); -// System.out.println("orderBy : " + visitor.getOrderByColumns()); - - assertEquals(0, visitor.getTables().size()); - -// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("employees"))); -// Assert.assertTrue(visitor.getTables().containsKey(new TableStat.Name("emp_name"))); - -// Assert.assertEquals(7, visitor.getColumns().size()); -// Assert.assertEquals(3, visitor.getConditions().size()); -// Assert.assertEquals(1, visitor.getRelationships().size()); - - // Assert.assertTrue(visitor.getColumns().contains(new TableStat.Column("employees", "salary"))); - - { - String output = SQLUtils.toOracleString(stmt); - assertEquals("CREATE OR REPLACE PROCEDURE reassign (\n" + - "\tp IN OUT NOCOPY hr.person_typ, \n" + - "\tnew_job VARCHAR2\n" + - ")\n" + - "BEGIN\n" + - "\tp.change_job(new_job);\n" + - "END;", // - output); - } - { - String output = SQLUtils.toOracleString(stmt, SQLUtils.DEFAULT_LCASE_FORMAT_OPTION); - assertEquals("create or replace procedure reassign (\n" + - "\tp in out nocopy hr.person_typ, \n" + - "\tnew_job VARCHAR2\n" + - ")\n" + - "begin\n" + - "\tp.change_job(new_job);\n" + - "end;", // - output); - } - } -} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest84_as.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest84_as.java new file mode 100644 index 0000000000..7291264950 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest84_as.java @@ -0,0 +1,74 @@ +/* + * 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.bvt.sql.oracle.select; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import org.junit.Assert; + +import java.util.List; + +public class OracleSelectTest84_as extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "select a as, b, c from t"; // + + System.out.println(sql); + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + { + String text = SQLUtils.toOracleString(stmt); + + assertEquals("SELECT a, b, c\n" + + "FROM t", text); + } + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + assertEquals(1, visitor.getTables().size()); + assertEquals(3, visitor.getColumns().size()); + assertEquals(0, visitor.getConditions().size()); + assertEquals(0, visitor.getRelationships().size()); + assertEquals(0, visitor.getOrderByColumns().size()); + +// Assert.assertTrue(visitor.containsTable("sup_registration")); +// Assert.assertTrue(visitor.containsTable("sup_task")); +// Assert.assertTrue(visitor.containsTable("sys_org")); +// +// Assert.assertTrue(visitor.containsColumn("sup_task", "orgid")); +// Assert.assertTrue(visitor.containsColumn("sup_task", "orgid")); +// + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest85_in.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest85_in.java new file mode 100644 index 0000000000..8efcc70655 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest85_in.java @@ -0,0 +1,75 @@ +/* + * 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.bvt.sql.oracle.select; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import org.junit.Assert; + +import java.util.List; + +public class OracleSelectTest85_in extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "select * from t where id not in 3"; // + + System.out.println(sql); + + OracleStatementParser parser = new OracleStatementParser(sql); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + { + String text = SQLUtils.toOracleString(stmt); + + assertEquals("SELECT *\n" + + "FROM t\n" + + "WHERE id NOT IN (3)", text); + } + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + assertEquals(1, visitor.getTables().size()); + assertEquals(2, visitor.getColumns().size()); + assertEquals(1, visitor.getConditions().size()); + assertEquals(0, visitor.getRelationships().size()); + assertEquals(0, visitor.getOrderByColumns().size()); + +// Assert.assertTrue(visitor.containsTable("sup_registration")); +// Assert.assertTrue(visitor.containsTable("sup_task")); +// Assert.assertTrue(visitor.containsTable("sys_org")); +// +// Assert.assertTrue(visitor.containsColumn("sup_task", "orgid")); +// Assert.assertTrue(visitor.containsColumn("sup_task", "orgid")); +// + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest86_comment.java b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest86_comment.java new file mode 100644 index 0000000000..637cdb62fb --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/oracle/select/OracleSelectTest86_comment.java @@ -0,0 +1,86 @@ +/* + * 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.bvt.sql.oracle.select; + +import com.alibaba.druid.sql.OracleTest; +import com.alibaba.druid.sql.SQLUtils; +import com.alibaba.druid.sql.ast.SQLStatement; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleLexer; +import com.alibaba.druid.sql.dialect.oracle.parser.OracleStatementParser; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleSchemaStatVisitor; +import com.alibaba.druid.sql.parser.SQLParserFeature; +import org.junit.Assert; + +import java.util.List; + +public class OracleSelectTest86_comment extends OracleTest { + + public void test_0() throws Exception { + String sql = // + "/*sqlId=9f0szhacj63ag*/SELECT /*+rule*/ SYS_XMLGEN(VALUE(KU$), XMLFORMAT.createFormat2('TABLE_T', '7')), KU$.OBJ_NUM FROM SYS.KU$_HTABLE_VIEW KU$ WHERE NOT (BITAND (KU$.PROPERTY,8192)=8192) AND NOT BITAND(KU$.SCHEMA_OBJ.FLAGS,128)!=0 AND KU$.SCHEMA_OBJ.NAME=:NAME1 AND KU$.SCHEMA_OBJ.OWNER_NAME=:SCHEMA2"; // + + System.out.println(sql); + + OracleLexer lexer = new OracleLexer(sql); + lexer.config(SQLParserFeature.SkipComments, false); + lexer.nextToken(); + String comment = lexer.stringVal(); + assertEquals("/*sqlId=9f0szhacj63ag*/", comment); + + OracleStatementParser parser = new OracleStatementParser(sql, SQLParserFeature.KeepComments); + List statementList = parser.parseStatementList(); + SQLStatement stmt = statementList.get(0); + print(statementList); + + Assert.assertEquals(1, statementList.size()); + + OracleSchemaStatVisitor visitor = new OracleSchemaStatVisitor(); + stmt.accept(visitor); + + { + String text = SQLUtils.toOracleString(stmt); + + assertEquals("/*sqlId=9f0szhacj63ag*/\n" + + "SELECT /*+rule*/ SYS_XMLGEN(VALUE(KU$), XMLFORMAT.createFormat2('TABLE_T', '7'))\n" + + "\t, KU$.OBJ_NUM\n" + + "FROM SYS.KU$_HTABLE_VIEW KU$\n" + + "WHERE NOT BITAND(KU$.PROPERTY, 8192) = 8192\n" + + "\tAND NOT BITAND(KU$.SCHEMA_OBJ.FLAGS, 128) != 0\n" + + "\tAND KU$.SCHEMA_OBJ.NAME = :NAME1\n" + + "\tAND KU$.SCHEMA_OBJ.OWNER_NAME = :SCHEMA2", text); + } + + System.out.println("Tables : " + visitor.getTables()); + System.out.println("fields : " + visitor.getColumns()); + System.out.println("coditions : " + visitor.getConditions()); + System.out.println("relationships : " + visitor.getRelationships()); + System.out.println("orderBy : " + visitor.getOrderByColumns()); + + assertEquals(1, visitor.getTables().size()); + assertEquals(6, visitor.getColumns().size()); + assertEquals(2, visitor.getConditions().size()); + assertEquals(0, visitor.getRelationships().size()); + assertEquals(0, visitor.getOrderByColumns().size()); + +// Assert.assertTrue(visitor.containsTable("sup_registration")); +// Assert.assertTrue(visitor.containsTable("sup_task")); +// Assert.assertTrue(visitor.containsTable("sys_org")); +// +// Assert.assertTrue(visitor.containsColumn("sup_task", "orgid")); +// Assert.assertTrue(visitor.containsColumn("sup_task", "orgid")); +// + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/repository/OraclePKNameResolveTest.java b/src/test/java/com/alibaba/druid/bvt/sql/repository/OraclePKNameResolveTest.java new file mode 100644 index 0000000000..203436dee5 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/sql/repository/OraclePKNameResolveTest.java @@ -0,0 +1,33 @@ +package com.alibaba.druid.bvt.sql.repository; + +import com.alibaba.druid.sql.dialect.oracle.ast.stmt.OracleCreateTableStatement; +import com.alibaba.druid.sql.parser.SQLParserUtils; +import com.alibaba.druid.sql.repository.SchemaRepository; +import com.alibaba.druid.util.JdbcConstants; +import junit.framework.TestCase; + +/** + * Created by wenshao on 03/08/2017. + */ +public class OraclePKNameResolveTest extends TestCase { + protected SchemaRepository repository = new SchemaRepository(JdbcConstants.ORACLE); + + public void test_for_issue() throws Exception { + String sql_1 = "create table a(\n" + + " WORKITEMID VARCHAR(40) NOT NULL,\n" + + "CONSTRAINT PRIMARY_WORKTASK PRIMARY KEY (WORKITEMID)\n" + + ")"; + String sql_2 = "create table b(\n" + + " WORKITEMID VARCHAR(40) NOT NULL,\n" + + "CONSTRAINT PRIMARY_WORKTASK PRIMARY KEY (WORKITEMID)\n" + + ")" + ; + + repository.resolve(sql_1); + + OracleCreateTableStatement stmt = (OracleCreateTableStatement) SQLParserUtils.createSQLStatementParser(sql_2, JdbcConstants.ORACLE).parseStatement(); + + repository.resolve(stmt); + System.out.println(stmt); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/sql/transform/datatype/oracle2pg/Oracle2MySql_method_sys_guid.java b/src/test/java/com/alibaba/druid/bvt/sql/transform/datatype/oracle2pg/Oracle2MySql_method_sys_guid.java index a9f8bf1469..2c71e4733a 100644 --- a/src/test/java/com/alibaba/druid/bvt/sql/transform/datatype/oracle2pg/Oracle2MySql_method_sys_guid.java +++ b/src/test/java/com/alibaba/druid/bvt/sql/transform/datatype/oracle2pg/Oracle2MySql_method_sys_guid.java @@ -15,4 +15,18 @@ public class Oracle2MySql_method_sys_guid extends TestCase { SQLExpr targetExpr = SQLTransformUtils.transformOracleToPostgresql(expr); assertEquals("uuid_generate_v4()", targetExpr.toString()); } + + public void test_oracle2pg_sessionid() throws Exception { + String sql = "USERENV('SESSIONID')"; + SQLMethodInvokeExpr expr = (SQLMethodInvokeExpr) SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).expr(); + SQLExpr targetExpr = SQLTransformUtils.transformOracleToPostgresql(expr); + assertEquals("get_session_id()", targetExpr.toString()); + } + + public void test_oracle2pg_numtodsinterval() throws Exception { + String sql = "numtodsinterval(1, 'day')"; + SQLMethodInvokeExpr expr = (SQLMethodInvokeExpr) SQLParserUtils.createExprParser(sql, JdbcConstants.ORACLE).expr(); + SQLExpr targetExpr = SQLTransformUtils.transformOracleToPostgresql(expr); + assertEquals("INTERVAL '1 DAYS'", targetExpr.toString()); + } }