This is an automated email from the ASF dual-hosted git repository.

dataroaring pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-3.0 by this push:
     new f29c0b1268f branch-3.0: [enhancement](nereids)remove dependence on old 
CreateTableStmt for CreateTableLikeCommand #48007 (#48261)
f29c0b1268f is described below

commit f29c0b1268f811b0f9960edbe81ae3a0f1d5f0a1
Author: github-actions[bot] 
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Fri Feb 28 17:19:10 2025 +0800

    branch-3.0: [enhancement](nereids)remove dependence on old CreateTableStmt 
for CreateTableLikeCommand #48007 (#48261)
    
    Cherry-picked from #48007
    
    Co-authored-by: starocean999 <li...@selectdb.com>
---
 .../trees/plans/commands/CreateTableCommand.java   |  4 ++
 .../plans/commands/CreateTableLikeCommand.java     | 72 +++++++++++++++++++++-
 .../trees/plans/commands/info/CreateTableInfo.java | 15 +++++
 .../create_table/test_create_table_like.groovy     | 39 ++++++++++++
 4 files changed, 129 insertions(+), 1 deletion(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/CreateTableCommand.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/CreateTableCommand.java
index 281eb73513e..3bb39ede246 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/CreateTableCommand.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/CreateTableCommand.java
@@ -213,6 +213,10 @@ public class CreateTableCommand extends Command implements 
ForwardWithSync {
         return createTableInfo;
     }
 
+    public Optional<LogicalPlan> getCtasQuery() {
+        return ctasQuery;
+    }
+
     @Override
     public StmtType stmtType() {
         return StmtType.CREATE;
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/CreateTableLikeCommand.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/CreateTableLikeCommand.java
index 3b59c312880..e02790b5adb 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/CreateTableLikeCommand.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/CreateTableLikeCommand.java
@@ -19,13 +19,27 @@ package org.apache.doris.nereids.trees.plans.commands;
 
 import org.apache.doris.analysis.CreateTableLikeStmt;
 import org.apache.doris.analysis.StmtType;
+import org.apache.doris.catalog.DatabaseIf;
 import org.apache.doris.catalog.Env;
+import org.apache.doris.catalog.OlapTable;
+import org.apache.doris.catalog.TableIf;
+import org.apache.doris.common.DdlException;
+import org.apache.doris.common.ErrorCode;
+import org.apache.doris.common.ErrorReport;
+import org.apache.doris.common.UserException;
+import org.apache.doris.nereids.parser.NereidsParser;
 import org.apache.doris.nereids.trees.plans.PlanType;
+import org.apache.doris.nereids.trees.plans.commands.info.CreateTableInfo;
 import org.apache.doris.nereids.trees.plans.commands.info.CreateTableLikeInfo;
 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.collect.Lists;
+import org.apache.commons.collections.CollectionUtils;
+
+import java.util.List;
+
 /** CreateTableLikeCommand */
 public class CreateTableLikeCommand extends Command implements ForwardWithSync 
{
     private final CreateTableLikeInfo info;
@@ -40,7 +54,7 @@ public class CreateTableLikeCommand extends Command 
implements ForwardWithSync {
         executor.checkBlockRules();
         info.validate(ctx);
         CreateTableLikeStmt stmt = info.translateToLegacyStmt();
-        Env.getCurrentEnv().createTableLike(stmt);
+        doRun(stmt, ctx, executor);
     }
 
     @Override
@@ -52,4 +66,60 @@ public class CreateTableLikeCommand extends Command 
implements ForwardWithSync {
     public StmtType stmtType() {
         return StmtType.CREATE;
     }
+
+    private void doRun(CreateTableLikeStmt stmt, ConnectContext ctx, 
StmtExecutor executor) throws Exception {
+        try {
+            DatabaseIf db = 
Env.getCurrentInternalCatalog().getDbOrDdlException(stmt.getExistedDbName());
+            TableIf table = 
db.getTableOrDdlException(stmt.getExistedTableName());
+
+            if (table.getType() == TableIf.TableType.VIEW) {
+                throw new DdlException("Not support create table from a View");
+            }
+
+            List<String> createTableStmt = Lists.newArrayList();
+            table.readLock();
+            try {
+                if (table.isManagedTable()) {
+                    if (!CollectionUtils.isEmpty(stmt.getRollupNames())) {
+                        OlapTable olapTable = (OlapTable) table;
+                        for (String rollupIndexName : stmt.getRollupNames()) {
+                            if 
(!olapTable.hasMaterializedIndex(rollupIndexName)) {
+                                throw new DdlException("Rollup index[" + 
rollupIndexName + "] not exists in Table["
+                                        + olapTable.getName() + "]");
+                            }
+                        }
+                    }
+                } else if (!CollectionUtils.isEmpty(stmt.getRollupNames()) || 
stmt.isWithAllRollup()) {
+                    throw new DdlException("Table[" + table.getName() + "] is 
external, not support rollup copy");
+                }
+
+                Env.getDdlStmt(stmt, stmt.getDbName(), table, createTableStmt, 
null, null, false, false, true, -1L,
+                        false, false);
+                if (createTableStmt.isEmpty()) {
+                    
ErrorReport.reportDdlException(ErrorCode.ERROR_CREATE_TABLE_LIKE_EMPTY, 
"CREATE");
+                }
+            } finally {
+                table.readUnlock();
+            }
+
+            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);
+                NereidsParser nereidsParser = new NereidsParser();
+                CreateTableCommand createTableCommand = (CreateTableCommand) 
nereidsParser
+                        .parseSingle(createTableStmt.get(0));
+                CreateTableInfo createTableInfo = 
createTableCommand.getCreateTableInfo();
+                createTableCommand = new 
CreateTableCommand(createTableCommand.getCtasQuery(),
+                        
createTableInfo.withTableNameAndIfNotExists(stmt.getTableName(), 
stmt.isIfNotExists()));
+                createTableCommand.run(ctx, executor);
+            } finally {
+                ctx.setSkipAuth(false);
+            }
+        } catch (UserException e) {
+            throw new DdlException("Failed to execute CREATE TABLE LIKE " + 
stmt.getExistedTableName() + ". Reason: "
+                    + e.getMessage(), e);
+        }
+    }
 }
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateTableInfo.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateTableInfo.java
index 6aad8ebbe14..c60b129c965 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateTableInfo.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/CreateTableInfo.java
@@ -195,6 +195,21 @@ public class CreateTableInfo {
         this.clusterKeysColumnNames = 
Utils.copyRequiredList(clusterKeyColumnNames);
     }
 
+    /**
+     * withTableNameAndIfNotExists
+     */
+    public CreateTableInfo withTableNameAndIfNotExists(String tableName, 
boolean ifNotExists) {
+        if (ctasColumns != null) {
+            return new CreateTableInfo(ifNotExists, isExternal, ctlName, 
dbName, tableName, ctasColumns, engineName,
+                    keysType, keys, comment, partitionTableInfo, distribution, 
rollups, properties, extProperties,
+                    clusterKeysColumnNames);
+        } else {
+            return new CreateTableInfo(ifNotExists, isExternal, ctlName, 
dbName, tableName, columns, indexes,
+                    engineName, keysType, keys, comment, partitionTableInfo, 
distribution, rollups, properties,
+                    extProperties, clusterKeysColumnNames);
+        }
+    }
+
     public List<String> getCtasColumns() {
         return ctasColumns;
     }
diff --git 
a/regression-test/suites/nereids_p0/create_table/test_create_table_like.groovy 
b/regression-test/suites/nereids_p0/create_table/test_create_table_like.groovy
new file mode 100644
index 00000000000..f3d0cda01f7
--- /dev/null
+++ 
b/regression-test/suites/nereids_p0/create_table/test_create_table_like.groovy
@@ -0,0 +1,39 @@
+// 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.
+
+// this suite is for creating table with timestamp datatype in defferent 
+// case. For example: 'year' and 'Year' datatype should also be valid in 
definition
+
+suite("test_create_table_like") {
+    multi_sql """
+    DROP TABLE IF EXISTS test_create_table_like_t1;
+
+    CREATE TABLE `test_create_table_like_t1` (
+    `id` int NULL,
+    `m_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE 
CURRENT_TIMESTAMP
+    ) ENGINE=OLAP
+    UNIQUE KEY(`id`)
+    DISTRIBUTED BY HASH(`id`) BUCKETS AUTO
+    PROPERTIES (
+    "replication_allocation" = "tag.location.default: 1"
+    );
+
+    DROP TABLE IF EXISTS test_create_table_like_t2;
+
+    CREATE TABLE test_create_table_like_t2 like test_create_table_like_t1;
+    """
+}


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to