From 90c8b7a1f78deca9014ec4c973810cc6350fecf7 Mon Sep 17 00:00:00 2001 From: "shaojin.wensj" Date: Fri, 4 Nov 2022 09:05:13 +0800 Subject: [PATCH] improved sql parser --- .../druid/sql/ast/expr/SQLAllColumnExpr.java | 23 +++++ .../statement/SQLAlterFunctionStatement.java | 7 +- .../ast/statement/SQLAlterIndexStatement.java | 5 ++ .../SQLAlterMaterializedViewStatement.java | 5 ++ .../statement/SQLAlterProcedureStatement.java | 5 ++ .../statement/SQLAlterSequenceStatement.java | 5 ++ .../sql/ast/statement/SQLAlterStatement.java | 7 +- .../ast/statement/SQLAlterTableArchive.java | 38 ++++++++ .../ast/statement/SQLAlterTableStatement.java | 5 ++ .../ast/statement/SQLAlterViewStatement.java | 5 ++ .../statement/SQLCreateDatabaseStatement.java | 5 +- .../statement/SQLCreateIndexStatement.java | 5 ++ .../ast/statement/SQLCreateRoleStatement.java | 4 + .../statement/SQLCreateSequenceStatement.java | 5 ++ .../sql/ast/statement/SQLCreateStatement.java | 5 ++ .../statement/SQLCreateTableStatement.java | 4 + .../statement/SQLCreateTriggerStatement.java | 5 ++ .../ast/statement/SQLCreateUserStatement.java | 7 +- .../ast/statement/SQLCreateViewStatement.java | 4 + .../sql/ast/statement/SQLDDLStatement.java | 21 +++++ .../statement/SQLDropCatalogStatement.java | 13 ++- .../statement/SQLDropDatabaseStatement.java | 5 ++ .../ast/statement/SQLDropEventStatement.java | 8 +- .../ast/statement/SQLDropIndexStatement.java | 5 ++ .../SQLDropLogFileGroupStatement.java | 7 +- .../SQLDropMaterializedViewStatement.java | 8 +- .../SQLDropOfflineModelStatement.java | 90 +++++++++++++++++++ .../statement/SQLDropOutlineStatement.java | 8 +- .../statement/SQLDropProcedureStatement.java | 4 + .../SQLDropResourceGroupStatement.java | 8 +- .../statement/SQLDropResourceStatement.java | 8 +- .../ast/statement/SQLDropRoleStatement.java | 5 ++ .../statement/SQLDropSequenceStatement.java | 5 ++ .../ast/statement/SQLDropServerStatement.java | 6 +- .../sql/ast/statement/SQLDropStatement.java | 5 ++ .../statement/SQLDropTableGroupStatement.java | 4 + .../statement/SQLDropTableSpaceStatement.java | 5 ++ .../ast/statement/SQLDropTableStatement.java | 13 +++ .../statement/SQLDropTriggerStatement.java | 5 ++ .../ast/statement/SQLDropTypeStatement.java | 11 ++- .../ast/statement/SQLDropUserStatement.java | 5 ++ .../ast/statement/SQLDropViewStatement.java | 5 ++ .../sql/dialect/odps/ast/OdpsCopyStmt.java | 41 +++++++++ .../sql/dialect/odps/ast/OdpsPAIStmt.java | 41 +++++++++ .../odps/parser/OdpsCreateTableParser.java | 1 + .../odps/parser/OdpsStatementParser.java | 61 +++++++++++++ .../dialect/odps/visitor/OdpsASTVisitor.java | 14 +++ .../odps/visitor/OdpsOutputVisitor.java | 12 +++ .../com/alibaba/druid/sql/parser/Lexer.java | 46 ++++++++-- .../druid/sql/parser/SQLExprParser.java | 33 ++++++- .../druid/sql/parser/SQLParserUtils.java | 32 ++++++- .../druid/sql/parser/SQLStatementParser.java | 44 +++++++-- .../sql/visitor/SQLASTOutputVisitor.java | 39 ++++++++ .../druid/sql/visitor/SQLASTVisitor.java | 14 +++ 54 files changed, 714 insertions(+), 67 deletions(-) create mode 100644 core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableArchive.java create mode 100644 core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropOfflineModelStatement.java create mode 100644 core/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsCopyStmt.java create mode 100644 core/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsPAIStmt.java diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAllColumnExpr.java b/core/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAllColumnExpr.java index d3eec5f24f..6ce78be519 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAllColumnExpr.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/expr/SQLAllColumnExpr.java @@ -16,6 +16,7 @@ package com.alibaba.druid.sql.ast.expr; import com.alibaba.druid.FastsqlException; +import com.alibaba.druid.sql.ast.SQLExpr; import com.alibaba.druid.sql.ast.SQLExprImpl; import com.alibaba.druid.sql.ast.statement.SQLTableSource; import com.alibaba.druid.sql.visitor.SQLASTVisitor; @@ -27,6 +28,9 @@ import java.util.List; public final class SQLAllColumnExpr extends SQLExprImpl { private transient SQLTableSource resolvedTableSource; + private SQLExpr owner; + private List except; + public SQLAllColumnExpr() { } @@ -38,6 +42,25 @@ public final class SQLAllColumnExpr extends SQLExprImpl { } } + public SQLExpr getOwner() { + return owner; + } + + public void setOwner(SQLExpr x) { + if (x != null) { + x.setParent(this); + } + this.owner = x; + } + + public List getExcept() { + return except; + } + + public void setExcept(List except) { + this.except = except; + } + protected void accept0(SQLASTVisitor visitor) { visitor.visit(this); visitor.endVisit(this); diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterFunctionStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterFunctionStatement.java index f855c5c949..333fb79e29 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterFunctionStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterFunctionStatement.java @@ -20,7 +20,7 @@ import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; -public class SQLAlterFunctionStatement extends SQLStatementImpl { +public class SQLAlterFunctionStatement extends SQLStatementImpl implements SQLAlterStatement { private SQLName name; private boolean debug; @@ -105,4 +105,9 @@ public class SQLAlterFunctionStatement extends SQLStatementImpl { } visitor.endVisit(this); } + + @Override + public DDLObjectType getDDLObjectType() { + return DDLObjectType.FUNCTION; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterIndexStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterIndexStatement.java index 46de2071cb..5b9d63ce7b 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterIndexStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterIndexStatement.java @@ -161,4 +161,9 @@ public class SQLAlterIndexStatement extends SQLStatementImpl implements SQLAlter } this.dbPartitionBy = x; } + + @Override + public DDLObjectType getDDLObjectType() { + return DDLObjectType.INDEX; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterMaterializedViewStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterMaterializedViewStatement.java index 3efc06075b..21142ac59a 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterMaterializedViewStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterMaterializedViewStatement.java @@ -175,4 +175,9 @@ public class SQLAlterMaterializedViewStatement extends SQLStatementImpl implemen } visitor.endVisit(this); } + + @Override + public DDLObjectType getDDLObjectType() { + return DDLObjectType.MATERIALIZED_VIEW; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterProcedureStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterProcedureStatement.java index aa0d656c7a..b4c381beb7 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterProcedureStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterProcedureStatement.java @@ -98,4 +98,9 @@ public class SQLAlterProcedureStatement extends SQLStatementImpl implements SQLA } this.comment = comment; } + + @Override + public DDLObjectType getDDLObjectType() { + return DDLObjectType.PROCEDURE; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterSequenceStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterSequenceStatement.java index 24830e784c..884f31ed44 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterSequenceStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterSequenceStatement.java @@ -224,4 +224,9 @@ public class SQLAlterSequenceStatement extends SQLStatementImpl implements SQLAl } this.restartWith = x; } + + @Override + public DDLObjectType getDDLObjectType() { + return DDLObjectType.SEQUENCE; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterStatement.java index 9b73106993..cf3438d3e0 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterStatement.java @@ -15,7 +15,8 @@ */ package com.alibaba.druid.sql.ast.statement; -import com.alibaba.druid.sql.ast.SQLStatement; - -public interface SQLAlterStatement extends SQLStatement { +public interface SQLAlterStatement extends SQLDDLStatement { + default DDLObjectType getDDLObjectType() { + return DDLObjectType.OTHER; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableArchive.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableArchive.java new file mode 100644 index 0000000000..8ddfc20c39 --- /dev/null +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableArchive.java @@ -0,0 +1,38 @@ +/* + * 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.ast.statement; + +import com.alibaba.druid.sql.ast.SQLObjectImpl; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +import java.util.ArrayList; +import java.util.List; + +public class SQLAlterTableArchive extends SQLObjectImpl implements SQLAlterTableItem { + private final List partition = new ArrayList(4); + + public List getPartition() { + return partition; + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, partition); + } + visitor.endVisit(this); + } +} diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableStatement.java index 2da947b7a2..bea10e39e6 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterTableStatement.java @@ -283,4 +283,9 @@ public class SQLAlterTableStatement extends SQLStatementImpl implements SQLDDLSt public void setNotClustered(boolean notClustered) { this.notClustered = notClustered; } + + @Override + public DDLObjectType getDDLObjectType() { + return DDLObjectType.TABLE; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterViewStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterViewStatement.java index 28290a3d26..48cf2fa9c0 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterViewStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLAlterViewStatement.java @@ -278,4 +278,9 @@ public class SQLAlterViewStatement extends SQLStatementImpl implements SQLCreate return x; } + + @Override + public DDLObjectType getDDLObjectType() { + return DDLObjectType.VIEW; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateDatabaseStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateDatabaseStatement.java index 7bcb14d4c2..d6a1ec66fb 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateDatabaseStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateDatabaseStatement.java @@ -269,5 +269,8 @@ public class SQLCreateDatabaseStatement extends SQLStatementImpl implements SQLC this.physical = physical; } - // public static class StoredAs + @Override + public DDLObjectType getDDLObjectType() { + return DDLObjectType.DATABASE; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateIndexStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateIndexStatement.java index b75e1d25f5..7c4282ccdf 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateIndexStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateIndexStatement.java @@ -326,4 +326,9 @@ public class SQLCreateIndexStatement extends SQLStatementImpl implements SQLCrea public void setIfNotExists(boolean ifNotExists) { this.ifNotExists = ifNotExists; } + + @Override + public DDLObjectType getDDLObjectType() { + return DDLObjectType.INDEX; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateRoleStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateRoleStatement.java index d9ece14944..7cc3c62283 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateRoleStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateRoleStatement.java @@ -68,4 +68,8 @@ public class SQLCreateRoleStatement extends SQLStatementImpl implements SQLCreat this.ifNotExists = ifNotExists; } + @Override + public DDLObjectType getDDLObjectType() { + return DDLObjectType.ROLE; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateSequenceStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateSequenceStatement.java index 263da1f758..a45bb4a76b 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateSequenceStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateSequenceStatement.java @@ -257,4 +257,9 @@ public class SQLCreateSequenceStatement extends SQLStatementImpl implements SQLC } this.step = step; } + + @Override + public DDLObjectType getDDLObjectType() { + return DDLObjectType.SEQUENCE; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateStatement.java index 1b7d15b0d6..420279de08 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateStatement.java @@ -15,5 +15,10 @@ */ package com.alibaba.druid.sql.ast.statement; +import com.alibaba.druid.sql.ast.SQLName; + public interface SQLCreateStatement extends SQLDDLStatement { + default SQLName getName() { + return null; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java index 91caa13a38..5625db507e 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTableStatement.java @@ -1566,4 +1566,8 @@ public class SQLCreateTableStatement extends SQLStatementImpl implements SQLDDLS } this.engine = x; } + + public DDLObjectType getDDLObjectType() { + return DDLObjectType.TABLE; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTriggerStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTriggerStatement.java index 3c7e6abe6d..222be23c2b 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTriggerStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateTriggerStatement.java @@ -194,6 +194,11 @@ public class SQLCreateTriggerStatement extends SQLStatementImpl implements SQLCr this.definer = x; } + @Override + public DDLObjectType getDDLObjectType() { + return DDLObjectType.TRIGGER; + } + public static enum TriggerType { BEFORE, AFTER, INSTEAD_OF } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateUserStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateUserStatement.java index 4745a95491..9a2ad2afc6 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateUserStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateUserStatement.java @@ -20,7 +20,7 @@ import com.alibaba.druid.sql.ast.SQLName; import com.alibaba.druid.sql.ast.SQLStatementImpl; import com.alibaba.druid.sql.visitor.SQLASTVisitor; -public class SQLCreateUserStatement extends SQLStatementImpl { +public class SQLCreateUserStatement extends SQLStatementImpl implements SQLCreateStatement { private SQLName user; private SQLExpr password; @@ -60,4 +60,9 @@ public class SQLCreateUserStatement extends SQLStatementImpl { } visitor.endVisit(this); } + + @Override + public DDLObjectType getDDLObjectType() { + return DDLObjectType.USER; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateViewStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateViewStatement.java index 560de1b250..71cac848d3 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateViewStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLCreateViewStatement.java @@ -364,6 +364,10 @@ public class SQLCreateViewStatement extends SQLStatementImpl implements SQLCreat this.script = x; } + public DDLObjectType getDDLObjectType() { + return DDLObjectType.VIEW; + } + public SQLCreateViewStatement clone() { SQLCreateViewStatement x = new SQLCreateViewStatement(); diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDDLStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDDLStatement.java index b5b1b4949f..532d354df5 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDDLStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDDLStatement.java @@ -18,4 +18,25 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.sql.ast.SQLStatement; public interface SQLDDLStatement extends SQLStatement { + default DDLObjectType getDDLObjectType() { + return DDLObjectType.OTHER; + } + + enum DDLObjectType { + DATABASE, + TABLE, + VIEW, + MATERIALIZED_VIEW, + TABLE_SPACE, + TABLE_GROUP, + FUNCTION, + TRIGGER, + USER, + ROLE, + SEQUENCE, + INDEX, + PROCEDURE, + TYPE, + OTHER + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropCatalogStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropCatalogStatement.java index c69157349c..ea9a29eee7 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropCatalogStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropCatalogStatement.java @@ -16,17 +16,14 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.DbType; -import com.alibaba.druid.sql.ast.SQLExpr; -import com.alibaba.druid.sql.ast.SQLObject; -import com.alibaba.druid.sql.ast.SQLReplaceable; -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 SQLDropCatalogStatement extends SQLStatementImpl implements SQLDropStatement, SQLReplaceable { - private SQLExpr name; + private SQLName name; private boolean ifExists; private boolean external; @@ -45,11 +42,11 @@ public class SQLDropCatalogStatement extends SQLStatementImpl implements SQLDrop visitor.endVisit(this); } - public SQLExpr getName() { + public SQLName getName() { return name; } - public void setName(SQLExpr x) { + public void setName(SQLName x) { if (x != null) { x.setParent(this); } @@ -83,7 +80,7 @@ public class SQLDropCatalogStatement extends SQLStatementImpl implements SQLDrop public boolean replace(SQLExpr expr, SQLExpr target) { if (name == expr) { - setName(target); + setName((SQLName) target); return true; } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropDatabaseStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropDatabaseStatement.java index d8e15cc107..f61d41a157 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropDatabaseStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropDatabaseStatement.java @@ -186,4 +186,9 @@ public class SQLDropDatabaseStatement extends SQLStatementImpl implements SQLDro public void setPhysical(boolean physical) { this.physical = physical; } + + @Override + public DDLObjectType getDDLObjectType() { + return DDLObjectType.DATABASE; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropEventStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropEventStatement.java index 4f45bd0ecc..a367cbf1e2 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropEventStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropEventStatement.java @@ -16,7 +16,7 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.DbType; -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; @@ -25,7 +25,7 @@ import java.util.ArrayList; import java.util.List; public class SQLDropEventStatement extends SQLStatementImpl implements SQLDropStatement { - private SQLExpr name; + private SQLName name; private boolean ifExists; public SQLDropEventStatement() { @@ -43,11 +43,11 @@ public class SQLDropEventStatement extends SQLStatementImpl implements SQLDropSt visitor.endVisit(this); } - public SQLExpr getName() { + public SQLName getName() { return name; } - public void setName(SQLExpr x) { + public void setName(SQLName x) { if (x != null) { x.setParent(this); } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropIndexStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropIndexStatement.java index 70118e4fb8..8d6ebef86e 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropIndexStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropIndexStatement.java @@ -128,4 +128,9 @@ public class SQLDropIndexStatement extends SQLStatementImpl implements SQLDropSt public void setIfExists(boolean ifExists) { this.ifExists = ifExists; } + + @Override + public DDLObjectType getDDLObjectType() { + return DDLObjectType.INDEX; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropLogFileGroupStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropLogFileGroupStatement.java index bcb934142c..3e49c00686 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropLogFileGroupStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropLogFileGroupStatement.java @@ -17,6 +17,7 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.DbType; 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; @@ -25,7 +26,7 @@ import java.util.ArrayList; import java.util.List; public class SQLDropLogFileGroupStatement extends SQLStatementImpl implements SQLDropStatement { - private SQLExpr name; + private SQLName name; private SQLExpr engine; public SQLDropLogFileGroupStatement() { @@ -44,11 +45,11 @@ public class SQLDropLogFileGroupStatement extends SQLStatementImpl implements SQ visitor.endVisit(this); } - public SQLExpr getName() { + public SQLName getName() { return name; } - public void setName(SQLExpr x) { + public void setName(SQLName x) { if (x != null) { x.setParent(this); } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropMaterializedViewStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropMaterializedViewStatement.java index 254783e3a5..c779658796 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropMaterializedViewStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropMaterializedViewStatement.java @@ -16,7 +16,7 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.DbType; -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; @@ -25,7 +25,7 @@ import java.util.ArrayList; import java.util.List; public class SQLDropMaterializedViewStatement extends SQLStatementImpl implements SQLDropStatement { - private SQLExpr name; + private SQLName name; private boolean ifExists; public SQLDropMaterializedViewStatement() { @@ -43,11 +43,11 @@ public class SQLDropMaterializedViewStatement extends SQLStatementImpl implement visitor.endVisit(this); } - public SQLExpr getName() { + public SQLName getName() { return name; } - public void setName(SQLExpr x) { + public void setName(SQLName x) { if (x != null) { x.setParent(this); } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropOfflineModelStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropOfflineModelStatement.java new file mode 100644 index 0000000000..7ca57cb2a6 --- /dev/null +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropOfflineModelStatement.java @@ -0,0 +1,90 @@ +/* + * 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.ast.statement; + +import com.alibaba.druid.DbType; +import com.alibaba.druid.sql.ast.*; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +import java.util.ArrayList; +import java.util.List; + +public class SQLDropOfflineModelStatement extends SQLStatementImpl implements SQLDropStatement, SQLReplaceable { + protected SQLName name; + protected boolean ifExists; + + public SQLDropOfflineModelStatement() { + } + + public SQLDropOfflineModelStatement(DbType dbType) { + super(dbType); + } + + @Override + protected void accept0(SQLASTVisitor visitor) { + if (visitor.visit(this)) { + acceptChild(visitor, name); + } + visitor.endVisit(this); + } + + @Override + public List getChildren() { + List children = new ArrayList(); + if (name != null) { + children.add(name); + } + return children; + } + + public SQLName getName() { + return name; + } + + public void setName(SQLName name) { + this.name = name; + } + + public String getTableGroupName() { + if (name == null) { + return null; + } + + if (name instanceof SQLName) { + return name.getSimpleName(); + } + + return null; + } + + public boolean isIfExists() { + return ifExists; + } + + public void setIfExists(boolean ifNotExists) { + this.ifExists = ifNotExists; + } + + public boolean replace(SQLExpr expr, SQLExpr target) { + if (name == expr) { + setName((SQLName) target); + return true; + } + + return false; + } + +} diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropOutlineStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropOutlineStatement.java index 10d2af094d..fdb971e343 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropOutlineStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropOutlineStatement.java @@ -16,7 +16,7 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.DbType; -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; @@ -25,7 +25,7 @@ import java.util.ArrayList; import java.util.List; public class SQLDropOutlineStatement extends SQLStatementImpl implements SQLDropStatement { - private SQLExpr name; + private SQLName name; private boolean ifExists; public SQLDropOutlineStatement() { @@ -43,11 +43,11 @@ public class SQLDropOutlineStatement extends SQLStatementImpl implements SQLDrop visitor.endVisit(this); } - public SQLExpr getName() { + public SQLName getName() { return name; } - public void setName(SQLExpr x) { + public void setName(SQLName x) { if (x != null) { x.setParent(this); } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropProcedureStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropProcedureStatement.java index 59d5c8bbbd..85a402c16c 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropProcedureStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropProcedureStatement.java @@ -58,4 +58,8 @@ public class SQLDropProcedureStatement extends SQLStatementImpl implements SQLDr this.ifExists = ifExists; } + @Override + public DDLObjectType getDDLObjectType() { + return DDLObjectType.PROCEDURE; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropResourceGroupStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropResourceGroupStatement.java index e15698e63a..2cb6597fe5 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropResourceGroupStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropResourceGroupStatement.java @@ -16,7 +16,7 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.DbType; -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; @@ -26,7 +26,7 @@ import java.util.List; public class SQLDropResourceGroupStatement extends SQLStatementImpl implements SQLDropStatement { - private SQLExpr name; + private SQLName name; private boolean ifExists; public SQLDropResourceGroupStatement() { @@ -44,11 +44,11 @@ public class SQLDropResourceGroupStatement visitor.endVisit(this); } - public SQLExpr getName() { + public SQLName getName() { return name; } - public void setName(SQLExpr x) { + public void setName(SQLName x) { if (x != null) { x.setParent(this); } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropResourceStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropResourceStatement.java index f24abde326..92ba92c855 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropResourceStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropResourceStatement.java @@ -16,7 +16,7 @@ package com.alibaba.druid.sql.ast.statement; import com.alibaba.druid.DbType; -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; @@ -25,7 +25,7 @@ import java.util.ArrayList; import java.util.List; public class SQLDropResourceStatement extends SQLStatementImpl implements SQLDropStatement { - private SQLExpr name; + private SQLName name; private boolean ifExists; public SQLDropResourceStatement() { @@ -43,11 +43,11 @@ public class SQLDropResourceStatement extends SQLStatementImpl implements SQLDro visitor.endVisit(this); } - public SQLExpr getName() { + public SQLName getName() { return name; } - public void setName(SQLExpr x) { + public void setName(SQLName x) { if (x != null) { x.setParent(this); } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropRoleStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropRoleStatement.java index 36ede1af29..950ef37a9a 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropRoleStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropRoleStatement.java @@ -74,4 +74,9 @@ public class SQLDropRoleStatement extends SQLStatementImpl implements SQLCreateS return false; } + + @Override + public DDLObjectType getDDLObjectType() { + return DDLObjectType.ROLE; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropSequenceStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropSequenceStatement.java index ea38040b5d..56ebae88a5 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropSequenceStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropSequenceStatement.java @@ -88,4 +88,9 @@ public class SQLDropSequenceStatement extends SQLStatementImpl implements SQLDro return false; } + + @Override + public DDLObjectType getDDLObjectType() { + return DDLObjectType.SEQUENCE; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropServerStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropServerStatement.java index 7bb871b69e..1de84ec44f 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropServerStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropServerStatement.java @@ -23,7 +23,7 @@ import java.util.ArrayList; import java.util.List; public class SQLDropServerStatement extends SQLStatementImpl implements SQLDropStatement, SQLReplaceable { - private SQLExpr name; + private SQLName name; private boolean ifExists; public SQLDropServerStatement() { @@ -41,11 +41,11 @@ public class SQLDropServerStatement extends SQLStatementImpl implements SQLDropS visitor.endVisit(this); } - public SQLExpr getName() { + public SQLName getName() { return name; } - public void setName(SQLExpr x) { + public void setName(SQLName x) { if (x != null) { x.setParent(this); } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropStatement.java index bedb0ef553..80cd13fae6 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropStatement.java @@ -15,5 +15,10 @@ */ package com.alibaba.druid.sql.ast.statement; +import com.alibaba.druid.sql.ast.SQLName; + public interface SQLDropStatement extends SQLDDLStatement { + default SQLName getName() { + return null; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTableGroupStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTableGroupStatement.java index 6d45dfe512..df1f571196 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTableGroupStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTableGroupStatement.java @@ -87,4 +87,8 @@ public class SQLDropTableGroupStatement extends SQLStatementImpl implements SQLD return false; } + @Override + public DDLObjectType getDDLObjectType() { + return DDLObjectType.TABLE_GROUP; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTableSpaceStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTableSpaceStatement.java index 2fa531510f..6f3df1d174 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTableSpaceStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTableSpaceStatement.java @@ -92,4 +92,9 @@ public class SQLDropTableSpaceStatement extends SQLStatementImpl implements SQLD return false; } + + @Override + public DDLObjectType getDDLObjectType() { + return DDLObjectType.TABLE_SPACE; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTableStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTableStatement.java index 797e6b36ae..7697fea13d 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTableStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTableStatement.java @@ -172,4 +172,17 @@ public class SQLDropTableStatement extends SQLStatementImpl implements SQLDropSt } this.where = x; } + + @Override + public DDLObjectType getDDLObjectType() { + return DDLObjectType.TABLE; + } + + public SQLName getName() { + if (tableSources.size() == 1) { + SQLExprTableSource dataSource0 = tableSources.get(0); + return dataSource0.getName(); + } + return null; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTriggerStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTriggerStatement.java index 44d496c85b..4f885750db 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTriggerStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTriggerStatement.java @@ -75,4 +75,9 @@ public class SQLDropTriggerStatement extends SQLStatementImpl implements SQLDrop return false; } + + @Override + public DDLObjectType getDDLObjectType() { + return DDLObjectType.TRIGGER; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTypeStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTypeStatement.java index 2a1f2e300d..048e596ea3 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTypeStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropTypeStatement.java @@ -23,7 +23,7 @@ import java.util.ArrayList; import java.util.List; public class SQLDropTypeStatement extends SQLStatementImpl implements SQLDropStatement, SQLReplaceable { - private SQLExpr name; + private SQLName name; private boolean ifExists; public SQLDropTypeStatement() { @@ -41,11 +41,11 @@ public class SQLDropTypeStatement extends SQLStatementImpl implements SQLDropSta visitor.endVisit(this); } - public SQLExpr getName() { + public SQLName getName() { return name; } - public void setName(SQLExpr x) { + public void setName(SQLName x) { if (x != null) { x.setParent(this); } @@ -77,4 +77,9 @@ public class SQLDropTypeStatement extends SQLStatementImpl implements SQLDropSta return false; } + + @Override + public DDLObjectType getDDLObjectType() { + return DDLObjectType.TYPE; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropUserStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropUserStatement.java index fe421c1bfd..65f5806eed 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropUserStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropUserStatement.java @@ -78,4 +78,9 @@ public class SQLDropUserStatement extends SQLStatementImpl implements SQLDropSta return false; } + + @Override + public DDLObjectType getDDLObjectType() { + return DDLObjectType.USER; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropViewStatement.java b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropViewStatement.java index c728730805..01a36a961e 100644 --- a/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropViewStatement.java +++ b/core/src/main/java/com/alibaba/druid/sql/ast/statement/SQLDropViewStatement.java @@ -109,4 +109,9 @@ public class SQLDropViewStatement extends SQLStatementImpl implements SQLDropSta public List getChildren() { return tableSources; } + + @Override + public DDLObjectType getDDLObjectType() { + return DDLObjectType.VIEW; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsCopyStmt.java b/core/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsCopyStmt.java new file mode 100644 index 0000000000..0c5b44ecef --- /dev/null +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsCopyStmt.java @@ -0,0 +1,41 @@ +/* + * 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.odps.ast; + +import com.alibaba.druid.sql.dialect.odps.visitor.OdpsASTVisitor; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class OdpsCopyStmt extends OdpsStatementImpl { + private String arguments; + + @Override + protected void accept0(SQLASTVisitor visitor) { + accept0((OdpsASTVisitor) visitor); + } + + public void accept0(OdpsASTVisitor visitor) { + visitor.visit(this); + visitor.endVisit(this); + } + + public String getArguments() { + return arguments; + } + + public void setArguments(String arguments) { + this.arguments = arguments; + } +} diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsPAIStmt.java b/core/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsPAIStmt.java new file mode 100644 index 0000000000..1c9117849e --- /dev/null +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/odps/ast/OdpsPAIStmt.java @@ -0,0 +1,41 @@ +/* + * 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.odps.ast; + +import com.alibaba.druid.sql.dialect.odps.visitor.OdpsASTVisitor; +import com.alibaba.druid.sql.visitor.SQLASTVisitor; + +public class OdpsPAIStmt extends OdpsStatementImpl { + private String arguments; + + @Override + protected void accept0(SQLASTVisitor visitor) { + accept0((OdpsASTVisitor) visitor); + } + + public void accept0(OdpsASTVisitor visitor) { + visitor.visit(this); + visitor.endVisit(this); + } + + public String getArguments() { + return arguments; + } + + public void setArguments(String arguments) { + this.arguments = arguments; + } +} diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsCreateTableParser.java b/core/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsCreateTableParser.java index 8de0d99662..2b7198b3a4 100644 --- a/core/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsCreateTableParser.java +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsCreateTableParser.java @@ -254,6 +254,7 @@ public class OdpsCreateTableParser extends SQLCreateTableParser { case TABLE: case PARTITION: case SEQUENCE: + case VARIANT: break; default: throw new ParserException("expect identifier. " + lexer.info()); diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java b/core/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java index 1d442af589..b73700c52e 100644 --- a/core/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/odps/parser/OdpsStatementParser.java @@ -309,6 +309,12 @@ public class OdpsStatementParser extends SQLStatementParser { return true; } + if (lexer.identifierEquals("alias")) { + SQLStatement stmt = parseSet(); + statementList.add(stmt); + return true; + } + if (lexer.identifierEquals("EXSTORE")) { lexer.nextToken(); OdpsExstoreStatement stmt = new OdpsExstoreStatement(); @@ -331,6 +337,40 @@ public class OdpsStatementParser extends SQLStatementParser { return true; } + if (lexer.identifierEquals("PAI")) { + lexer.nextToken(); + int semiPos = lexer.text.indexOf(';', lexer.pos()); + while (semiPos != -1 && semiPos + 2 < lexer.text.length()) { + char next = lexer.text.charAt(semiPos + 1); + if (next == '"' || next == '\'') { + semiPos = lexer.text.indexOf(';', semiPos + 1); + continue; + } + break; + } + String arguments; + if (semiPos != -1) { + int count = semiPos - lexer.pos(); + arguments = lexer.subString(lexer.pos(), count); + lexer.reset(semiPos); + } else { + arguments = lexer.subString(lexer.pos()); + lexer.reset(lexer.text.length()); + } + lexer.nextToken(); + + OdpsPAIStmt stmt = new OdpsPAIStmt(); + stmt.setArguments(arguments); + statementList.add(stmt); + return true; + } + + if (lexer.identifierEquals("COPY")) { + SQLStatement stmt = parseCopy(); + statementList.add(stmt); + return true; + } + if (lexer.identifierEquals(FnvHash.Constants.KILL)) { SQLStatement stmt = parseKill(); statementList.add(stmt); @@ -1199,6 +1239,8 @@ public class OdpsStatementParser extends SQLStatementParser { if (identifierEquals("SETPROJECT")) { lexer.nextToken(); setProject = true; + } else if (dbType == DbType.odps && identifierEquals("ALIAS")) { + lexer.nextToken(); } else { accept(Token.SET); } @@ -1543,4 +1585,23 @@ public class OdpsStatementParser extends SQLStatementParser { return stmt; } + + public SQLStatement parseCopy() { + lexer.nextToken(); + int semiPos = lexer.text.indexOf(';', lexer.pos()); + String arguments; + if (semiPos != -1) { + int count = semiPos - lexer.pos(); + arguments = lexer.subString(lexer.pos(), count); + lexer.reset(semiPos); + } else { + arguments = lexer.subString(lexer.pos()); + lexer.reset(lexer.text.length()); + } + lexer.nextToken(); + + OdpsCopyStmt stmt = new OdpsCopyStmt(); + stmt.setArguments(arguments); + return stmt; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsASTVisitor.java b/core/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsASTVisitor.java index 8cdbeeaecc..8121b03e48 100644 --- a/core/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsASTVisitor.java +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsASTVisitor.java @@ -272,4 +272,18 @@ public interface OdpsASTVisitor extends HiveASTVisitor { default void endVisit(OdpsUndoTableStatement x) { } + default boolean visit(OdpsPAIStmt x) { + return true; + } + + default void endVisit(OdpsPAIStmt x) { + } + + default boolean visit(OdpsCopyStmt x) { + return true; + } + + default void endVisit(OdpsCopyStmt x) { + } + } diff --git a/core/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java b/core/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java index 9cee7a1bf3..ae7c859ef9 100644 --- a/core/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java +++ b/core/src/main/java/com/alibaba/druid/sql/dialect/odps/visitor/OdpsOutputVisitor.java @@ -1097,4 +1097,16 @@ public class OdpsOutputVisitor extends HiveOutputVisitor implements OdpsASTVisit printExpr(x.getPackageName()); return false; } + + public boolean visit(OdpsPAIStmt x) { + print0(ucase ? "PAI " : "pai "); + print0(x.getArguments()); + return false; + } + + public boolean visit(OdpsCopyStmt x) { + print0(ucase ? "COPY " : "copy "); + print0(x.getArguments()); + return false; + } } diff --git a/core/src/main/java/com/alibaba/druid/sql/parser/Lexer.java b/core/src/main/java/com/alibaba/druid/sql/parser/Lexer.java index 0e9839f2a4..74a76e8f85 100644 --- a/core/src/main/java/com/alibaba/druid/sql/parser/Lexer.java +++ b/core/src/main/java/com/alibaba/druid/sql/parser/Lexer.java @@ -142,6 +142,10 @@ public class Lexer { return text.substring(offset, offset + count); } + public final String subString(int offset) { + return text.substring(offset); + } + public final char[] sub_chars(int offset, int count) { char[] chars = new char[count]; text.getChars(offset, offset + count, chars, 0); @@ -1132,12 +1136,14 @@ public class Lexer { } stringVal = null; mark = pos; - while (!isWhitespace(ch) && ch != ';') { + while (!isWhitespace(ch) && ch != ';' && pos < text.length()) { ch = charAt(++pos); } bufPos = pos - mark; - ch = charAt(++pos); + if (ch != ';') { + ch = charAt(++pos); + } token = LITERAL_PATH; } @@ -1147,7 +1153,13 @@ public class Lexer { ch = charAt(++pos); } - if (isFirstIdentifierChar(ch) || ch == '{') { + char first = ch; + if (first == '$') { + scanVariable(); + return; + } + + if (isFirstIdentifierChar(first) || first == '{') { stringVal = null; mark = pos; while (ch != ';' && ch != EOI) { @@ -2275,12 +2287,25 @@ public class Lexer { break; } - if (ident && isWhitespace(ch)) { - break; + if (ident && ch == '$') { + if (charAt(pos + 1) == '{') { + bufPos++; + ident = false; + continue; + } + } + + if (ident) { + if (isWhitespace(ch)) { + pos--; + break; + } else if (ch == ',' || ch == ')' || ch == '(' || ch == ';') { + pos--; + break; + } } bufPos++; - continue; } if (ch != '}' && !ident) { @@ -2289,10 +2314,11 @@ public class Lexer { ++pos; bufPos++; + char endChar = ch; this.ch = charAt(pos); - if (dbType == DbType.odps) { - while (isIdentifierChar(this.ch) && ch != ';') { + if (dbType == DbType.odps && !isWhitespace(endChar)) { + while (isIdentifierChar(this.ch) && ch != ';') { ++pos; bufPos++; this.ch = charAt(pos); @@ -2515,7 +2541,9 @@ public class Lexer { bufPos++; break; } else if (ch == EOI) { - break; + if (pos >= text.length()) { + break; + } } if (ch == '\n') { diff --git a/core/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java b/core/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java index bf68ee264d..ff6f74087e 100644 --- a/core/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java +++ b/core/src/main/java/com/alibaba/druid/sql/parser/SQLExprParser.java @@ -81,7 +81,7 @@ public class SQLExprParser extends SQLParser { if (lexer.token == Token.STAR) { lexer.nextToken(); - SQLExpr expr = new SQLAllColumnExpr(); + SQLAllColumnExpr expr = new SQLAllColumnExpr(); if (lexer.token == Token.DOT) { lexer.nextToken(); @@ -89,6 +89,15 @@ public class SQLExprParser extends SQLParser { return new SQLPropertyExpr(expr, "*"); } + if (lexer.token == Token.EXCEPT) { + lexer.nextToken(); + accept(Token.LPAREN); + List except = new ArrayList<>(); + this.exprList(except, expr); + expr.setExcept(except); + accept(Token.RPAREN); + } + return expr; } @@ -1958,7 +1967,21 @@ public class SQLExprParser extends SQLParser { protected SQLExpr dotRest(SQLExpr expr) { if (lexer.token == Token.STAR) { lexer.nextToken(); - expr = new SQLPropertyExpr(expr, "*"); + if (lexer.token == Token.EXCEPT) { + SQLAllColumnExpr allColumnExpr = new SQLAllColumnExpr(); + allColumnExpr.setOwner(expr); + + lexer.nextToken(); + accept(Token.LPAREN); + List except = new ArrayList<>(); + this.exprList(except, allColumnExpr); + allColumnExpr.setExcept(except); + accept(Token.RPAREN); + + expr = allColumnExpr; + } else { + expr = new SQLPropertyExpr(expr, "*"); + } } else { String name; long hash_lower = 0L; @@ -2008,7 +2031,7 @@ public class SQLExprParser extends SQLParser { && ((SQLIdentifierExpr) expr).nameHashCode64() == FnvHash.Constants.WMSYS; expr = methodRest(expr, name, aggregate); } else { - if (name.charAt(0) == '`') { + if (name.length() > 0 && name.charAt(0) == '`') { if (lexer.isEnabled(SQLParserFeature.IgnoreNameQuotes)) { name = name.substring(1, name.length() - 1); } @@ -2369,7 +2392,9 @@ public class SQLExprParser extends SQLParser { return name; } - if (lexer.token != Token.LITERAL_ALIAS && lexer.token != Token.IDENTIFIER + if (lexer.token != Token.LITERAL_ALIAS + && lexer.token != Token.IDENTIFIER + && lexer.token != Token.VARIANT && (!lexer.getKeywords().containsValue(lexer.token))) { throw new ParserException("error, " + lexer.info()); } diff --git a/core/src/main/java/com/alibaba/druid/sql/parser/SQLParserUtils.java b/core/src/main/java/com/alibaba/druid/sql/parser/SQLParserUtils.java index 315c178d2a..e312976dd0 100644 --- a/core/src/main/java/com/alibaba/druid/sql/parser/SQLParserUtils.java +++ b/core/src/main/java/com/alibaba/druid/sql/parser/SQLParserUtils.java @@ -580,6 +580,16 @@ public class SQLParserUtils { lexer.nextToken(); if (lexer.token == Token.FUNCTION || lexer.identifierEquals("FUNCTION")) { + lexer.nextToken(); + lexer.nextToken(); + if (lexer.token == Token.AS) { + lexer.nextToken(); + if (lexer.token == Token.LITERAL_CHARS) { + lexer.nextToken(); + token = lexer.token; + continue; + } + } lexer.startPos = sql.length(); break; } @@ -590,8 +600,15 @@ public class SQLParserUtils { lexer.nextTokenForSet(); token = lexer.token; continue; - } else if (lexer.identifierEquals("pai") || lexer.identifierEquals("jar")) { + } else if (dbType == DbType.odps && (lexer.identifierEquals("pai") || lexer.identifierEquals("jar"))) { if (lexer.startPos - start > 0) { + int semiIndex = sql.indexOf(';', lexer.startPos); + if (semiIndex != -1) { + lexer.pos = semiIndex - 1; + lexer.nextToken(); + token = lexer.token; + continue; + } String str = sql.substring(start, lexer.startPos).trim(); if (str.isEmpty()) { lexer.startPos = sql.length(); @@ -605,7 +622,14 @@ public class SQLParserUtils { set = true; } - lexer.nextToken(); + if (lexer.identifierEquals("ADD") && (dbType == DbType.hive || dbType == DbType.odps)) { + lexer.nextToken(); + if (lexer.identifierEquals("JAR")) { + lexer.nextPath(); + } + } else { + lexer.nextToken(); + } token = lexer.token; } @@ -735,9 +759,9 @@ public class SQLParserUtils { if (lexer.identifierEquals("JAR")) { lexer.nextPath(); } + } else { + lexer.nextToken(); } - - lexer.nextToken(); token = lexer.token; } diff --git a/core/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java b/core/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java index 0ce7044778..37d40c152d 100644 --- a/core/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java +++ b/core/src/main/java/com/alibaba/druid/sql/parser/SQLStatementParser.java @@ -861,6 +861,8 @@ public class SQLStatementParser extends SQLParser { stmt = x; } else if (lexer.identifierEquals("MATERIALIZED")) { stmt = parseDropMaterializedView(); + } else if (lexer.identifierEquals("OFFLINEMODEL")) { + stmt = parseDropOfflineModel(); } else { throw new ParserException("TODO " + lexer.info()); } @@ -970,6 +972,25 @@ public class SQLStatementParser extends SQLParser { return stmt; } + public SQLStatement parseDropOfflineModel() { + if (lexer.token() == Token.DROP) { + lexer.nextToken(); + } + SQLDropOfflineModelStatement stmt = new SQLDropOfflineModelStatement(); + stmt.setDbType(dbType); + + acceptIdentifier("OFFLINEMODEL"); + + if (lexer.token == Token.IF) { + lexer.nextToken(); + accept(Token.EXISTS); + stmt.setIfExists(true); + } + + stmt.setName(this.exprParser.name()); + return stmt; + } + protected SQLStatement parseDropCatalog() { accept(Token.DROP); @@ -2148,6 +2169,14 @@ public class SQLStatementParser extends SQLParser { accept(RPAREN); stmt.addItem(alterTablePartition); continue; + } else if (lexer.identifierEquals("ARCHIVE")) { + SQLAlterTableArchive archive = new SQLAlterTableArchive(); + for (SQLAssignItem condition : renamePartition.getPartition()) { + archive.getPartition().add(condition); + condition.setParent(archive); + } + stmt.addItem(archive); + continue; } else if (lexer.identifierEquals(FnvHash.Constants.ADD)) { alterTableAdd(stmt); continue; @@ -2189,14 +2218,15 @@ public class SQLStatementParser extends SQLParser { } else if (lexer.identifierEquals(FnvHash.Constants.ARCHIVE)) { lexer.nextToken(); - accept(Token.PARTITION); + if (lexer.token == PARTITION) { + lexer.nextToken(); - SQLAlterTableArchivePartition item = new SQLAlterTableArchivePartition(); - accept(Token.LPAREN); - parseAssignItems(item.getPartitions(), item, false); - accept(Token.RPAREN); - - stmt.addItem(item); + SQLAlterTableArchivePartition item = new SQLAlterTableArchivePartition(); + accept(Token.LPAREN); + parseAssignItems(item.getPartitions(), item, false); + accept(Token.RPAREN); + stmt.addItem(item); + } } else if (lexer.identifierEquals(FnvHash.Constants.UNARCHIVE)) { lexer.nextToken(); diff --git a/core/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java b/core/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java index 8b54762a64..98d23b773d 100644 --- a/core/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java +++ b/core/src/main/java/com/alibaba/druid/sql/visitor/SQLASTOutputVisitor.java @@ -2101,7 +2101,21 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet } public boolean visit(SQLAllColumnExpr x) { + SQLExpr owner = x.getOwner(); + if (owner != null) { + printExpr(owner); + print('.'); + } + print('*'); + + List except = x.getExcept(); + if (except != null) { + print(ucase ? " EXCEPT(" : "except("); + printAndAccept(except, ", "); + print(')'); + } + return true; } @@ -6746,6 +6760,18 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet return false; } + @Override + public boolean visit(SQLAlterTableArchive x) { + if (!x.getPartition().isEmpty()) { + print0(ucase ? "PARTITION (" : "partition ("); + printAndAccept(x.getPartition(), ", "); + print0(") "); + } + + print0(ucase ? "ARCHIVE" : "archive"); + return false; + } + @Override public boolean visit(SQLAlterTableDisableLifecycle x) { if (!x.getPartition().isEmpty()) { @@ -10242,6 +10268,19 @@ public class SQLASTOutputVisitor extends SQLASTVisitorAdapter implements Paramet @Override public boolean visit(SQLDropOutlineStatement x) { print0(ucase ? "DROP OUTLINE " : "drop outline "); + if (x.isIfExists()) { + print0(ucase ? "IF EXISTS " : "if exists "); + } + x.getName().accept(this); + return false; + } + + @Override + public boolean visit(SQLDropOfflineModelStatement x) { + print0(ucase ? "DROP OFFLINEMODEL " : "drop offlinemodel "); + if (x.isIfExists()) { + print0(ucase ? "IF EXISTS " : "if exists "); + } x.getName().accept(this); return false; } 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 1befc1fab4..2bdabf7cf0 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 @@ -1045,6 +1045,13 @@ public interface SQLASTVisitor { default void endVisit(SQLAlterTablePartition x) { } + default boolean visit(SQLAlterTableArchive x) { + return true; + } + + default void endVisit(SQLAlterTableArchive x) { + } + default boolean visit(SQLAlterTablePartition x) { return true; } @@ -1990,6 +1997,13 @@ public interface SQLASTVisitor { default void endVisit(SQLDropOutlineStatement x) { } + default boolean visit(SQLDropOfflineModelStatement x) { + return true; + } + + default void endVisit(SQLDropOfflineModelStatement x) { + } + default boolean visit(SQLAlterOutlineStatement x) { return true; }