From fd799afd04905a9c3d94ab3e02316fd0aae2d2cb Mon Sep 17 00:00:00 2001 From: wenshao Date: Wed, 18 Dec 2024 11:33:39 +0800 Subject: [PATCH] refactor --- .../SQLExecuteImmediateStatement.java | 24 ++++++++ .../ast/statement/SQLUnnestTableSource.java | 4 ++ .../BigQueryExecuteImmediateStatement.java | 16 +++++ .../dialect/oracle/ast/OracleSQLObject.java | 2 +- .../stmt/OracleExecuteImmediateStatement.java | 60 +++++++------------ .../oracle/parser/OracleStatementParser.java | 1 + .../druid/sql/visitor/SQLASTVisitor.java | 35 +++++++---- 7 files changed, 89 insertions(+), 53 deletions(-) diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExecuteImmediateStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExecuteImmediateStatement.java index be87a61050..6f36a9a9d5 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExecuteImmediateStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLExecuteImmediateStatement.java @@ -2,6 +2,7 @@ import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLStatementImpl; +import com.alibaba.druid.sql.ast.expr.SQLCharExpr; import com.alibaba.druid.sql.visitor.SQLASTVisitor; import java.util.ArrayList; @@ -23,6 +24,10 @@ public void setDynamicSql(SQLExpr x) { this.dynamicSql = x; } + public void setDynamicSql(String dynamicSql) { + this.setDynamicSql(new SQLCharExpr(dynamicSql)); + } + public List getInto() { return into; } @@ -31,4 +36,23 @@ protected void acceptChild(SQLASTVisitor v) { acceptChild(v, dynamicSql); acceptChild(v, into); } + + protected void cloneTo(SQLExecuteImmediateStatement x) { + super.cloneTo(x); + if (dynamicSql != null) { + x.setDynamicSql(dynamicSql.clone()); + } + for (SQLExpr e : into) { + SQLExpr e2 = e.clone(); + e2.setParent(x); + x.into.add(e2); + } + } + + protected void accept0(SQLASTVisitor v) { + if (v.visit(this)) { + acceptChild(v); + } + v.endVisit(this); + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUnnestTableSource.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUnnestTableSource.java index 1c3fae8698..ab0063d58b 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUnnestTableSource.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLUnnestTableSource.java @@ -54,6 +54,10 @@ public void addItem(SQLExpr item) { this.items.add(item); } + public void setItem(int i, SQLExpr item) { + this.items.set(i, item); + } + public SQLExpr getOffset() { return offset; } diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/bigquery/ast/BigQueryExecuteImmediateStatement.java b/core/src/main/java/com/alibaba/druid/sql/dialect/bigquery/ast/BigQueryExecuteImmediateStatement.java index 5f20f493e8..c4ffc3354e 100644 --- a/core/src/main/java/com/alibaba/druid/sql/dialect/bigquery/ast/BigQueryExecuteImmediateStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/bigquery/ast/BigQueryExecuteImmediateStatement.java @@ -46,4 +46,20 @@ protected void acceptChild(SQLASTVisitor v) { super.acceptChild(v); acceptChild(v, using); } + + protected BigQueryExecuteImmediateStatement cloneTo(BigQueryExecuteImmediateStatement x) { + super.cloneTo(x); + for (SQLAliasedExpr item : using) { + SQLAliasedExpr item2 = item.clone(); + item2.setParent(x); + x.using.add(item2); + } + return x; + } + + public BigQueryExecuteImmediateStatement clone() { + BigQueryExecuteImmediateStatement x = new BigQueryExecuteImmediateStatement(); + cloneTo(x); + return x; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/OracleSQLObject.java b/core/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/OracleSQLObject.java index 0cd40d21aa..a5e76491c1 100644 --- a/core/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/OracleSQLObject.java +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/OracleSQLObject.java @@ -19,5 +19,5 @@ import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; public interface OracleSQLObject extends SQLObject { - void accept0(OracleASTVisitor visitor); + void accept0(OracleASTVisitor v); } diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleExecuteImmediateStatement.java b/core/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleExecuteImmediateStatement.java index 761e491ba9..b8c53a4975 100644 --- a/core/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleExecuteImmediateStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/oracle/ast/stmt/OracleExecuteImmediateStatement.java @@ -17,19 +17,16 @@ import com.alibaba.druid.sql.ast.SQLArgument; import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.expr.SQLCharExpr; +import com.alibaba.druid.sql.ast.statement.SQLExecuteImmediateStatement; import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; import java.util.ArrayList; import java.util.List; -public class OracleExecuteImmediateStatement extends OracleStatementImpl { - private SQLExpr dynamicSql; - +public class OracleExecuteImmediateStatement extends SQLExecuteImmediateStatement implements OracleStatement { private final List arguments = new ArrayList(); - private final List into = new ArrayList(); - private final List returnInto = new ArrayList(); public OracleExecuteImmediateStatement() { @@ -40,19 +37,24 @@ public OracleExecuteImmediateStatement(String dynamicSql) { } @Override - public void accept0(OracleASTVisitor visitor) { - if (visitor.visit(this)) { -// acceptChild(visitor, label); + public void accept0(SQLASTVisitor v) { + if (v instanceof OracleASTVisitor) { + accept0((OracleASTVisitor) v); + return; } - visitor.endVisit(this); + super.accept0(v); } - public OracleExecuteImmediateStatement clone() { - OracleExecuteImmediateStatement x = new OracleExecuteImmediateStatement(); - - if (dynamicSql != null) { - x.setDynamicSql(dynamicSql.clone()); + @Override + public void accept0(OracleASTVisitor v) { + if (v.visit(this)) { + acceptChild(v); } + v.endVisit(this); + } + + protected OracleExecuteImmediateStatement cloneTo(OracleExecuteImmediateStatement x) { + super.cloneTo(x); for (SQLArgument arg : arguments) { SQLArgument a2 = arg.clone(); @@ -60,44 +62,24 @@ public OracleExecuteImmediateStatement clone() { x.arguments.add(a2); } - for (SQLExpr e : into) { - SQLExpr e2 = e.clone(); - e2.setParent(x); - x.into.add(e2); - } - for (SQLExpr e : returnInto) { SQLExpr e2 = e.clone(); e2.setParent(x); x.returnInto.add(e2); } - return x; } - public SQLExpr getDynamicSql() { - return dynamicSql; - } - - public void setDynamicSql(SQLExpr dynamicSql) { - if (dynamicSql != null) { - dynamicSql.setParent(this); - } - this.dynamicSql = dynamicSql; - } - - public void setDynamicSql(String dynamicSql) { - this.setDynamicSql(new SQLCharExpr(dynamicSql)); + public OracleExecuteImmediateStatement clone() { + OracleExecuteImmediateStatement x = new OracleExecuteImmediateStatement(); + cloneTo(x); + return x; } public List getArguments() { return arguments; } - public List getInto() { - return into; - } - public List getReturnInto() { return returnInto; } diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java b/core/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java index 6b64655316..d3d65e78b3 100644 --- a/core/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/oracle/parser/OracleStatementParser.java @@ -854,6 +854,7 @@ public SQLStatement parsePipeRow() { return stmt; } + @Override public SQLStatement parseExecute() { acceptIdentifier("EXECUTE"); diff --git a/core/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java b/core/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java index d04fab5e5a..97336fce35 100644 --- a/core/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java +++ b/core/src/main/java/com/alibaba/druid/sql/visitor/SQLASTVisitor.java @@ -20,11 +20,16 @@ import com.alibaba.druid.sql.ast.*; import com.alibaba.druid.sql.ast.expr.*; import com.alibaba.druid.sql.ast.statement.*; +import com.alibaba.druid.sql.dialect.bigquery.visitor.BigQueryVisitor; import com.alibaba.druid.sql.dialect.hive.ast.HiveInputOutputFormat; import com.alibaba.druid.sql.dialect.mysql.ast.statement.MySqlKillStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.SQLAlterResourceGroupStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.SQLCreateResourceGroupStatement; import com.alibaba.druid.sql.dialect.mysql.ast.statement.SQLListResourceGroupStatement; +import com.alibaba.druid.sql.dialect.mysql.visitor.MySqlASTVisitor; +import com.alibaba.druid.sql.dialect.odps.visitor.OdpsASTVisitor; +import com.alibaba.druid.sql.dialect.oracle.visitor.OracleASTVisitor; +import com.alibaba.druid.sql.dialect.postgresql.visitor.PGASTVisitor; import com.alibaba.druid.sql.dialect.starrocks.ast.StarRocksIndexDefinition; import com.alibaba.druid.sql.dialect.starrocks.ast.statement.StarRocksCreateResourceStatement; import com.alibaba.druid.sql.template.SQLSelectQueryTemplate; @@ -2707,22 +2712,25 @@ default boolean visit(SQLLeaveStatement x) { default void endVisit(SQLLeaveStatement x) {} - static SQLASTVisitor ofMethodInvoke(Consumer p) { - return new SQLASTVisitor() { - public boolean visit(SQLMethodInvokeExpr x) { - p.accept(x); - return true; - } + default boolean visit(SQLExecuteImmediateStatement x) { + return true; + } - public boolean visit(SQLAggregateExpr x) { - p.accept(x); - return true; - } - }; + default void endVisit(SQLExecuteImmediateStatement x) {} + + static SQLASTVisitor ofMethodInvoke(Consumer p) { + return ofMethodInvoke(null, p); } static SQLASTVisitor ofMethodInvoke(Predicate filter, Consumer p) { - return new SQLASTVisitor() { + class MethodInvokeVisitor implements SQLASTVisitor, BigQueryVisitor, OdpsASTVisitor, OracleASTVisitor, MySqlASTVisitor, PGASTVisitor { + final Predicate filter; + final Consumer p; + public MethodInvokeVisitor(Predicate filter, Consumer p) { + this.filter = filter; + this.p = p; + } + public boolean visit(SQLMethodInvokeExpr x) { if (filter == null || filter.test(x.getMethodName())) { p.accept(x); @@ -2736,7 +2744,8 @@ public boolean visit(SQLAggregateExpr x) { } return true; } - }; + } + return new MethodInvokeVisitor(filter, p); } static SQLASTVisitor ofAggregate(Consumer p) {