diff --git a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 index 2b914da48c97c0..6aaafe5ddb83f8 100644 --- a/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 +++ b/fe/fe-core/src/main/antlr4/org/apache/doris/nereids/DorisParser.g4 @@ -262,6 +262,7 @@ supportedDropStatement ((FROM | IN) database=identifier)? properties=propertyClause #dropFile | DROP WORKLOAD POLICY (IF EXISTS)? name=identifierOrText #dropWorkloadPolicy | DROP REPOSITORY name=identifier #dropRepository + | DROP TABLE (IF EXISTS)? name=multipartIdentifier FORCE? #dropTable | DROP (DATABASE | SCHEMA) (IF EXISTS)? name=multipartIdentifier FORCE? #dropDatabase | DROP statementScope? FUNCTION (IF EXISTS)? functionIdentifier LEFT_PAREN functionArguments? RIGHT_PAREN #dropFunction @@ -718,8 +719,7 @@ fromRollup ; unsupportedDropStatement - : DROP TABLE (IF EXISTS)? name=multipartIdentifier FORCE? #dropTable - | DROP VIEW (IF EXISTS)? name=multipartIdentifier #dropView + : DROP VIEW (IF EXISTS)? name=multipartIdentifier #dropView | DROP RESOURCE (IF EXISTS)? name=identifierOrText #dropResource | DROP ROW POLICY (IF EXISTS)? policyName=identifier ON tableName=multipartIdentifier diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/TableName.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/TableName.java index 81c96c9857d50f..612f445a60eccd 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/TableName.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/TableName.java @@ -29,6 +29,7 @@ import org.apache.doris.common.io.Writable; import org.apache.doris.datasource.InternalCatalog; import org.apache.doris.persist.gson.GsonUtils; +import org.apache.doris.qe.ConnectContext; import com.google.common.base.Preconditions; import com.google.common.base.Strings; @@ -95,6 +96,25 @@ public void analyze(Analyzer analyzer) throws AnalysisException { } } + public void analyze(ConnectContext ctx) { + if (Strings.isNullOrEmpty(ctl)) { + ctl = ctx.getDefaultCatalog(); + if (Strings.isNullOrEmpty(ctl)) { + ctl = InternalCatalog.INTERNAL_CATALOG_NAME; + } + } + if (Strings.isNullOrEmpty(db)) { + db = ctx.getDatabase(); + if (Strings.isNullOrEmpty(db)) { + throw new org.apache.doris.nereids.exceptions.AnalysisException("No database selected"); + } + } + + if (Strings.isNullOrEmpty(tbl)) { + throw new org.apache.doris.nereids.exceptions.AnalysisException("Table name is null"); + } + } + public String getCtl() { return ctl; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java index bba7ca8b0c68e9..8fd97c21311663 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/Env.java @@ -4232,9 +4232,18 @@ public void replayAlterExternalTableSchema(String dbName, String tableName, List // Drop table public void dropTable(DropTableStmt stmt) throws DdlException { - CatalogIf catalogIf = catalogMgr.getCatalogOrException(stmt.getCatalogName(), + if (stmt == null) { + throw new DdlException("DropTableStmt is null"); + } + dropTable(stmt.getCatalogName(), stmt.getDbName(), stmt.getTableName(), stmt.isView(), + stmt.isMaterializedView(), stmt.isSetIfExists(), stmt.isForceDrop()); + } + + public void dropTable(String catalogName, String dbName, String tableName, boolean isView, boolean isMtmv, + boolean ifExists, boolean force) throws DdlException { + CatalogIf catalogIf = catalogMgr.getCatalogOrException(catalogName, catalog -> new DdlException(("Unknown catalog " + catalog))); - catalogIf.dropTable(stmt); + catalogIf.dropTable(dbName, tableName, isView, isMtmv, ifExists, force); } public boolean unprotectDropTable(Database db, Table table, boolean isForceDrop, boolean isReplay, diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogIf.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogIf.java index c28e65c3478a68..9b8334c39a8292 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogIf.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/CatalogIf.java @@ -203,6 +203,9 @@ default void dropDb(DropDbStmt stmt) throws DdlException { void dropTable(DropTableStmt stmt) throws DdlException; + void dropTable(String dbName, String tableName, boolean isView, boolean isMtmv, boolean ifExists, + boolean force) throws DdlException; + void truncateTable(TruncateTableStmt truncateTableStmt) throws DdlException; /** diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalCatalog.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalCatalog.java index 80adbfd67b6a86..9b1d26e36479d3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalCatalog.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalCatalog.java @@ -1021,14 +1021,24 @@ public void replayCreateTable(String dbName, String tblName) { @Override public void dropTable(DropTableStmt stmt) throws DdlException { + if (stmt == null) { + throw new DdlException("DropTableStmt is null"); + } + dropTable(stmt.getDbName(), stmt.getTableName(), stmt.isView(), stmt.isMaterializedView(), stmt.isSetIfExists(), + stmt.isForceDrop()); + } + + @Override + public void dropTable(String dbName, String tableName, boolean isView, boolean isMtmv, boolean ifExists, + boolean force) throws DdlException { makeSureInitialized(); if (metadataOps == null) { LOG.warn("dropTable not implemented"); return; } try { - metadataOps.dropTable(stmt); - DropInfo info = new DropInfo(getName(), stmt.getDbName(), stmt.getTableName()); + metadataOps.dropTable(dbName, tableName, ifExists); + DropInfo info = new DropInfo(getName(), dbName, tableName); Env.getCurrentEnv().getEditLog().logDropTable(info); } catch (Exception e) { LOG.warn("Failed to drop a table", e); diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java index 91b5e7f0f884a2..de8f46845727db 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/InternalCatalog.java @@ -877,11 +877,18 @@ public void replayRenameDatabase(String dbName, String newDbName) { // Drop table public void dropTable(DropTableStmt stmt) throws DdlException { + if (stmt == null) { + throw new DdlException("DropTableStmt is null"); + } + dropTable(stmt.getDbName(), stmt.getTableName(), stmt.isView(), stmt.isMaterializedView(), + stmt.isSetIfExists(), stmt.isForceDrop()); + } + + public void dropTable(String dbName, String tableName, boolean isView, boolean isMtmv, + boolean ifExists, boolean force) throws DdlException { Map costTimes = new TreeMap(); StopWatch watch = StopWatch.createStarted(); - String dbName = stmt.getDbName(); - String tableName = stmt.getTableName(); - LOG.info("begin to drop table: {} from db: {}, is force: {}", tableName, dbName, stmt.isForceDrop()); + LOG.info("begin to drop table: {} from db: {}, is force: {}", tableName, dbName, force); // check database Database db = getDbOrDdlException(dbName); @@ -895,7 +902,7 @@ public void dropTable(DropTableStmt stmt) throws DdlException { try { Table table = db.getTableNullable(tableName); if (table == null) { - if (stmt.isSetIfExists()) { + if (ifExists) { LOG.info("drop table[{}] which does not exist", tableName); return; } else { @@ -903,7 +910,7 @@ public void dropTable(DropTableStmt stmt) throws DdlException { } } // Check if a view - if (stmt.isView()) { + if (isView) { if (!(table instanceof View)) { ErrorReport.reportDdlException(ErrorCode.ERR_WRONG_OBJECT, dbName, tableName, "VIEW", genDropHint(dbName, table)); @@ -915,43 +922,43 @@ public void dropTable(DropTableStmt stmt) throws DdlException { } } - if (!stmt.isMaterializedView() && table instanceof MTMV) { + if (!isMtmv && table instanceof MTMV) { ErrorReport.reportDdlException(ErrorCode.ERR_WRONG_OBJECT, dbName, tableName, "TABLE", genDropHint(dbName, table)); - } else if (stmt.isMaterializedView() && !(table instanceof MTMV)) { + } else if (isMtmv && !(table instanceof MTMV)) { ErrorReport.reportDdlException(ErrorCode.ERR_WRONG_OBJECT, dbName, tableName, "MTMV", genDropHint(dbName, table)); } - if (!stmt.isForceDrop()) { + if (!force) { if (Env.getCurrentGlobalTransactionMgr().existCommittedTxns(db.getId(), table.getId(), null)) { throw new DdlException( - "There are still some transactions in the COMMITTED state waiting to be completed. " - + "The table [" + tableName - + "] cannot be dropped. If you want to forcibly drop(cannot be recovered)," - + " please use \"DROP table FORCE\"."); + "There are still some transactions in the COMMITTED state waiting to be completed. " + + "The table [" + tableName + + "] cannot be dropped. If you want to forcibly drop(cannot be recovered)," + + " please use \"DROP table FORCE\"."); } watch.split(); costTimes.put("2:existCommittedTxns", watch.getSplitTime()); } - if (table instanceof OlapTable && !stmt.isForceDrop()) { + if (table instanceof OlapTable && !force) { OlapTable olapTable = (OlapTable) table; if ((olapTable.getState() != OlapTableState.NORMAL)) { throw new DdlException("The table [" + tableName + "]'s state is " + olapTable.getState() - + ", cannot be dropped. please cancel the operation on olap table firstly." - + " If you want to forcibly drop(cannot be recovered)," - + " please use \"DROP table FORCE\"."); + + ", cannot be dropped. please cancel the operation on olap table firstly." + + " If you want to forcibly drop(cannot be recovered)," + + " please use \"DROP table FORCE\"."); } if (olapTable.isInAtomicRestore()) { throw new DdlException("The table [" + tableName + "]'s state is in atomic restore" - + ", cannot be dropped. please cancel the restore operation on olap table" - + " firstly. If you want to forcibly drop(cannot be recovered)," - + " please use \"DROP table FORCE\"."); + + ", cannot be dropped. please cancel the restore operation on olap table" + + " firstly. If you want to forcibly drop(cannot be recovered)," + + " please use \"DROP table FORCE\"."); } } - dropTableInternal(db, table, stmt.isView(), stmt.isForceDrop(), watch, costTimes); + dropTableInternal(db, table, isView, force, watch, costTimes); } catch (UserException e) { throw new DdlException(e.getMessage(), e.getMysqlErrorCode()); } finally { @@ -960,7 +967,7 @@ public void dropTable(DropTableStmt stmt) throws DdlException { watch.stop(); costTimes.put("6:total", watch.getTime()); LOG.info("finished dropping table: {} from db: {}, is view: {}, is force: {}, cost: {}", - tableName, dbName, stmt.isView(), stmt.isForceDrop(), costTimes); + tableName, dbName, isView, force, costTimes); } // drop table without any check. diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HiveMetadataOps.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HiveMetadataOps.java index 37005fa0eecda5..66a4162c8535cc 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HiveMetadataOps.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/hive/HiveMetadataOps.java @@ -287,11 +287,17 @@ public void afterCreateTable(String dbName, String tblName) { @Override public void dropTableImpl(DropTableStmt stmt) throws DdlException { - String dbName = stmt.getDbName(); - String tblName = stmt.getTableName(); - ExternalDatabase db = catalog.getDbNullable(stmt.getDbName()); + if (stmt == null) { + throw new DdlException("DropTableStmt is null"); + } + dropTableImpl(stmt.getDbName(), stmt.getTableName(), stmt.isSetIfExists()); + } + + @Override + public void dropTableImpl(String dbName, String tblName, boolean ifExists) throws DdlException { + ExternalDatabase db = catalog.getDbNullable(dbName); if (db == null) { - if (stmt.isSetIfExists()) { + if (ifExists) { LOG.info("database [{}] does not exist when drop table[{}]", dbName, tblName); return; } else { @@ -299,7 +305,7 @@ public void dropTableImpl(DropTableStmt stmt) throws DdlException { } } if (!tableExist(dbName, tblName)) { - if (stmt.isSetIfExists()) { + if (ifExists) { LOG.info("drop table[{}] which does not exist", dbName); return; } else { diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergMetadataOps.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergMetadataOps.java index 0ee20690ea828c..0159defbae05c1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergMetadataOps.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/iceberg/IcebergMetadataOps.java @@ -250,14 +250,21 @@ public void afterCreateTable(String dbName, String tblName) { @Override public void dropTableImpl(DropTableStmt stmt) throws DdlException { + if (stmt == null) { + throw new DdlException("DropTableStmt is null"); + } + dropTableImpl(stmt.getDbName(), stmt.getTableName(), stmt.isSetIfExists()); + } + + public void dropTableImpl(String dbName, String tableName, boolean ifExists) throws DdlException { try { preExecutionAuthenticator.execute(() -> { - performDropTable(stmt); + performDropTable(dbName, tableName, ifExists); return null; }); } catch (Exception e) { throw new DdlException( - "Failed to drop table: " + stmt.getTableName() + ", error message is:" + e.getMessage(), e); + "Failed to drop table: " + tableName + ", error message is:" + e.getMessage(), e); } } @@ -270,11 +277,16 @@ public void afterDropTable(String dbName, String tblName) { } private void performDropTable(DropTableStmt stmt) throws DdlException { - String dbName = stmt.getDbName(); - String tableName = stmt.getTableName(); + if (stmt == null) { + throw new DdlException("DropTableStmt is null"); + } + performDropTable(stmt.getDbName(), stmt.getTableName(), stmt.isSetIfExists()); + } + + private void performDropTable(String dbName, String tableName, boolean ifExists) throws DdlException { ExternalDatabase db = dorisCatalog.getDbNullable(dbName); if (db == null) { - if (stmt.isSetIfExists()) { + if (ifExists) { LOG.info("database [{}] does not exist when drop table[{}]", dbName, tableName); return; } else { @@ -283,7 +295,7 @@ private void performDropTable(DropTableStmt stmt) throws DdlException { } if (!tableExist(dbName, tableName)) { - if (stmt.isSetIfExists()) { + if (ifExists) { LOG.info("drop table[{}] which does not exist", tableName); return; } else { diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/operations/ExternalMetadataOps.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/operations/ExternalMetadataOps.java index e8d6842ac4483b..d4055c658145e0 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/operations/ExternalMetadataOps.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/operations/ExternalMetadataOps.java @@ -101,8 +101,15 @@ default void dropTable(DropTableStmt stmt) throws DdlException { afterDropTable(stmt.getDbName(), stmt.getTableName()); } + default void dropTable(String dbName, String tableName, boolean ifExists) throws DdlException { + dropTableImpl(dbName, tableName, ifExists); + afterDropTable(dbName, tableName); + } + void dropTableImpl(DropTableStmt stmt) throws DdlException; + void dropTableImpl(String dbName, String tableName, boolean ifExists) throws DdlException; + default void afterDropTable(String dbName, String tblName) { } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java index 9cc76395fa4dd0..26b459b7c1701c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/parser/LogicalPlanBuilder.java @@ -157,6 +157,7 @@ import org.apache.doris.nereids.DorisParser.DropRollupClauseContext; import org.apache.doris.nereids.DorisParser.DropSqlBlockRuleContext; import org.apache.doris.nereids.DorisParser.DropStoragePolicyContext; +import org.apache.doris.nereids.DorisParser.DropTableContext; import org.apache.doris.nereids.DorisParser.DropUserContext; import org.apache.doris.nereids.DorisParser.DropWorkloadGroupContext; import org.apache.doris.nereids.DorisParser.DropWorkloadPolicyContext; @@ -560,6 +561,7 @@ import org.apache.doris.nereids.trees.plans.commands.DropRoleCommand; import org.apache.doris.nereids.trees.plans.commands.DropSqlBlockRuleCommand; import org.apache.doris.nereids.trees.plans.commands.DropStoragePolicyCommand; +import org.apache.doris.nereids.trees.plans.commands.DropTableCommand; import org.apache.doris.nereids.trees.plans.commands.DropUserCommand; import org.apache.doris.nereids.trees.plans.commands.DropWorkloadGroupCommand; import org.apache.doris.nereids.trees.plans.commands.DropWorkloadPolicyCommand; @@ -5371,6 +5373,31 @@ public LogicalPlan visitDropRole(DropRoleContext ctx) { return new DropRoleCommand(ctx.name.getText(), ctx.EXISTS() != null); } + @Override + public LogicalPlan visitDropTable(DropTableContext ctx) { + String ctlName = null; + String dbName = null; + String tableName = null; + List nameParts = visitMultipartIdentifier(ctx.name); + if (nameParts.size() == 1) { + tableName = nameParts.get(0); + } else if (nameParts.size() == 2) { + dbName = nameParts.get(0); + tableName = nameParts.get(1); + } else if (nameParts.size() == 3) { + ctlName = nameParts.get(0); + dbName = nameParts.get(1); + tableName = nameParts.get(2); + } else { + throw new AnalysisException("nameParts in create table should be [ctl.][db.]tbl"); + } + + boolean ifExists = ctx.EXISTS() != null; + boolean forceDrop = ctx.FORCE() != null; + TableNameInfo tblNameInfo = new TableNameInfo(ctlName, dbName, tableName); + return new DropTableCommand(ifExists, tblNameInfo, forceDrop); + } + @Override public LogicalPlan visitDropCatalog(DropCatalogContext ctx) { String catalogName = stripQuotes(ctx.name.getText()); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java index 803c1bcbf57cd9..395a4a87be791a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/PlanType.java @@ -288,5 +288,6 @@ public enum PlanType { SWITCH_COMMAND, HELP_COMMAND, USE_COMMAND, + DROP_TABLE_COMMAND, ALTER_SYSTEM_RENAME_COMPUTE_GROUP } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DropTableCommand.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DropTableCommand.java new file mode 100644 index 00000000000000..a8abc7b09cc097 --- /dev/null +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/DropTableCommand.java @@ -0,0 +1,87 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you 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 org.apache.doris.nereids.trees.plans.commands; + +import org.apache.doris.analysis.StmtType; +import org.apache.doris.catalog.Env; +import org.apache.doris.common.ErrorCode; +import org.apache.doris.common.ErrorReport; +import org.apache.doris.common.util.InternalDatabaseUtil; +import org.apache.doris.mysql.privilege.PrivPredicate; +import org.apache.doris.nereids.trees.plans.PlanType; +import org.apache.doris.nereids.trees.plans.commands.info.TableNameInfo; +import org.apache.doris.nereids.trees.plans.visitor.PlanVisitor; +import org.apache.doris.qe.ConnectContext; +import org.apache.doris.qe.StmtExecutor; + +import com.google.common.base.Strings; + +/** + * drop table command + */ +public class DropTableCommand extends Command implements ForwardWithSync { + + private boolean ifExists; + private final TableNameInfo tableName; + private final boolean isView; + private boolean forceDrop; + private boolean isMaterializedView; + + public DropTableCommand(boolean ifExists, TableNameInfo tableName, boolean forceDrop) { + super(PlanType.DROP_TABLE_COMMAND); + this.ifExists = ifExists; + this.tableName = tableName; + this.isView = false; + this.forceDrop = forceDrop; + } + + public DropTableCommand(boolean ifExists, TableNameInfo tableName, boolean isView, boolean forceDrop) { + super(PlanType.DROP_TABLE_COMMAND); + this.ifExists = ifExists; + this.tableName = tableName; + this.isView = isView; + this.forceDrop = forceDrop; + } + + @Override + public R accept(PlanVisitor visitor, C context) { + return visitor.visitDropTableCommand(this, context); + } + + @Override + public void run(ConnectContext ctx, StmtExecutor executor) throws Exception { + if (Strings.isNullOrEmpty(tableName.getDb())) { + tableName.setDb(ctx.getDatabase()); + } + tableName.analyze(ctx); + InternalDatabaseUtil.checkDatabase(tableName.getDb(), ctx); + // check access + if (!Env.getCurrentEnv().getAccessManager() + .checkTblPriv(ConnectContext.get(), tableName.getCtl(), tableName.getDb(), + tableName.getTbl(), PrivPredicate.DROP)) { + ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR, "DROP"); + } + Env.getCurrentEnv().dropTable(tableName.getCtl(), tableName.getDb(), tableName.getTbl(), isView, + isMaterializedView, ifExists, forceDrop); + } + + @Override + public StmtType stmtType() { + return StmtType.DROP; + } +} diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/TableNameInfo.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/TableNameInfo.java index a0bcc794b6be78..1ddfec004dc796 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/TableNameInfo.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/TableNameInfo.java @@ -90,6 +90,22 @@ public TableNameInfo(String db, String tbl) { this.db = db; } + /** + * TableNameInfo + * @param ctl catalogName + * @param db dbName + * @param tbl tblName + */ + public TableNameInfo(String ctl, String db, String tbl) { + Objects.requireNonNull(tbl, "require tbl object"); + this.ctl = ctl; + this.tbl = tbl; + if (Env.isStoredTableNamesLowerCase()) { + this.tbl = tbl.toLowerCase(); + } + this.db = db; + } + /** * analyze tableNameInfo * @param ctx ctx diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java index bdb6ce48826435..4a241710041d28 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/visitor/CommandVisitor.java @@ -74,6 +74,7 @@ import org.apache.doris.nereids.trees.plans.commands.DropRoleCommand; import org.apache.doris.nereids.trees.plans.commands.DropSqlBlockRuleCommand; import org.apache.doris.nereids.trees.plans.commands.DropStoragePolicyCommand; +import org.apache.doris.nereids.trees.plans.commands.DropTableCommand; import org.apache.doris.nereids.trees.plans.commands.DropUserCommand; import org.apache.doris.nereids.trees.plans.commands.DropWorkloadGroupCommand; import org.apache.doris.nereids.trees.plans.commands.DropWorkloadPolicyCommand; @@ -655,6 +656,10 @@ default R visitCreateRoleCommand(CreateRoleCommand createRoleCommand, C context) return visitCommand(createRoleCommand, context); } + default R visitDropTableCommand(DropTableCommand dropTableCommand, C context) { + return visitCommand(dropTableCommand, context); + } + default R visitDropRoleCommand(DropRoleCommand dropRoleCommand, C context) { return visitCommand(dropRoleCommand, context); } diff --git a/regression-test/suites/nereids_p0/drop/drop_table.groovy b/regression-test/suites/nereids_p0/drop/drop_table.groovy new file mode 100644 index 00000000000000..c35971a4d7b492 --- /dev/null +++ b/regression-test/suites/nereids_p0/drop/drop_table.groovy @@ -0,0 +1,37 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you 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. + +suite("test_nereids_drop_table") { + def table_name = "nereids_test_drop_table" + def db_name = "nereids_test_db_name" + + sql """DROP DATABASE IF EXISTS ${db_name}""" + + sql """CREATE DATABASE ${db_name}""" + + sql """ + CREATE TABLE IF NOT EXISTS ${table_name} + ( + `user_id` LARGEINT NOT NULL COMMENT "用户id" + ) ENGINE = olap + DUPLICATE KEY(`user_id`) + DISTRIBUTED BY HASH(`user_id`) BUCKETS 2 + PROPERTIES ("replication_num" = "1"); + """ + checkNereidsExecute("DROP TABLE ${table_name}") + +} diff --git a/regression-test/suites/query_p0/dual/dual.groovy b/regression-test/suites/query_p0/dual/dual.groovy index 964ca49f3ab2c1..868fdce895be32 100644 --- a/regression-test/suites/query_p0/dual/dual.groovy +++ b/regression-test/suites/query_p0/dual/dual.groovy @@ -60,11 +60,7 @@ suite('dual') { qt_sql 'select 1 from `dual`' qt_sql 'select 1 from dual' - // Tests for dropping 'dual' and ensuring correct error handling - test { - sql 'drop table if exists dual' - exception """DUAL is keyword, maybe `DUAL`""" - } + sql 'drop table if exists dual' sql 'drop table if exists `dual`' // Test error handling when table does not exist @@ -82,4 +78,4 @@ suite('dual') { sql "select 1, a from dual" exception "Unknown column 'a' in 'table list'" } -} \ No newline at end of file +}