[fix](Nereids) Disable preagg when there is DELETE_SIGN filter (#17157)
1. disable preAgg when there is delete sign when binding relation 2. keep the preAgg status in SelectMaterializeIndex rule
This commit is contained in:
@ -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;
|
||||
|
||||
@ -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.
|
||||
|
||||
@ -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, C> R accept(PlanVisitor<R, C> visitor, C context) {
|
||||
return visitor.visitLogicalOlapScan(this, context);
|
||||
|
||||
52
regression-test/data/nereids_p0/test_delete_sign_mow.out
Normal file
52
regression-test/data/nereids_p0/test_delete_sign_mow.out
Normal file
@ -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
|
||||
|
||||
32
regression-test/suites/nereids_p0/test_delete_sign_mow.sql
Normal file
32
regression-test/suites/nereids_p0/test_delete_sign_mow.sql
Normal file
@ -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;
|
||||
Reference in New Issue
Block a user