diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java index b30cd4ad5c..d41c6e4c9c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java @@ -44,6 +44,7 @@ import org.apache.doris.nereids.trees.expressions.Expression; import org.apache.doris.nereids.trees.expressions.Slot; import org.apache.doris.nereids.trees.expressions.literal.TinyIntLiteral; import org.apache.doris.nereids.trees.plans.Plan; +import org.apache.doris.nereids.trees.plans.PreAggStatus; import org.apache.doris.nereids.trees.plans.logical.LogicalFileScan; import org.apache.doris.nereids.trees.plans.logical.LogicalFilter; import org.apache.doris.nereids.trees.plans.logical.LogicalJdbcScan; @@ -194,6 +195,10 @@ public class BindRelation extends OneAnalysisRuleFactory { } Preconditions.checkArgument(deleteSlot != null); Expression conjunct = new EqualTo(new TinyIntLiteral((byte) 0), deleteSlot); + if (!((OlapTable) table).getEnableUniqueKeyMergeOnWrite()) { + scan = scan.withPreAggStatus(PreAggStatus.off( + Column.DELETE_SIGN + " is used as conjuncts.")); + } return new LogicalFilter(Sets.newHashSet(conjunct), scan); } return scan; diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/mv/SelectMaterializedIndexWithAggregate.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/mv/SelectMaterializedIndexWithAggregate.java index 1a486c7161..fb9cf07636 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/mv/SelectMaterializedIndexWithAggregate.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/mv/SelectMaterializedIndexWithAggregate.java @@ -549,6 +549,10 @@ public class SelectMaterializedIndexWithAggregate extends AbstractSelectMaterial return new SelectResult(PreAggStatus.on(), selectIndexId, rewriteResultOpt.map(r -> r.exprRewriteMap).orElse(new ExprRewriteMap())); } else { + if (scan.getPreAggStatus().isOff()) { + return new SelectResult(scan.getPreAggStatus(), + scan.getTable().getBaseIndexId(), new ExprRewriteMap()); + } final PreAggStatus preAggStatus; if (preAggEnabledByHint(scan)) { // PreAggStatus could be enabled by pre-aggregation hint for agg-keys and unique-keys. diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapScan.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapScan.java index 3d6a9f7363..5e38b6082c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapScan.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/logical/LogicalOlapScan.java @@ -246,6 +246,12 @@ public class LogicalOlapScan extends LogicalRelation implements CatalogRelation, selectedIndexId, indexSelected, preAggStatus, manuallySpecifiedPartitions, hints); } + public LogicalOlapScan withPreAggStatus(PreAggStatus preAggStatus) { + return new LogicalOlapScan(id, (Table) table, qualifier, Optional.empty(), Optional.of(getLogicalProperties()), + selectedPartitionIds, partitionPruned, selectedTabletIds, true, + selectedIndexId, indexSelected, preAggStatus, manuallySpecifiedPartitions, hints); + } + @Override public R accept(PlanVisitor visitor, C context) { return visitor.visitLogicalOlapScan(this, context); diff --git a/regression-test/data/nereids_p0/test_delete_sign_mow.out b/regression-test/data/nereids_p0/test_delete_sign_mow.out new file mode 100644 index 0000000000..fabf3e3e71 --- /dev/null +++ b/regression-test/data/nereids_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/suites/nereids_p0/test_delete_sign_mow.sql b/regression-test/suites/nereids_p0/test_delete_sign_mow.sql new file mode 100644 index 0000000000..7a64c9001d --- /dev/null +++ b/regression-test/suites/nereids_p0/test_delete_sign_mow.sql @@ -0,0 +1,32 @@ +DROP TABLE IF EXISTS delete_sign_test_mow; + +CREATE TABLE IF NOT EXISTS 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;