[Feat](nereids)nereids support create table like (#34025)
nereids support create table like statement. e.g. CREATE TABLE test1.table2 LIKE test1.table1
This commit is contained in:
@ -78,6 +78,7 @@ import org.apache.doris.nereids.DorisParser.CreateMTMVContext;
|
||||
import org.apache.doris.nereids.DorisParser.CreateProcedureContext;
|
||||
import org.apache.doris.nereids.DorisParser.CreateRowPolicyContext;
|
||||
import org.apache.doris.nereids.DorisParser.CreateTableContext;
|
||||
import org.apache.doris.nereids.DorisParser.CreateTableLikeContext;
|
||||
import org.apache.doris.nereids.DorisParser.CreateViewContext;
|
||||
import org.apache.doris.nereids.DorisParser.CteContext;
|
||||
import org.apache.doris.nereids.DorisParser.DataTypeWithNullableContext;
|
||||
@ -364,6 +365,7 @@ import org.apache.doris.nereids.trees.plans.commands.CreateMTMVCommand;
|
||||
import org.apache.doris.nereids.trees.plans.commands.CreatePolicyCommand;
|
||||
import org.apache.doris.nereids.trees.plans.commands.CreateProcedureCommand;
|
||||
import org.apache.doris.nereids.trees.plans.commands.CreateTableCommand;
|
||||
import org.apache.doris.nereids.trees.plans.commands.CreateTableLikeCommand;
|
||||
import org.apache.doris.nereids.trees.plans.commands.CreateViewCommand;
|
||||
import org.apache.doris.nereids.trees.plans.commands.DeleteFromCommand;
|
||||
import org.apache.doris.nereids.trees.plans.commands.DeleteFromUsingCommand;
|
||||
@ -393,6 +395,7 @@ import org.apache.doris.nereids.trees.plans.commands.info.CancelMTMVTaskInfo;
|
||||
import org.apache.doris.nereids.trees.plans.commands.info.ColumnDefinition;
|
||||
import org.apache.doris.nereids.trees.plans.commands.info.CreateMTMVInfo;
|
||||
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.commands.info.CreateViewInfo;
|
||||
import org.apache.doris.nereids.trees.plans.commands.info.DMLCommandType;
|
||||
import org.apache.doris.nereids.trees.plans.commands.info.DefaultValue;
|
||||
@ -3499,4 +3502,21 @@ public class LogicalPlanBuilder extends DorisParserBaseVisitor<Object> {
|
||||
public Object visitUnsupported(UnsupportedContext ctx) {
|
||||
return UnsupportedCommand.INSTANCE;
|
||||
}
|
||||
|
||||
@Override
|
||||
public LogicalPlan visitCreateTableLike(CreateTableLikeContext ctx) {
|
||||
List<String> nameParts = visitMultipartIdentifier(ctx.name);
|
||||
List<String> existedTableNameParts = visitMultipartIdentifier(ctx.existedTable);
|
||||
ArrayList<String> rollupNames = Lists.newArrayList();
|
||||
boolean withAllRollUp = false;
|
||||
if (ctx.WITH() != null && ctx.rollupNames != null) {
|
||||
rollupNames = new ArrayList<>(visitIdentifierList(ctx.rollupNames));
|
||||
} else if (ctx.WITH() != null && ctx.rollupNames == null) {
|
||||
withAllRollUp = true;
|
||||
}
|
||||
CreateTableLikeInfo info = new CreateTableLikeInfo(ctx.EXISTS() != null,
|
||||
new TableNameInfo(nameParts), new TableNameInfo(existedTableNameParts),
|
||||
rollupNames, withAllRollUp);
|
||||
return new CreateTableLikeCommand(info);
|
||||
}
|
||||
}
|
||||
|
||||
@ -153,6 +153,6 @@ public enum PlanType {
|
||||
SHOW_CREATE_PROCEDURE_COMMAND,
|
||||
CREATE_VIEW_COMMAND,
|
||||
ALTER_VIEW_COMMAND,
|
||||
|
||||
UNSUPPORTED_COMMAND
|
||||
UNSUPPORTED_COMMAND,
|
||||
CREATE_TABLE_LIKE_COMMAND
|
||||
}
|
||||
|
||||
@ -0,0 +1,49 @@
|
||||
// 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.CreateTableLikeStmt;
|
||||
import org.apache.doris.catalog.Env;
|
||||
import org.apache.doris.nereids.trees.plans.PlanType;
|
||||
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;
|
||||
|
||||
/** CreateTableLikeCommand */
|
||||
public class CreateTableLikeCommand extends Command implements ForwardWithSync {
|
||||
private final CreateTableLikeInfo info;
|
||||
|
||||
public CreateTableLikeCommand(CreateTableLikeInfo info) {
|
||||
super(PlanType.CREATE_TABLE_LIKE_COMMAND);
|
||||
this.info = info;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void run(ConnectContext ctx, StmtExecutor executor) throws Exception {
|
||||
executor.checkBlockRules();
|
||||
info.validate(ctx);
|
||||
CreateTableLikeStmt stmt = info.translateToLegacyStmt();
|
||||
Env.getCurrentEnv().createTableLike(stmt);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <R, C> R accept(PlanVisitor<R, C> visitor, C context) {
|
||||
return visitor.visitCreateTableLikeCommand(this, context);
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,77 @@
|
||||
// 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.info;
|
||||
|
||||
import org.apache.doris.analysis.CreateTableLikeStmt;
|
||||
import org.apache.doris.catalog.Env;
|
||||
import org.apache.doris.common.AnalysisException;
|
||||
import org.apache.doris.common.DdlException;
|
||||
import org.apache.doris.common.ErrorCode;
|
||||
import org.apache.doris.common.ErrorReport;
|
||||
import org.apache.doris.common.FeNameFormat;
|
||||
import org.apache.doris.common.util.Util;
|
||||
import org.apache.doris.mysql.privilege.PrivPredicate;
|
||||
import org.apache.doris.qe.ConnectContext;
|
||||
|
||||
import java.util.ArrayList;
|
||||
|
||||
/** CreateTableLikeInfo */
|
||||
public class CreateTableLikeInfo {
|
||||
private final boolean ifNotExists;
|
||||
private final TableNameInfo tableName;
|
||||
private final TableNameInfo existedTableName;
|
||||
private final ArrayList<String> rollupNames;
|
||||
private final boolean withAllRollup;
|
||||
|
||||
public CreateTableLikeInfo(boolean ifNotExists, TableNameInfo tableName, TableNameInfo existedTableName,
|
||||
ArrayList<String> rollupNames, boolean withAllRollup) {
|
||||
this.ifNotExists = ifNotExists;
|
||||
this.tableName = tableName;
|
||||
this.existedTableName = existedTableName;
|
||||
this.rollupNames = rollupNames;
|
||||
this.withAllRollup = withAllRollup;
|
||||
}
|
||||
|
||||
public CreateTableLikeStmt translateToLegacyStmt() throws DdlException {
|
||||
return new CreateTableLikeStmt(ifNotExists, tableName.transferToTableName(),
|
||||
existedTableName.transferToTableName(), rollupNames, withAllRollup);
|
||||
}
|
||||
|
||||
/** validate */
|
||||
public void validate(ConnectContext ctx) throws AnalysisException {
|
||||
existedTableName.analyze(ctx);
|
||||
// disallow external catalog
|
||||
Util.prohibitExternalCatalog(existedTableName.getCtl(), "CreateTableLikeStmt");
|
||||
//check privilege
|
||||
if (!Env.getCurrentEnv().getAccessManager()
|
||||
.checkTblPriv(ctx, existedTableName.getCtl(), existedTableName.getDb(),
|
||||
existedTableName.getTbl(), PrivPredicate.SELECT)) {
|
||||
ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR, "SELECT");
|
||||
}
|
||||
|
||||
tableName.analyze(ctx);
|
||||
// disallow external catalog
|
||||
Util.prohibitExternalCatalog(tableName.getCtl(), "CreateTableLikeStmt");
|
||||
FeNameFormat.checkTableName(tableName.getTbl());
|
||||
//check privilege
|
||||
if (!Env.getCurrentEnv().getAccessManager().checkTblPriv(ctx, tableName.getCtl(), tableName.getDb(),
|
||||
tableName.getTbl(), PrivPredicate.CREATE)) {
|
||||
ErrorReport.reportAnalysisException(ErrorCode.ERR_SPECIFIC_ACCESS_DENIED_ERROR, "CREATE");
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -27,6 +27,7 @@ import org.apache.doris.nereids.trees.plans.commands.CreateMTMVCommand;
|
||||
import org.apache.doris.nereids.trees.plans.commands.CreatePolicyCommand;
|
||||
import org.apache.doris.nereids.trees.plans.commands.CreateProcedureCommand;
|
||||
import org.apache.doris.nereids.trees.plans.commands.CreateTableCommand;
|
||||
import org.apache.doris.nereids.trees.plans.commands.CreateTableLikeCommand;
|
||||
import org.apache.doris.nereids.trees.plans.commands.CreateViewCommand;
|
||||
import org.apache.doris.nereids.trees.plans.commands.DeleteFromCommand;
|
||||
import org.apache.doris.nereids.trees.plans.commands.DeleteFromUsingCommand;
|
||||
@ -171,4 +172,8 @@ public interface CommandVisitor<R, C> {
|
||||
default R visitUnsupportedCommand(UnsupportedCommand unsupportedCommand, C context) {
|
||||
return visitCommand(unsupportedCommand, context);
|
||||
}
|
||||
|
||||
default R visitCreateTableLikeCommand(CreateTableLikeCommand createTableLikeCommand, C context) {
|
||||
return visitCommand(createTableLikeCommand, context);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user