From 348d1c341441b0752f070d4280ba61dd4ed210bc Mon Sep 17 00:00:00 2001 From: zhangdong <493738387@qq.com> Date: Tue, 16 Jul 2024 11:55:31 +0800 Subject: [PATCH 1/3] 1 --- .../doris/datasource/InternalCatalog.java | 20 +++++++++++++------ 1 file changed, 14 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 e13316c3e7655e..ea27b692642aa7 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 @@ -1259,14 +1259,22 @@ public void createTableLike(CreateTableLikeStmt stmt) throws DdlException { } 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 + ConnectContext.get().setSkipAuth(true); + CreateTableStmt parsedCreateTableStmt = (CreateTableStmt) SqlParserUtils.parseAndAnalyzeStmt( + createTableStmt.get(0), ConnectContext.get()); + parsedCreateTableStmt.setTableName(stmt.getTableName()); + parsedCreateTableStmt.setIfNotExists(stmt.isIfNotExists()); + createTable(parsedCreateTableStmt); + } finally { + ConnectContext.get().setSkipAuth(false); + } } catch (UserException e) { throw new DdlException("Failed to execute CREATE TABLE LIKE " + stmt.getExistedTableName() + ". Reason: " - + e.getMessage()); + + e.getMessage(), e); } } From 30b1e819c42efd05e4ca6a1d204869ef5dfc7593 Mon Sep 17 00:00:00 2001 From: zhangdong <493738387@qq.com> Date: Fri, 19 Jul 2024 15:28:27 +0800 Subject: [PATCH 2/3] 1 --- .../org/apache/doris/datasource/InternalCatalog.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 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 ea27b692642aa7..5f994fa36582f8 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 @@ -1259,18 +1259,23 @@ public void createTableLike(CreateTableLikeStmt stmt) throws DdlException { } finally { table.readUnlock(); } + ConnectContext ctx = ConnectContext.get(); 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 - ConnectContext.get().setSkipAuth(true); + if (ctx != null) { + ctx.setSkipAuth(true); + } CreateTableStmt parsedCreateTableStmt = (CreateTableStmt) SqlParserUtils.parseAndAnalyzeStmt( createTableStmt.get(0), ConnectContext.get()); parsedCreateTableStmt.setTableName(stmt.getTableName()); parsedCreateTableStmt.setIfNotExists(stmt.isIfNotExists()); createTable(parsedCreateTableStmt); } finally { - ConnectContext.get().setSkipAuth(false); + if (ctx != null) { + ctx.setSkipAuth(false); + } } } catch (UserException e) { throw new DdlException("Failed to execute CREATE TABLE LIKE " + stmt.getExistedTableName() + ". Reason: " From 1cb6f35f8676cad2c3edf720ba9bb5a1d19eaf61 Mon Sep 17 00:00:00 2001 From: zhangdong <493738387@qq.com> Date: Mon, 22 Jul 2024 17:05:19 +0800 Subject: [PATCH 3/3] 1 --- .../apache/doris/datasource/InternalCatalog.java | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 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 5f994fa36582f8..d7ce360ada31f8 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 @@ -197,6 +197,7 @@ 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; @@ -1226,6 +1227,8 @@ public boolean createTable(CreateTableStmt stmt) throws UserException { } 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()); @@ -1259,23 +1262,19 @@ public void createTableLike(CreateTableLikeStmt stmt) throws DdlException { } finally { table.readUnlock(); } - ConnectContext ctx = ConnectContext.get(); + 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 - if (ctx != null) { - ctx.setSkipAuth(true); - } + ctx.setSkipAuth(true); CreateTableStmt parsedCreateTableStmt = (CreateTableStmt) SqlParserUtils.parseAndAnalyzeStmt( - createTableStmt.get(0), ConnectContext.get()); + createTableStmt.get(0), ctx); parsedCreateTableStmt.setTableName(stmt.getTableName()); parsedCreateTableStmt.setIfNotExists(stmt.isIfNotExists()); createTable(parsedCreateTableStmt); } finally { - if (ctx != null) { - ctx.setSkipAuth(false); - } + ctx.setSkipAuth(false); } } catch (UserException e) { throw new DdlException("Failed to execute CREATE TABLE LIKE " + stmt.getExistedTableName() + ". Reason: "