This is an automated email from the ASF dual-hosted git repository. yiguolei pushed a commit to branch branch-2.1 in repository https://gitbox.apache.org/repos/asf/doris.git
commit ad111be2d1a2466bb7a2191766bca97ba29015b8 Author: Calvin Kirs <acm_mas...@163.com> AuthorDate: Fri Jan 19 09:51:34 2024 +0800 [Fix](Show-Delete)Missing Delete job information causes query exception (#30092) --- .../java/org/apache/doris/load/DeleteInfo.java | 16 +++--- .../main/java/org/apache/doris/load/DeleteJob.java | 6 +- .../suites/show_p0/test_show_delete.groovy | 67 ++++++++++++++++++++++ 3 files changed, 80 insertions(+), 9 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/DeleteInfo.java b/fe/fe-core/src/main/java/org/apache/doris/load/DeleteInfo.java index 05c6c4b1a86..89114d5beed 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/load/DeleteInfo.java +++ b/fe/fe-core/src/main/java/org/apache/doris/load/DeleteInfo.java @@ -60,12 +60,19 @@ public class DeleteInfo implements Writable, GsonPostProcessable { @SerializedName(value = "partitionName") private String partitionName; - public DeleteInfo(long dbId, long tableId, String tableName, List<String> deleteConditions) { + public DeleteInfo(long dbId, long tableId, String tableName, List<String> deleteConditions, + boolean noPartitionSpecified, List<Long> partitionIds, List<String> partitionNames) { this.dbId = dbId; this.tableId = tableId; this.tableName = tableName; this.deleteConditions = deleteConditions; this.createTimeMs = System.currentTimeMillis(); + this.noPartitionSpecified = noPartitionSpecified; + if (!noPartitionSpecified) { + Preconditions.checkState(partitionIds.size() == partitionNames.size()); + this.partitionIds = partitionIds; + this.partitionNames = partitionNames; + } } public long getDbId() { @@ -92,13 +99,6 @@ public class DeleteInfo implements Writable, GsonPostProcessable { return noPartitionSpecified; } - public void setPartitions(boolean noPartitionSpecified, List<Long> partitionIds, List<String> partitionNames) { - this.noPartitionSpecified = noPartitionSpecified; - Preconditions.checkState(partitionIds.size() == partitionNames.size()); - this.partitionIds = partitionIds; - this.partitionNames = partitionNames; - } - public List<Long> getPartitionIds() { return partitionIds; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/DeleteJob.java b/fe/fe-core/src/main/java/org/apache/doris/load/DeleteJob.java index 5bb07dd7b68..a764b42773b 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/load/DeleteJob.java +++ b/fe/fe-core/src/main/java/org/apache/doris/load/DeleteJob.java @@ -490,6 +490,7 @@ public class DeleteJob extends AbstractTxnStateChangeCallback implements DeleteJ public static class Builder { public DeleteJob buildWith(BuildParams params) throws Exception { + boolean noPartitionSpecified = params.getPartitionNames().isEmpty(); List<Partition> partitions = getSelectedPartitions(params.getTable(), params.getPartitionNames(), params.getDeleteConditions()); Map<Long, Short> partitionReplicaNum = partitions.stream() @@ -504,8 +505,11 @@ public class DeleteJob extends AbstractTxnStateChangeCallback implements DeleteJ String label = DELETE_PREFIX + UUID.randomUUID(); //generate jobId long jobId = Env.getCurrentEnv().getNextId(); + List<String> partitionNames = partitions.stream().map(Partition::getName).collect(Collectors.toList()); + List<Long> partitionIds = partitions.stream().map(Partition::getId).collect(Collectors.toList()); DeleteInfo deleteInfo = new DeleteInfo(params.getDb().getId(), params.getTable().getId(), - params.getTable().getName(), getDeleteCondString(params.getDeleteConditions())); + params.getTable().getName(), getDeleteCondString(params.getDeleteConditions()), + noPartitionSpecified, partitionIds, partitionNames); DeleteJob deleteJob = new DeleteJob(jobId, -1, label, partitionReplicaNum, deleteInfo); long replicaNum = partitions.stream().mapToLong(Partition::getAllReplicaCount).sum(); deleteJob.setPartitions(partitions); diff --git a/regression-test/suites/show_p0/test_show_delete.groovy b/regression-test/suites/show_p0/test_show_delete.groovy new file mode 100644 index 00000000000..bc0c0c561ef --- /dev/null +++ b/regression-test/suites/show_p0/test_show_delete.groovy @@ -0,0 +1,67 @@ +// 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_show_delete") { + def tableName = "test_show_delete_table" + sql """drop table if exists ${tableName}""" + + sql """ + CREATE TABLE IF NOT EXISTS ${tableName} + ( + `datetime` DATE NOT NULL COMMENT "['0000-01-01', '9999-12-31']", + `type` TINYINT NOT NULL COMMENT "[-128, 127]", + `user_id` decimal(9,3) COMMENT "[-9223372036854775808, 9223372036854775807]" + ) + UNIQUE KEY(`datetime`) + PARTITION BY RANGE(`datetime`) + ( + PARTITION `Feb` VALUES LESS THAN ("2022-03-01"), + PARTITION `Mar` VALUES LESS THAN ("2022-04-01") + ) + DISTRIBUTED BY HASH(`datetime`) BUCKETS 1 + PROPERTIES ( + "replication_allocation" = "tag.location.default: 1" + ); + """ + + sql """insert into ${tableName} values ('2022-02-01', 1, 1.1), ('2022-03-01', 2, 2.2)""" + + sql """ set delete_without_partition = true""" + // don't care nereids planner + sql """ delete from ${tableName} PARTITION Mar where type ='2'""" + sql """ delete from ${tableName} where type ='1'""" + def showDeleteResult = sql """ show delete""" + //When we test locally, multiple history results will be included, so size will be >= 2 + assert showDeleteResult.size() >= 2 + def count = 0 + showDeleteResult.each { row -> + + if (row[3] == 'type EQ "2"') { + assert row[1] == 'Mar' + count++ + return + } + if (row[3] == 'type EQ "1"') { + assert row[1] == '*' + count++ + return + } + + } + assert count == showDeleteResult.size() + +} \ No newline at end of file --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org