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 <[email protected]>
---
.../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: [email protected]
For additional commands, e-mail: [email protected]