From 60091f072a8fbb8fe6f8720deb76791b927ffdcc Mon Sep 17 00:00:00 2001 From: zhangdong <493738387@qq.com> Date: Thu, 1 Aug 2024 18:57:44 +0800 Subject: [PATCH] =?UTF-8?q?[fix](auth)fix=20create=20table=20like=20need?= =?UTF-8?q?=20create=5Fpriv=20of=20existed=20table=20(#=E2=80=A6=20(#38570?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit …37879) pick: https://github.com/apache/doris/pull/37879 --- .../doris/datasource/InternalCatalog.java | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) 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 83af49508e..992a8232df 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 @@ -190,6 +190,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Set; import java.util.TreeMap; import java.util.concurrent.ConcurrentHashMap; @@ -1166,6 +1167,8 @@ public class InternalCatalog implements CatalogIf { } public void createTableLike(CreateTableLikeStmt stmt) throws DdlException { + ConnectContext ctx = ConnectContext.get(); + Objects.requireNonNull(ctx, "ConnectContext.get() can not be null."); try { DatabaseIf db = getDbOrDdlException(stmt.getExistedDbName()); TableIf table = db.getTableOrDdlException(stmt.getExistedTableName()); @@ -1199,14 +1202,23 @@ public class InternalCatalog implements CatalogIf { } finally { table.readUnlock(); } - CreateTableStmt parsedCreateTableStmt = (CreateTableStmt) SqlParserUtils.parseAndAnalyzeStmt( - createTableStmt.get(0), ConnectContext.get()); - parsedCreateTableStmt.setTableName(stmt.getTableName()); - parsedCreateTableStmt.setIfNotExists(stmt.isIfNotExists()); - createTable(parsedCreateTableStmt); + + try { + // analyze CreateTableStmt will check create_priv of existedTable, create table like only need + // create_priv of newTable, and select_priv of existedTable, and priv check has done in + // CreateTableStmt/CreateTableCommand, so we skip it + ctx.setSkipAuth(true); + CreateTableStmt parsedCreateTableStmt = (CreateTableStmt) SqlParserUtils.parseAndAnalyzeStmt( + createTableStmt.get(0), ctx); + parsedCreateTableStmt.setTableName(stmt.getTableName()); + parsedCreateTableStmt.setIfNotExists(stmt.isIfNotExists()); + createTable(parsedCreateTableStmt); + } finally { + ctx.setSkipAuth(false); + } } catch (UserException e) { throw new DdlException("Failed to execute CREATE TABLE LIKE " + stmt.getExistedTableName() + ". Reason: " - + e.getMessage()); + + e.getMessage(), e); } }