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 4d1e393716..2f4c1d55ac 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 @@ -24,6 +24,7 @@ import org.apache.doris.catalog.Env; import org.apache.doris.catalog.ScalarType; import org.apache.doris.common.ErrorCode; import org.apache.doris.nereids.NereidsPlanner; +import org.apache.doris.nereids.analyzer.UnboundResultSink; import org.apache.doris.nereids.analyzer.UnboundTableSink; import org.apache.doris.nereids.annotation.Developing; import org.apache.doris.nereids.exceptions.AnalysisException; @@ -96,7 +97,7 @@ public class CreateTableCommand extends Command implements ForwardWithSync { LogicalPlan query = ctasQuery.get(); List ctasCols = createTableInfo.getCtasColumns(); NereidsPlanner planner = new NereidsPlanner(ctx.getStatementContext()); - Plan plan = planner.plan(query, PhysicalProperties.ANY, ExplainLevel.NONE); + Plan plan = planner.plan(new UnboundResultSink<>(query), PhysicalProperties.ANY, ExplainLevel.NONE); if (ctasCols == null) { // we should analyze the plan firstly to get the columns' name. ctasCols = plan.getOutput().stream().map(NamedExpression::getName).collect(Collectors.toList()); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ColumnDefinition.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ColumnDefinition.java index cd551cbbf4..f6208feb48 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ColumnDefinition.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/ColumnDefinition.java @@ -24,6 +24,7 @@ import org.apache.doris.catalog.KeysType; import org.apache.doris.catalog.PrimitiveType; import org.apache.doris.catalog.ScalarType; import org.apache.doris.catalog.Type; +import org.apache.doris.common.FeNameFormat; import org.apache.doris.nereids.exceptions.AnalysisException; import org.apache.doris.nereids.types.ArrayType; import org.apache.doris.nereids.types.BigIntType; @@ -181,6 +182,11 @@ public class ColumnDefinition { * validate column definition and analyze */ public void validate(boolean isOlap, Set keysSet, boolean isEnableMergeOnWrite, KeysType keysType) { + try { + FeNameFormat.checkColumnName(name); + } catch (Exception e) { + throw new AnalysisException(e.getMessage(), e); + } validateDataType(type.toCatalogDataType()); type = updateCharacterTypeLength(type); if (type.isArrayType()) { diff --git a/regression-test/suites/nereids_p0/create_table/test_create_table.groovy b/regression-test/suites/nereids_p0/create_table/test_create_table.groovy index cb3590b6f0..60a10270c1 100644 --- a/regression-test/suites/nereids_p0/create_table/test_create_table.groovy +++ b/regression-test/suites/nereids_p0/create_table/test_create_table.groovy @@ -42,4 +42,40 @@ suite("nereids_create_table") { for (String t in tables) { qt_sql "select * from ${t} order by id" } + + test { + sql """ + CREATE TABLE region ( + r_regionkey int NOT NULL, + r_name VARCHAR(25) NOT NULL, + `CAST(``o_custkey`` AS BIGINT)` VARCHAR(152) + )ENGINE=OLAP + DUPLICATE KEY(`r_regionkey`) + COMMENT "OLAP" + DISTRIBUTED BY HASH(`r_regionkey`) BUCKETS 1 + PROPERTIES ( + "replication_num" = "1" + ); + """ + + exception "Incorrect column name" + } + + test { + sql """ + CREATE TABLE region ( + r_regionkey int NOT NULL, + r_name VARCHAR(25) NOT NULL, + `mva_invalid` VARCHAR(152) + )ENGINE=OLAP + DUPLICATE KEY(`r_regionkey`) + COMMENT "OLAP" + DISTRIBUTED BY HASH(`r_regionkey`) BUCKETS 1 + PROPERTIES ( + "replication_num" = "1" + ); + """ + + exception "Incorrect column name" + } }