This is an automated email from the ASF dual-hosted git repository.
zhangstar333 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new c4e61fb52c1 [Enhancement](ctas) Support create auto range partition
table with CTAS command (#48931)
c4e61fb52c1 is described below
commit c4e61fb52c1175d3dd35d380a8eb55294d099564
Author: zclllyybb <[email protected]>
AuthorDate: Tue Mar 25 10:20:10 2025 +0800
[Enhancement](ctas) Support create auto range partition table with CTAS
command (#48931)
### What problem does this PR solve?
Support create auto range partition table with CTAS command
---
.../trees/plans/commands/CreateTableCommand.java | 25 +++++-
.../plans/commands/info/PartitionTableInfo.java | 5 ++
.../create_table/test_ctas_auto_partition.groovy | 94 ++++++++++++++++++++++
3 files changed, 122 insertions(+), 2 deletions(-)
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 865ce6e243a..f76d272aded 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
@@ -109,6 +109,7 @@ public class CreateTableCommand extends Command implements
NeedAuditEncryption,
if (slots.size() != ctasCols.size()) {
throw new AnalysisException("ctas column size is not equal to the
query's");
}
+ String autoRangePartitionName = getAutoRangePartitionNameOrNull();
ImmutableList.Builder<ColumnDefinition> columnsOfQuery =
ImmutableList.builder();
for (int i = 0; i < slots.size(); i++) {
Slot s = slots.get(i);
@@ -154,8 +155,14 @@ public class CreateTableCommand extends Command implements
NeedAuditEncryption,
}
}
}
- // if the column is an expression, we set it to nullable,
otherwise according to the nullable of the slot.
- columnsOfQuery.add(new ColumnDefinition(s.getName(), dataType,
!s.isColumnFromTable() || s.nullable()));
+ if (autoRangePartitionName != null &&
autoRangePartitionName.equalsIgnoreCase(s.getName())) {
+ // for auto range partition column, it must be not nullable.
so keep its origin.
+ columnsOfQuery.add(new ColumnDefinition(s.getName(), dataType,
s.nullable()));
+ } else {
+ // if the column is an expression, we set it to nullable,
otherwise according to the nullable of the
+ // slot.
+ columnsOfQuery.add(new ColumnDefinition(s.getName(), dataType,
!s.isColumnFromTable() || s.nullable()));
+ }
}
List<String> qualifierTableName = RelationUtil.getQualifierName(ctx,
createTableInfo.getTableNameParts());
createTableInfo.validateCreateTableAsSelect(qualifierTableName,
columnsOfQuery.build(), ctx);
@@ -199,6 +206,20 @@ public class CreateTableCommand extends Command implements
NeedAuditEncryption,
}
}
+ private String getAutoRangePartitionNameOrNull() {
+ try {
+ if (createTableInfo.getPartitionTableInfo().isAutoPartition()
+ &&
createTableInfo.getPartitionTableInfo().getPartitionType().equalsIgnoreCase("RANGE"))
{
+ // should collect first before use them.
+
createTableInfo.getPartitionTableInfo().extractPartitionColumns();
+ return
createTableInfo.getPartitionTableInfo().getIdentifierPartitionColumns().get(0);
+ }
+ } catch (Exception e) {
+ return null;
+ }
+ return null;
+ }
+
public boolean isCtasCommand() {
return ctasQuery.isPresent();
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/PartitionTableInfo.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/PartitionTableInfo.java
index 7d85d24f6cb..48002bdfb65 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/PartitionTableInfo.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/info/PartitionTableInfo.java
@@ -329,6 +329,7 @@ public class PartitionTableInfo {
try {
identifierPartitionColumns =
PartitionDesc.getColNamesFromExpr(exprs,
partitionType.equalsIgnoreCase(PartitionType.LIST.name()),
isAutoPartition);
+ // check of it will be done in validatePartitionInfo later.
} catch (Exception e) {
throw new AnalysisException(e.getMessage(), e.getCause());
}
@@ -337,4 +338,8 @@ public class PartitionTableInfo {
public boolean inIdentifierPartitions(String columnName) {
return identifierPartitionColumns != null &&
identifierPartitionColumns.contains(columnName);
}
+
+ public List<String> getIdentifierPartitionColumns() {
+ return identifierPartitionColumns;
+ }
}
diff --git
a/regression-test/suites/nereids_p0/create_table/test_ctas_auto_partition.groovy
b/regression-test/suites/nereids_p0/create_table/test_ctas_auto_partition.groovy
new file mode 100644
index 00000000000..67367159c60
--- /dev/null
+++
b/regression-test/suites/nereids_p0/create_table/test_ctas_auto_partition.groovy
@@ -0,0 +1,94 @@
+// 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.
+
+suite("test_ctas_auto_partition") {
+ sql "drop table if exists test_partition__dbt_tmp3"
+ test {
+ sql """
+ create table `test_partition__dbt_tmp3`
+ AUTO PARTITION BY RANGE (date_trunc(`today`, 'day')) ()
+ PROPERTIES ("replication_num" = "1" )
+ as
+ select nullable(current_date()) as today;
+ """
+ exception "AUTO RANGE PARTITION doesn't support NULL column"
+ }
+
+ test {
+ sql """
+ create table `test_partition__dbt_tmp3`
+ AUTO PARTITION BY RANGE (date_trunc(`today`, 'day')) ()
+ PROPERTIES ("replication_num" = "1" )
+ as
+ select cast(null as date) as today;
+ """
+ exception "AUTO RANGE PARTITION doesn't support NULL column"
+ }
+
+ test {
+ sql """
+ create table `test_partition__dbt_tmp3`
+ AUTO PARTITION BY RANGE (date_trunc(`today`, 'day')) ()
+ PROPERTIES ("replication_num" = "1" )
+ as
+ select 1 as today;
+ """
+ exception "partition expr date_trunc is illegal!"
+ }
+
+ test{
+ sql """
+ create table `test_partition__dbt_tmp3`
+ AUTO PARTITION BY RANGE (date_trunc(`today`, 'day'),
date_trunc(`today1`, 'day')) ()
+ PROPERTIES ("replication_num" = "1" )
+ as
+ select 1 as today;
+ """
+ exception "auto create partition only support one slotRef in function
expr"
+ }
+
+ test{
+ sql """
+ create table `test_partition__dbt_tmp3`
+ AUTO PARTITION BY RANGE (date_trunc(`today`, 'day')) ()
+ PROPERTIES ("replication_num" = "1" )
+ as
+ select current_date() as today, current_date() + 1 as today;
+ """
+ exception "Duplicate column name 'today'"
+ }
+
+ test{
+ sql """
+ create table `test_partition__dbt_tmp3`
+ AUTO PARTITION BY RANGE (date_trunc(`today`, 'day')) ()
+ PROPERTIES ("replication_num" = "1" )
+ as
+ select current_date() as today2, current_date() + 1 as today1;
+ """
+ exception "partition key today is not exists"
+ }
+
+ sql """
+ create table `test_partition__dbt_tmp3`
+ AUTO PARTITION BY RANGE (date_trunc(`today`, 'day')) ()
+ PROPERTIES ("replication_num" = "1" )
+ as
+ select 1 as id, 'cyril' as name, 18 as age, 100 as score,
current_date() as today;
+ """
+ assertEquals((sql "select count() from test_partition__dbt_tmp3")[0][0], 1)
+}
\ No newline at end of file
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]