From fb27e3ef31fc56479999e9a41ebe91db48f1ff94 Mon Sep 17 00:00:00 2001 From: Yongqiang YANG <98214048+dataroaring@users.noreply.github.com> Date: Tue, 30 Aug 2022 15:54:37 +0800 Subject: [PATCH] [fix](planner) let OlapScanNode turn off preaggragation when there is a filter on DELETE_SIGN (#12118) We can skip aggregate on replace column, otherwise it would generate wrong result. e.g. a row in UNIQUE is deleted by delte_sign_column, then it would be returned. --- .../apache/doris/planner/OlapScanNode.java | 6 ++- .../data/delete_p0/test_delete_sign_mow.out | 52 +++++++++++++++++++ .../delete_p0/test_delete_sign_unique.out | 52 +++++++++++++++++++ .../suites/delete_p0/test_delete_sign_mow.sql | 32 ++++++++++++ .../delete_p0/test_delete_sign_unique.sql | 32 ++++++++++++ 5 files changed, 173 insertions(+), 1 deletion(-) create mode 100644 regression-test/data/delete_p0/test_delete_sign_mow.out create mode 100644 regression-test/data/delete_p0/test_delete_sign_unique.out create mode 100644 regression-test/suites/delete_p0/test_delete_sign_mow.sql create mode 100644 regression-test/suites/delete_p0/test_delete_sign_unique.sql diff --git a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java index 5b010be574..967895ee4e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java +++ b/fe/fe-core/src/main/java/org/apache/doris/planner/OlapScanNode.java @@ -171,7 +171,8 @@ public class OlapScanNode extends ScanNode { public void setIsPreAggregation(boolean isPreAggregation, String reason) { this.isPreAggregation = isPreAggregation; - this.reasonOfPreAggregation = reason; + this.reasonOfPreAggregation = this.reasonOfPreAggregation == null ? reason : + this.reasonOfPreAggregation + " " + reason; } public boolean isPreAggregation() { @@ -1044,6 +1045,9 @@ public class OlapScanNode extends ScanNode { Expr conjunct = new BinaryPredicate(BinaryPredicate.Operator.EQ, deleteSignSlot, new IntLiteral(0)); conjunct.analyze(analyzer); conjuncts.add(conjunct); + if (!olapTable.getEnableUniqueKeyMergeOnWrite()) { + closePreAggregation(Column.DELETE_SIGN + " is used as conjuncts."); + } } } diff --git a/regression-test/data/delete_p0/test_delete_sign_mow.out b/regression-test/data/delete_p0/test_delete_sign_mow.out new file mode 100644 index 0000000000..fabf3e3e71 --- /dev/null +++ b/regression-test/data/delete_p0/test_delete_sign_mow.out @@ -0,0 +1,52 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !test_delete_sign_mow -- +0 + +-- !test_delete_sign_mow_2 -- +0 + +-- !test_delete_sign_mow_3 -- +1 + +-- !test_delete_sign_mow_4 -- +1 + +-- !test_delete_sign_mow_5 -- +1 + +-- !test_delete_sign_mow_6 -- +1 + +-- !test_delete_sign_mow_7 -- +1 + +-- !test_delete_sign_mow_8 -- +1 + +-- !test_delete_sign_mow_9 -- +1 + +-- !test_delete_sign_mow_10 -- +2 + +-- !test_delete_sign_mow_11 -- +2 + +-- !test_delete_sign_mow_12 -- +1 + +-- !test_delete_sign_mow_13 -- +1 + +-- !test_delete_sign_mow_14 -- +1 + +-- !test_delete_sign_mow_15 -- +1 + +-- !test_delete_sign_mow_16 -- +0 + +-- !test_delete_sign_mow_17 -- +0 + diff --git a/regression-test/data/delete_p0/test_delete_sign_unique.out b/regression-test/data/delete_p0/test_delete_sign_unique.out new file mode 100644 index 0000000000..d62aa995fa --- /dev/null +++ b/regression-test/data/delete_p0/test_delete_sign_unique.out @@ -0,0 +1,52 @@ +-- This file is automatically generated. You should know what you did if you want to edit this +-- !test_delete_sign_unique -- +0 + +-- !test_delete_sign_unique_2 -- +0 + +-- !test_delete_sign_unique_3 -- +1 + +-- !test_delete_sign_unique_4 -- +1 + +-- !test_delete_sign_unique_5 -- +1 + +-- !test_delete_sign_unique_6 -- +1 + +-- !test_delete_sign_unique_7 -- +1 + +-- !test_delete_sign_unique_8 -- +1 + +-- !test_delete_sign_unique_9 -- +1 + +-- !test_delete_sign_unique_10 -- +2 + +-- !test_delete_sign_unique_11 -- +2 + +-- !test_delete_sign_unique_12 -- +1 + +-- !test_delete_sign_unique_13 -- +1 + +-- !test_delete_sign_unique_14 -- +1 + +-- !test_delete_sign_unique_15 -- +1 + +-- !test_delete_sign_unique_16 -- +0 + +-- !test_delete_sign_unique_17 -- +0 + diff --git a/regression-test/suites/delete_p0/test_delete_sign_mow.sql b/regression-test/suites/delete_p0/test_delete_sign_mow.sql new file mode 100644 index 0000000000..a6387bd231 --- /dev/null +++ b/regression-test/suites/delete_p0/test_delete_sign_mow.sql @@ -0,0 +1,32 @@ +DROP TABLE IF EXISTS delete_sign_test_mow; + +CREATE TABLE delete_sign_test_mow ( + `uid` BIGINT NULL, + `v1` BIGINT NULL + ) +UNIQUE KEY(uid) +DISTRIBUTED BY HASH(uid) BUCKETS 3 +PROPERTIES ( + "unique_key_merge_on_write" = "true", + "replication_num" = "1" +); + +insert into delete_sign_test_mow values(1, 1); +select count(uid) from delete_sign_test_mow; +select count(distinct uid) from delete_sign_test_mow; + +insert into delete_sign_test_mow values(1, 1); +select count(uid) from delete_sign_test_mow; +select count(distinct uid) from delete_sign_test_mow; + +insert into delete_sign_test_mow values(2, 1); +select count(uid) from delete_sign_test_mow; +select count(distinct uid) from delete_sign_test_mow; + +insert into delete_sign_test_mow(uid, v1, __DORIS_DELETE_SIGN__) values(1, 1, 1); +select count(uid) from delete_sign_test_mow; +select count(distinct uid) from delete_sign_test_mow; + +insert into delete_sign_test_mow(uid, v1, __DORIS_DELETE_SIGN__) values(2, 1, 1); +select count(uid) from delete_sign_test_mow; +select count(distinct uid) from delete_sign_test_mow; diff --git a/regression-test/suites/delete_p0/test_delete_sign_unique.sql b/regression-test/suites/delete_p0/test_delete_sign_unique.sql new file mode 100644 index 0000000000..3089937b12 --- /dev/null +++ b/regression-test/suites/delete_p0/test_delete_sign_unique.sql @@ -0,0 +1,32 @@ +DROP TABLE IF EXISTS delete_sign_test; + +CREATE TABLE delete_sign_test ( + `uid` BIGINT NULL, + `v1` BIGINT NULL + ) +UNIQUE KEY(uid) +DISTRIBUTED BY HASH(uid) BUCKETS 3 +PROPERTIES ( + "replication_num" = "1" +); + +insert into delete_sign_test values(1, 1); +select count(uid) from delete_sign_test; +select count(distinct uid) from delete_sign_test; + +insert into delete_sign_test values(1, 1); +select count(uid) from delete_sign_test; +select count(distinct uid) from delete_sign_test; + +insert into delete_sign_test values(2, 1); +select count(uid) from delete_sign_test; +select count(distinct uid) from delete_sign_test; + +insert into delete_sign_test(uid, v1, __DORIS_DELETE_SIGN__) values(1, 1, 1); +select count(uid) from delete_sign_test; +select count(distinct uid) from delete_sign_test; + +insert into delete_sign_test(uid, v1, __DORIS_DELETE_SIGN__) values(2, 1, 1); +select count(uid) from delete_sign_test; +select count(distinct uid) from delete_sign_test; +