diff --git a/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java b/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java index 8b56fefcd1d4a0..f90b015d763b70 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java +++ b/fe/fe-core/src/main/java/org/apache/doris/catalog/OlapTable.java @@ -101,6 +101,7 @@ import com.google.gson.annotations.SerializedName; import lombok.Getter; import lombok.Setter; +import org.apache.commons.collections.CollectionUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -3072,8 +3073,10 @@ public AutoIncrementGenerator getAutoIncrementGenerator() { * @param selectedIndexId the index want to scan */ public TFetchOption generateTwoPhaseReadOption(long selectedIndexId) { + boolean useStoreRow = this.storeRowColumn() + && CollectionUtils.isEmpty(getTableProperty().getCopiedRowStoreColumns()); TFetchOption fetchOption = new TFetchOption(); - fetchOption.setFetchRowStore(this.storeRowColumn()); + fetchOption.setFetchRowStore(useStoreRow); fetchOption.setUseTwoPhaseFetch(true); // get backend by tag @@ -3094,7 +3097,7 @@ public TFetchOption generateTwoPhaseReadOption(long selectedIndexId) { fetchOption.setNodesInfo(nodesInfo); - if (!this.storeRowColumn()) { + if (!useStoreRow) { List columnsDesc = Lists.newArrayList(); getColumnDesc(selectedIndexId, columnsDesc, null, null); fetchOption.setColumnDesc(columnsDesc); diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java index b439dbdc12dabf..e8ca437b2cacb4 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/glue/translator/PhysicalPlanTranslator.java @@ -1916,7 +1916,13 @@ public PlanFragment visitPhysicalProject(PhysicalProject project List allProjectionExprs = Lists.newArrayList(); List slots = null; // TODO FE/BE do not support multi-layer-project on MultiDataSink now. - if (project.hasMultiLayerProjection() && !(inputFragment instanceof MultiCastPlanFragment)) { + if (project.hasMultiLayerProjection() + && !(inputFragment instanceof MultiCastPlanFragment) + // TODO support for two phase read with project, remove it after refactor + && !(project.child() instanceof PhysicalDeferMaterializeTopN) + && !(project.child() instanceof PhysicalDeferMaterializeOlapScan + || (project.child() instanceof PhysicalFilter + && ((PhysicalFilter) project.child()).child() instanceof PhysicalDeferMaterializeOlapScan))) { int layerCount = project.getMultiLayerProjects().size(); for (int i = 0; i < layerCount; i++) { List layer = project.getMultiLayerProjects().get(i); @@ -2024,37 +2030,28 @@ public PlanFragment visitPhysicalProject(PhysicalProject project } if (inputPlanNode instanceof ScanNode) { - TupleDescriptor projectionTuple = null; - // slotIdsByOrder is used to ensure the ScanNode's output order is same with current Project - // if we change the output order in translate project, the upper node will receive wrong order - // tuple, since they get the order from project.getOutput() not scan.getOutput()./ - projectionTuple = generateTupleDesc(slots, - ((ScanNode) inputPlanNode).getTupleDesc().getTable(), context); - inputPlanNode.setProjectList(projectionExprs); - inputPlanNode.setOutputTupleDesc(projectionTuple); - - // TODO: this is a temporary scheme to support two phase read when has project. - // we need to refactor all topn opt into rbo stage. + // TODO support for two phase read with project, remove this if after refactor + if (!(project.child() instanceof PhysicalDeferMaterializeOlapScan + || (project.child() instanceof PhysicalFilter + && ((PhysicalFilter) project.child()).child() instanceof PhysicalDeferMaterializeOlapScan))) { + TupleDescriptor projectionTuple = generateTupleDesc(slots, + ((ScanNode) inputPlanNode).getTupleDesc().getTable(), context); + inputPlanNode.setProjectList(projectionExprs); + inputPlanNode.setOutputTupleDesc(projectionTuple); + } if (inputPlanNode instanceof OlapScanNode) { - ArrayList olapScanSlots = - context.getTupleDesc(inputPlanNode.getTupleIds().get(0)).getSlots(); - SlotDescriptor lastSlot = olapScanSlots.get(olapScanSlots.size() - 1); - if (lastSlot.getColumn() != null - && lastSlot.getColumn().getName().equals(Column.ROWID_COL)) { - injectRowIdColumnSlot(projectionTuple); - SlotRef slotRef = new SlotRef(lastSlot); - inputPlanNode.getProjectList().add(slotRef); - requiredByProjectSlotIdSet.add(lastSlot.getId()); - requiredSlotIdSet.add(lastSlot.getId()); - } ((OlapScanNode) inputPlanNode).updateRequiredSlots(context, requiredByProjectSlotIdSet); } updateScanSlotsMaterialization((ScanNode) inputPlanNode, requiredSlotIdSet, requiredByProjectSlotIdSet, context); } else { - TupleDescriptor tupleDescriptor = generateTupleDesc(slots, null, context); - inputPlanNode.setProjectList(projectionExprs); - inputPlanNode.setOutputTupleDesc(tupleDescriptor); + if (project.child() instanceof PhysicalDeferMaterializeTopN) { + inputFragment.setOutputExprs(projectionExprs); + } else { + TupleDescriptor tupleDescriptor = generateTupleDesc(slots, null, context); + inputPlanNode.setProjectList(projectionExprs); + inputPlanNode.setOutputTupleDesc(tupleDescriptor); + } } return inputFragment; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/DeferMaterializeTopNResult.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/DeferMaterializeTopNResult.java index 6d90d81349d08f..581949886e324d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/DeferMaterializeTopNResult.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/rewrite/DeferMaterializeTopNResult.java @@ -33,6 +33,7 @@ import org.apache.doris.nereids.trees.plans.logical.LogicalDeferMaterializeTopN; import org.apache.doris.nereids.trees.plans.logical.LogicalFilter; import org.apache.doris.nereids.trees.plans.logical.LogicalOlapScan; +import org.apache.doris.nereids.trees.plans.logical.LogicalProject; import org.apache.doris.nereids.trees.plans.logical.LogicalResultSink; import org.apache.doris.nereids.trees.plans.logical.LogicalTopN; import org.apache.doris.qe.ConnectContext; @@ -44,6 +45,7 @@ import java.util.Objects; import java.util.Optional; import java.util.Set; +import java.util.stream.Collectors; /** * rewrite simple top n query to defer materialize slot not use for sort or predicate @@ -54,51 +56,155 @@ public class DeferMaterializeTopNResult implements RewriteRuleFactory { public List buildRules() { return ImmutableList.of( RuleType.DEFER_MATERIALIZE_TOP_N_RESULT.build( - logicalResultSink(logicalTopN(logicalOlapScan())) - .when(r -> r.child().getLimit() < getTopNOptLimitThreshold()) - .whenNot(r -> r.child().getOrderKeys().isEmpty()) - .when(r -> r.child().getOrderKeys().stream().map(OrderKey::getExpr) - .allMatch(Expression::isColumnFromTable)) - .when(r -> r.child().child().getTable().getEnableLightSchemaChange()) - .when(r -> r.child().child().getTable().isDupKeysOrMergeOnWrite()) - .then(r -> deferMaterialize(r, r.child(), Optional.empty(), r.child().child())) + logicalResultSink( + logicalTopN( + logicalOlapScan() + .when(s -> s.getTable().getEnableLightSchemaChange()) + .when(s -> s.getTable().isDupKeysOrMergeOnWrite()) + ).when(t -> t.getLimit() < getTopNOptLimitThreshold()) + .whenNot(t -> t.getOrderKeys().isEmpty()) + .when(t -> t.getOrderKeys().stream() + .map(OrderKey::getExpr) + .allMatch(Expression::isColumnFromTable)) + ).then(r -> deferMaterialize(r, r.child(), + Optional.empty(), Optional.empty(), r.child().child())) ), RuleType.DEFER_MATERIALIZE_TOP_N_RESULT.build( - logicalResultSink(logicalTopN(logicalFilter(logicalOlapScan()))) - .when(r -> r.child().getLimit() < getTopNOptLimitThreshold()) - .whenNot(r -> r.child().getOrderKeys().isEmpty()) - .when(r -> r.child().getOrderKeys().stream().map(OrderKey::getExpr) - .allMatch(Expression::isColumnFromTable)) - .when(r -> r.child().child().child().getTable().getEnableLightSchemaChange()) - .when(r -> r.child().child().child().getTable().isDupKeysOrMergeOnWrite()) - .then(r -> { - LogicalFilter filter = r.child().child(); - return deferMaterialize(r, r.child(), Optional.of(filter), filter.child()); - }) + logicalResultSink( + logicalTopN( + logicalFilter( + logicalOlapScan() + .when(s -> s.getTable().getEnableLightSchemaChange()) + .when(s -> s.getTable().isDupKeysOrMergeOnWrite()) + ) + ).when(t -> t.getLimit() < getTopNOptLimitThreshold()) + .whenNot(t -> t.getOrderKeys().isEmpty()) + .when(t -> t.getOrderKeys().stream() + .map(OrderKey::getExpr) + .allMatch(Expression::isColumnFromTable)) + ).then(r -> { + LogicalFilter filter = r.child().child(); + return deferMaterialize(r, r.child(), Optional.empty(), + Optional.of(filter), filter.child()); + }) + ), + RuleType.DEFER_MATERIALIZE_TOP_N_RESULT.build( + logicalResultSink( + logicalTopN( + logicalProject( + logicalFilter( + logicalOlapScan() + .when(s -> s.getTable().getEnableLightSchemaChange()) + .when(s -> s.getTable().isDupKeysOrMergeOnWrite()) + ) + ) + ).when(t -> t.getLimit() < getTopNOptLimitThreshold()) + .whenNot(t -> t.getOrderKeys().isEmpty()) + .when(t -> { + for (OrderKey orderKey : t.getOrderKeys()) { + if (!orderKey.getExpr().isColumnFromTable()) { + return false; + } + if (!(orderKey.getExpr() instanceof SlotReference)) { + return false; + } + SlotReference slotRef = (SlotReference) orderKey.getExpr(); + // do not support alias in project now + if (!t.child().getProjects().contains(slotRef)) { + return false; + } + } + return true; + }) + ).then(r -> { + LogicalProject> project = r.child().child(); + LogicalFilter filter = project.child(); + return deferMaterialize(r, r.child(), Optional.of(project), + Optional.of(filter), filter.child()); + }) + ), + RuleType.DEFER_MATERIALIZE_TOP_N_RESULT.build( + logicalResultSink(logicalProject( + logicalTopN( + logicalProject(logicalFilter( + logicalOlapScan() + .when(s -> s.getTable().getEnableLightSchemaChange()) + .when(s -> s.getTable().isDupKeysOrMergeOnWrite()) + ) + ) + ).when(t -> t.getLimit() < getTopNOptLimitThreshold()) + .whenNot(t -> t.getOrderKeys().isEmpty()) + .when(t -> { + for (OrderKey orderKey : t.getOrderKeys()) { + if (!orderKey.getExpr().isColumnFromTable()) { + return false; + } + if (!(orderKey.getExpr() instanceof SlotReference)) { + return false; + } + SlotReference slotRef = (SlotReference) orderKey.getExpr(); + // do not support alias in project now + if (!t.child().getProjects().contains(slotRef)) { + return false; + } + } + return true; + }) + )).then(r -> { + LogicalProject upperProject = r.child(); + LogicalProject> bottomProject = r.child().child().child(); + List projections = upperProject.mergeProjections(bottomProject); + LogicalProject project = upperProject.withProjects(projections); + LogicalFilter filter = bottomProject.child(); + return deferMaterialize(r, r.child().child(), Optional.of(project), + Optional.of(filter), filter.child()); + }) ) ); } private Plan deferMaterialize(LogicalResultSink logicalResultSink, - LogicalTopN logicalTopN, Optional> logicalFilter, - LogicalOlapScan logicalOlapScan) { + LogicalTopN logicalTopN, Optional> logicalProject, + Optional> logicalFilter, LogicalOlapScan logicalOlapScan) { Column rowId = new Column(Column.ROWID_COL, Type.STRING, false, null, false, "", "rowid column"); SlotReference columnId = SlotReference.fromColumn( logicalOlapScan.getTable(), rowId, logicalOlapScan.getQualifier()); + Set orderKeys = Sets.newHashSet(); Set deferredMaterializedExprIds = Sets.newHashSet(logicalOlapScan.getOutputExprIdSet()); logicalFilter.ifPresent(filter -> filter.getConjuncts() .forEach(e -> deferredMaterializedExprIds.removeAll(e.getInputSlotExprIds()))); logicalTopN.getOrderKeys().stream() .map(OrderKey::getExpr) .map(Slot.class::cast) + .peek(orderKeys::add) .map(NamedExpression::getExprId) .filter(Objects::nonNull) .forEach(deferredMaterializedExprIds::remove); + if (logicalProject.isPresent()) { + deferredMaterializedExprIds.retainAll(logicalProject.get().getInputSlots().stream() + .map(NamedExpression::getExprId).collect(Collectors.toSet())); + } LogicalDeferMaterializeOlapScan deferOlapScan = new LogicalDeferMaterializeOlapScan( logicalOlapScan, deferredMaterializedExprIds, columnId); Plan root = logicalFilter.map(f -> f.withChildren(deferOlapScan)).orElse(deferOlapScan); + Set inputSlots = Sets.newHashSet(); + logicalFilter.ifPresent(filter -> inputSlots.addAll(filter.getInputSlots())); + if (logicalProject.isPresent()) { + ImmutableList.Builder requiredSlots = ImmutableList.builder(); + inputSlots.addAll(logicalProject.get().getInputSlots()); + for (Slot output : root.getOutput()) { + if (inputSlots.contains(output) || orderKeys.contains(output)) { + requiredSlots.add(output); + } + } + requiredSlots.add(columnId); + root = new LogicalProject<>(requiredSlots.build(), root); + } root = new LogicalDeferMaterializeTopN<>((LogicalTopN) logicalTopN.withChildren(root), deferredMaterializedExprIds, columnId); + if (logicalProject.isPresent()) { + root = logicalProject.get().withChildren(root); + } root = logicalResultSink.withChildren(root); return new LogicalDeferMaterializeResultSink<>((LogicalResultSink) root, logicalOlapScan.getTable(), logicalOlapScan.getSelectedIndexId()); diff --git a/regression-test/data/nereids_rules_p0/limit_push_down/order_push_down.out b/regression-test/data/nereids_rules_p0/limit_push_down/order_push_down.out index 694e609eaeb2af..980ad322519564 100644 --- a/regression-test/data/nereids_rules_p0/limit_push_down/order_push_down.out +++ b/regression-test/data/nereids_rules_p0/limit_push_down/order_push_down.out @@ -195,18 +195,18 @@ PhysicalResultSink ----------PhysicalOlapScan[t1] -- !limit_sort_filter -- -PhysicalResultSink ---PhysicalTopN[MERGE_SORT] -----PhysicalTopN[LOCAL_SORT] +PhysicalDeferMaterializeResultSink +--PhysicalDeferMaterializeTopN +----PhysicalDeferMaterializeTopN ------filter((t1.id = 1)) ---------PhysicalOlapScan[t1] +--------PhysicalDeferMaterializeOlapScan[t1] -- !limit_offset_sort_filter -- -PhysicalResultSink ---PhysicalTopN[MERGE_SORT] -----PhysicalTopN[LOCAL_SORT] +PhysicalDeferMaterializeResultSink +--PhysicalDeferMaterializeTopN +----PhysicalDeferMaterializeTopN ------filter((t1.id = 1)) ---------PhysicalOlapScan[t1] +--------PhysicalDeferMaterializeOlapScan[t1] -- !limit_subquery_order_by_inside_limit_outside -- PhysicalResultSink @@ -275,25 +275,25 @@ PhysicalResultSink ----------PhysicalOlapScan[t1] -- !limit_filter -- -PhysicalResultSink ---PhysicalTopN[MERGE_SORT] -----PhysicalTopN[LOCAL_SORT] +PhysicalDeferMaterializeResultSink +--PhysicalDeferMaterializeTopN +----PhysicalDeferMaterializeTopN ------filter((t1.id = 1)) ---------PhysicalOlapScan[t1] +--------PhysicalDeferMaterializeOlapScan[t1] -- !limit_offset_filter -- -PhysicalResultSink ---PhysicalTopN[MERGE_SORT] -----PhysicalTopN[LOCAL_SORT] +PhysicalDeferMaterializeResultSink +--PhysicalDeferMaterializeTopN +----PhysicalDeferMaterializeTopN ------filter((t1.id = 1)) ---------PhysicalOlapScan[t1] +--------PhysicalDeferMaterializeOlapScan[t1] -- !limit_project_filter -- -PhysicalResultSink ---PhysicalTopN[MERGE_SORT] -----PhysicalTopN[LOCAL_SORT] +PhysicalDeferMaterializeResultSink +--PhysicalDeferMaterializeTopN +----PhysicalDeferMaterializeTopN ------filter((t1.id > 100)) ---------PhysicalOlapScan[t1] +--------PhysicalDeferMaterializeOlapScan[t1] -- !limit_join_filter -- PhysicalResultSink @@ -312,11 +312,11 @@ PhysicalResultSink ------PhysicalOlapScan[t1] -- !limit_subquery_filter -- -PhysicalResultSink ---PhysicalTopN[MERGE_SORT] -----PhysicalTopN[LOCAL_SORT] +PhysicalDeferMaterializeResultSink +--PhysicalDeferMaterializeTopN +----PhysicalDeferMaterializeTopN ------filter((t1.id > 100)) ---------PhysicalOlapScan[t1] +--------PhysicalDeferMaterializeOlapScan[t1] -- !limit_subquery_join -- PhysicalResultSink @@ -530,11 +530,11 @@ PhysicalCteAnchor ( cteId=CTEId#0 ) ------------PhysicalCteConsumer ( cteId=CTEId#0 ) -- !limit_project_filter -- -PhysicalResultSink ---PhysicalTopN[MERGE_SORT] -----PhysicalTopN[LOCAL_SORT] +PhysicalDeferMaterializeResultSink +--PhysicalDeferMaterializeTopN +----PhysicalDeferMaterializeTopN ------filter((t1.id > 100)) ---------PhysicalOlapScan[t1] +--------PhysicalDeferMaterializeOlapScan[t1] -- !limit_join_filter -- PhysicalResultSink diff --git a/regression-test/data/shape_check/clickbench/query25.out b/regression-test/data/shape_check/clickbench/query25.out index 271149db672442..78b0a5dc31e775 100644 --- a/regression-test/data/shape_check/clickbench/query25.out +++ b/regression-test/data/shape_check/clickbench/query25.out @@ -1,11 +1,11 @@ -- This file is automatically generated. You should know what you did if you want to edit this -- !ckbench_shape_25 -- -PhysicalResultSink +PhysicalDeferMaterializeResultSink --PhysicalProject -----PhysicalTopN[MERGE_SORT] +----PhysicalDeferMaterializeTopN ------PhysicalDistribute[DistributionSpecGather] ---------PhysicalTopN[LOCAL_SORT] +--------PhysicalDeferMaterializeTopN ----------PhysicalProject ------------filter(( not (SearchPhrase = ''))) ---------------PhysicalOlapScan[hits] +--------------PhysicalDeferMaterializeOlapScan[hits] diff --git a/regression-test/data/shape_check/clickbench/query26.out b/regression-test/data/shape_check/clickbench/query26.out index 7317f810a3bb23..cffc4f6f3a0a07 100644 --- a/regression-test/data/shape_check/clickbench/query26.out +++ b/regression-test/data/shape_check/clickbench/query26.out @@ -1,10 +1,10 @@ -- This file is automatically generated. You should know what you did if you want to edit this -- !ckbench_shape_26 -- -PhysicalResultSink ---PhysicalTopN[MERGE_SORT] +PhysicalDeferMaterializeResultSink +--PhysicalDeferMaterializeTopN ----PhysicalDistribute[DistributionSpecGather] -------PhysicalTopN[LOCAL_SORT] +------PhysicalDeferMaterializeTopN --------PhysicalProject ----------filter(( not (SearchPhrase = ''))) -------------PhysicalOlapScan[hits] +------------PhysicalDeferMaterializeOlapScan[hits] diff --git a/regression-test/data/shape_check/clickbench/query27.out b/regression-test/data/shape_check/clickbench/query27.out index 1dbae1e0dc1a8c..04915875350201 100644 --- a/regression-test/data/shape_check/clickbench/query27.out +++ b/regression-test/data/shape_check/clickbench/query27.out @@ -1,11 +1,11 @@ -- This file is automatically generated. You should know what you did if you want to edit this -- !ckbench_shape_27 -- -PhysicalResultSink +PhysicalDeferMaterializeResultSink --PhysicalProject -----PhysicalTopN[MERGE_SORT] +----PhysicalDeferMaterializeTopN ------PhysicalDistribute[DistributionSpecGather] ---------PhysicalTopN[LOCAL_SORT] +--------PhysicalDeferMaterializeTopN ----------PhysicalProject ------------filter(( not (SearchPhrase = ''))) ---------------PhysicalOlapScan[hits] +--------------PhysicalDeferMaterializeOlapScan[hits] diff --git a/regression-test/suites/nereids_rules_p0/limit_push_down/order_push_down.groovy b/regression-test/suites/nereids_rules_p0/limit_push_down/order_push_down.groovy index 1ae008df588a82..bbf4a64f1180a7 100644 --- a/regression-test/suites/nereids_rules_p0/limit_push_down/order_push_down.groovy +++ b/regression-test/suites/nereids_rules_p0/limit_push_down/order_push_down.groovy @@ -26,7 +26,7 @@ suite("order_push_down") { sql 'set be_number_for_test=3' sql "set disable_nereids_rules='push_down_top_n_distinct_through_union'" sql "set disable_nereids_rules=PRUNE_EMPTY_PARTITION" - + sql 'set enable_two_phase_read_opt = true' //`limit 1 offset 1 + sort, project`: qt_limit_offset_sort_project """ explain shape plan SELECT t1.id FROM t1 ORDER BY id LIMIT 1 OFFSET 1; """ diff --git a/regression-test/suites/nereids_rules_p0/mv/single_table_without_agg/single_table_without_aggregate.groovy b/regression-test/suites/nereids_rules_p0/mv/single_table_without_agg/single_table_without_aggregate.groovy index 450fb9c0ea3187..3a07a959511390 100644 --- a/regression-test/suites/nereids_rules_p0/mv/single_table_without_agg/single_table_without_aggregate.groovy +++ b/regression-test/suites/nereids_rules_p0/mv/single_table_without_agg/single_table_without_aggregate.groovy @@ -21,6 +21,9 @@ suite("single_table_without_aggregate") { sql "SET enable_nereids_planner=true" sql "SET enable_fallback_to_original_planner=false" sql "set enable_materialized_view_rewrite=true" + // TODO remove this variable after mv rewrite support defer materialized nodes + sql 'set enable_two_phase_read_opt = false' + sql """ drop table if exists orders diff --git a/regression-test/suites/query_p0/sort/topn_2pr_rule.groovy b/regression-test/suites/query_p0/sort/topn_2pr_rule.groovy index 4b74cdad8538e4..0df8ab260309c9 100644 --- a/regression-test/suites/query_p0/sort/topn_2pr_rule.groovy +++ b/regression-test/suites/query_p0/sort/topn_2pr_rule.groovy @@ -52,7 +52,7 @@ suite("topn_2pr_rule") { } else if("${key_type}" == "UNIQUE") { explain { sql("select * from ${table_name} order by k limit 1;") - notContains "OPT TWO PHASE" + contains "OPT TWO PHASE" } } else if("${key_type}" == "AGGREGATE") { explain { diff --git a/regression-test/suites/shape_check/clickbench/query25.groovy b/regression-test/suites/shape_check/clickbench/query25.groovy index 1039b871232678..d86ca0ac133828 100644 --- a/regression-test/suites/shape_check/clickbench/query25.groovy +++ b/regression-test/suites/shape_check/clickbench/query25.groovy @@ -24,6 +24,7 @@ suite("query25") { sql 'set enable_fallback_to_original_planner=false' sql "set disable_nereids_rules=PRUNE_EMPTY_PARTITION" + sql 'set enable_two_phase_read_opt = true' sql 'set topn_opt_limit_threshold = 1024' def ckBench = """SELECT SearchPhrase FROM hits WHERE SearchPhrase <> '' ORDER BY EventTime LIMIT 10""" qt_ckbench_shape_25 """ diff --git a/regression-test/suites/shape_check/clickbench/query26.groovy b/regression-test/suites/shape_check/clickbench/query26.groovy index 61b5b954bbe9f6..33265206825e72 100644 --- a/regression-test/suites/shape_check/clickbench/query26.groovy +++ b/regression-test/suites/shape_check/clickbench/query26.groovy @@ -24,6 +24,7 @@ suite("query26") { sql 'set enable_fallback_to_original_planner=false' sql "set disable_nereids_rules=PRUNE_EMPTY_PARTITION" + sql 'set enable_two_phase_read_opt = true' sql 'set topn_opt_limit_threshold = 1024' def ckBench = """SELECT SearchPhrase FROM hits WHERE SearchPhrase <> '' ORDER BY SearchPhrase LIMIT 10""" qt_ckbench_shape_26 """ diff --git a/regression-test/suites/shape_check/clickbench/query27.groovy b/regression-test/suites/shape_check/clickbench/query27.groovy index e035e480331dd3..d895076dafa649 100644 --- a/regression-test/suites/shape_check/clickbench/query27.groovy +++ b/regression-test/suites/shape_check/clickbench/query27.groovy @@ -24,6 +24,7 @@ suite("query27") { sql 'set enable_fallback_to_original_planner=false' sql "set disable_nereids_rules=PRUNE_EMPTY_PARTITION" + sql 'set enable_two_phase_read_opt = true' sql 'set topn_opt_limit_threshold = 1024' def ckBench = """SELECT SearchPhrase FROM hits WHERE SearchPhrase <> '' ORDER BY EventTime, SearchPhrase LIMIT 10""" qt_ckbench_shape_27 """