From 6501b0b13c29576ca9038efe1f6519179c447a24 Mon Sep 17 00:00:00 2001 From: discord9 <55937128+discord9@users.noreply.github.com> Date: Mon, 21 Jul 2025 14:40:15 +0800 Subject: [PATCH] feat: MergeScan print input (#6563) * feat: MergeScan print input Signed-off-by: discord9 * test: fix ut Signed-off-by: discord9 --------- Signed-off-by: discord9 --- src/query/src/dist_plan/analyzer.rs | 18 +++-- src/query/src/dist_plan/merge_scan.rs | 7 +- .../distributed/explain/join_10_tables.result | 40 +++++++--- .../explain/multi_partitions.result | 7 +- .../cases/distributed/explain/order_by.result | 20 ++++- .../explain/single_partition.result | 18 ++++- .../distributed/explain/step_aggr.result | 10 ++- .../explain/step_aggr_basic.result | 25 ++++-- .../explain/step_aggr_massive.result | 12 ++- .../distributed/explain/subqueries.result | 35 +++++++-- .../optimizer/filter_push_down.result | 8 +- .../distributed/optimizer/order_by.result | 31 ++++++-- .../common/order/order_by_exceptions.result | 10 ++- .../cases/standalone/common/range/nest.result | 4 +- .../common/tql-explain-analyze/explain.result | 78 ++++++++++++++----- tests/cases/standalone/limit/limit.result | 42 ++++++---- .../standalone/optimizer/order_by.result | 31 ++++++-- 17 files changed, 306 insertions(+), 90 deletions(-) diff --git a/src/query/src/dist_plan/analyzer.rs b/src/query/src/dist_plan/analyzer.rs index d755050653..2f3fbeba76 100644 --- a/src/query/src/dist_plan/analyzer.rs +++ b/src/query/src/dist_plan/analyzer.rs @@ -547,7 +547,7 @@ mod test { let config = ConfigOptions::default(); let result = DistPlannerAnalyzer {}.analyze(plan, &config).unwrap(); let expected = "Projection: avg(t.number)\ - \n MergeScan [is_placeholder=false]"; + \n MergeScan [is_placeholder=false, remote_input=[\nAggregate: groupBy=[[]], aggr=[[avg(t.number)]]\n TableScan: t\n]]"; assert_eq!(expected, result.to_string()); } @@ -569,7 +569,15 @@ mod test { let config = ConfigOptions::default(); let result = DistPlannerAnalyzer {}.analyze(plan, &config).unwrap(); - let expected = ["Projection: t.number", " MergeScan [is_placeholder=false]"].join("\n"); + let expected = [ + "Projection: t.number", + " MergeScan [is_placeholder=false, remote_input=[", + "Sort: t.number ASC NULLS LAST", + " Distinct:", + " TableScan: t", + "]]", + ] + .join("\n"); assert_eq!(expected, result.to_string()); } @@ -590,7 +598,7 @@ mod test { let config = ConfigOptions::default(); let result = DistPlannerAnalyzer {}.analyze(plan, &config).unwrap(); let expected = "Projection: t.number\ - \n MergeScan [is_placeholder=false]"; + \n MergeScan [is_placeholder=false, remote_input=[\nLimit: skip=0, fetch=1\n TableScan: t\n]]"; assert_eq!(expected, result.to_string()); } @@ -631,10 +639,10 @@ mod test { "Limit: skip=0, fetch=1", " LeftSemi Join: Filter: t.number = right.number", " Projection: t.number", - " MergeScan [is_placeholder=false]", + " MergeScan [is_placeholder=false, remote_input=[\nTableScan: t\n]]", " SubqueryAlias: right", " Projection: t.number", - " MergeScan [is_placeholder=false]", + " MergeScan [is_placeholder=false, remote_input=[\nTableScan: t\n]]", ] .join("\n"); assert_eq!(expected, result.to_string()); diff --git a/src/query/src/dist_plan/merge_scan.rs b/src/query/src/dist_plan/merge_scan.rs index a4a59753e0..87846ef510 100644 --- a/src/query/src/dist_plan/merge_scan.rs +++ b/src/query/src/dist_plan/merge_scan.rs @@ -88,7 +88,11 @@ impl UserDefinedLogicalNodeCore for MergeScanLogicalPlan { } fn fmt_for_explain(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { - write!(f, "MergeScan [is_placeholder={}]", self.is_placeholder) + write!( + f, + "MergeScan [is_placeholder={}, remote_input=[\n{}\n]]", + self.is_placeholder, self.input + ) } fn with_exprs_and_inputs( @@ -155,6 +159,7 @@ impl std::fmt::Debug for MergeScanExec { .field("table", &self.table) .field("regions", &self.regions) .field("schema", &self.schema) + .field("plan", &self.plan) .finish() } } diff --git a/tests/cases/distributed/explain/join_10_tables.result b/tests/cases/distributed/explain/join_10_tables.result index 6a38a88032..ee0eaf36fd 100644 --- a/tests/cases/distributed/explain/join_10_tables.result +++ b/tests/cases/distributed/explain/join_10_tables.result @@ -84,17 +84,37 @@ limit 1; |_|_Inner Join: t_2.ts = t_3.ts, t_2.vin = t_3.vin_| |_|_Inner Join: t_1.ts = t_2.ts, t_1.vin = t_2.vin_| |_|_Filter: t_1.vin IS NOT NULL_| -|_|_MergeScan [is_placeholder=false]_| +|_|_MergeScan [is_placeholder=false, remote_input=[_| +|_| TableScan: t_1_| +|_| ]]_| |_|_Filter: t_2.vin IS NOT NULL_| -|_|_MergeScan [is_placeholder=false]_| -|_|_MergeScan [is_placeholder=false]_| -|_|_MergeScan [is_placeholder=false]_| -|_|_MergeScan [is_placeholder=false]_| -|_|_MergeScan [is_placeholder=false]_| -|_|_MergeScan [is_placeholder=false]_| -|_|_MergeScan [is_placeholder=false]_| -|_|_MergeScan [is_placeholder=false]_| -|_|_MergeScan [is_placeholder=false]_| +|_|_MergeScan [is_placeholder=false, remote_input=[_| +|_| TableScan: t_2_| +|_| ]]_| +|_|_MergeScan [is_placeholder=false, remote_input=[_| +|_| TableScan: t_3_| +|_| ]]_| +|_|_MergeScan [is_placeholder=false, remote_input=[_| +|_| TableScan: t_4_| +|_| ]]_| +|_|_MergeScan [is_placeholder=false, remote_input=[_| +|_| TableScan: t_5_| +|_| ]]_| +|_|_MergeScan [is_placeholder=false, remote_input=[_| +|_| TableScan: t_6_| +|_| ]]_| +|_|_MergeScan [is_placeholder=false, remote_input=[_| +|_| TableScan: t_7_| +|_| ]]_| +|_|_MergeScan [is_placeholder=false, remote_input=[_| +|_| TableScan: t_8_| +|_| ]]_| +|_|_MergeScan [is_placeholder=false, remote_input=[_| +|_| TableScan: t_9_| +|_| ]]_| +|_|_MergeScan [is_placeholder=false, remote_input=[_| +|_| TableScan: t_10_| +|_| ]]_| | physical_plan | SortPreservingMergeExec: [ts@0 DESC], fetch=1_| |_|_SortExec: TopK(fetch=1), expr=[ts@0 DESC], preserve_partitioning=[true]_| |_|_CoalesceBatchesExec: target_batch_size=8192_| diff --git a/tests/cases/distributed/explain/multi_partitions.result b/tests/cases/distributed/explain/multi_partitions.result index 17d5ab7b2e..ce5831dc53 100644 --- a/tests/cases/distributed/explain/multi_partitions.result +++ b/tests/cases/distributed/explain/multi_partitions.result @@ -24,7 +24,12 @@ explain SELECT * FROM multi_partitions_test_table WHERE ts > cast(1000000000 as | plan_type_| plan_| +-+-+ | logical_plan_| MergeSort: multi_partitions_test_table.host ASC NULLS LAST_| -|_|_MergeScan [is_placeholder=false]_| +|_|_MergeScan [is_placeholder=false, remote_input=[_| +|_| Sort: multi_partitions_test_table.host ASC NULLS LAST_| +|_|_Projection: multi_partitions_test_table.host, multi_partitions_test_table.ts, multi_partitions_test_table.cpu, multi_partitions_test_table.memory, multi_partitions_test_table.disk_util | +|_|_Filter: multi_partitions_test_table.ts > arrow_cast(Int64(1000000000), Utf8("Timestamp(Millisecond, None)"))_| +|_|_TableScan: multi_partitions_test_table_| +|_| ]]_| | physical_plan | SortPreservingMergeExec: [host@0 ASC NULLS LAST]_| |_|_MergeScanExec: REDACTED |_|_| diff --git a/tests/cases/distributed/explain/order_by.result b/tests/cases/distributed/explain/order_by.result index c0faf9681b..6984279823 100644 --- a/tests/cases/distributed/explain/order_by.result +++ b/tests/cases/distributed/explain/order_by.result @@ -12,7 +12,12 @@ EXPLAIN SELECT DISTINCT i%2 FROM integers ORDER BY 1; +-+-+ | plan_type_| plan_| +-+-+ -| logical_plan_| MergeScan [is_placeholder=false]_| +| logical_plan_| MergeScan [is_placeholder=false, remote_input=[ | +|_| Sort: integers.i % Int64(2) ASC NULLS LAST_| +|_|_Distinct:_| +|_|_Projection: integers.i % Int64(2)_| +|_|_TableScan: integers_| +|_| ]]_| | physical_plan | MergeScanExec: REDACTED |_|_| +-+-+ @@ -35,7 +40,11 @@ EXPLAIN SELECT a, b FROM test ORDER BY a, b; +-+-+ | plan_type_| plan_| +-+-+ -| logical_plan_| MergeScan [is_placeholder=false]_| +| logical_plan_| MergeScan [is_placeholder=false, remote_input=[_| +|_| Sort: test.a ASC NULLS LAST, test.b ASC NULLS LAST | +|_|_Projection: test.a, test.b_| +|_|_TableScan: test_| +|_| ]]_| | physical_plan | MergeScanExec: REDACTED |_|_| +-+-+ @@ -50,7 +59,12 @@ EXPLAIN SELECT DISTINCT a, b FROM test ORDER BY a, b; +-+-+ | plan_type_| plan_| +-+-+ -| logical_plan_| MergeScan [is_placeholder=false]_| +| logical_plan_| MergeScan [is_placeholder=false, remote_input=[_| +|_| Sort: test.a ASC NULLS LAST, test.b ASC NULLS LAST | +|_|_Distinct:_| +|_|_Projection: test.a, test.b_| +|_|_TableScan: test_| +|_| ]]_| | physical_plan | MergeScanExec: REDACTED |_|_| +-+-+ diff --git a/tests/cases/distributed/explain/single_partition.result b/tests/cases/distributed/explain/single_partition.result index ca94fee301..ce0ae08c4c 100644 --- a/tests/cases/distributed/explain/single_partition.result +++ b/tests/cases/distributed/explain/single_partition.result @@ -12,7 +12,11 @@ EXPLAIN SELECT COUNT(*) FROM single_partition; +-+-+ | plan_type_| plan_| +-+-+ -| logical_plan_| MergeScan [is_placeholder=false]_| +| logical_plan_| MergeScan [is_placeholder=false, remote_input=[_| +|_| Projection: count(*)_| +|_|_Aggregate: groupBy=[[]], aggr=[[count(single_partition.j) AS count(*)]] | +|_|_TableScan: single_partition_| +|_| ]]_| | physical_plan | MergeScanExec: REDACTED |_|_| +-+-+ @@ -27,7 +31,11 @@ EXPLAIN SELECT SUM(i) FROM single_partition; +-+-+ | plan_type_| plan_| +-+-+ -| logical_plan_| MergeScan [is_placeholder=false]_| +| logical_plan_| MergeScan [is_placeholder=false, remote_input=[_| +|_| Projection: sum(single_partition.i)_| +|_|_Aggregate: groupBy=[[]], aggr=[[sum(single_partition.i)]] | +|_|_TableScan: single_partition_| +|_| ]]_| | physical_plan | MergeScanExec: REDACTED |_|_| +-+-+ @@ -42,7 +50,11 @@ EXPLAIN SELECT * FROM single_partition ORDER BY i DESC; +-+-+ | plan_type_| plan_| +-+-+ -| logical_plan_| MergeScan [is_placeholder=false]_| +| logical_plan_| MergeScan [is_placeholder=false, remote_input=[_| +|_| Sort: single_partition.i DESC NULLS FIRST_| +|_|_Projection: single_partition.i, single_partition.j, single_partition.k | +|_|_TableScan: single_partition_| +|_| ]]_| | physical_plan | MergeScanExec: REDACTED |_|_| +-+-+ diff --git a/tests/cases/distributed/explain/step_aggr.result b/tests/cases/distributed/explain/step_aggr.result index 75fc3f3ecb..df9d1891a3 100644 --- a/tests/cases/distributed/explain/step_aggr.result +++ b/tests/cases/distributed/explain/step_aggr.result @@ -55,7 +55,10 @@ FROM +-+-+ | logical_plan_| Projection: sum(count(integers.i)) AS count(integers.i), sum(sum(integers.i)) AS sum(integers.i), uddsketch_calc(Float64(0.5), uddsketch_merge(Int64(128),Float64(0.01),uddsketch_state(Int64(128),Float64(0.01),integers.i))) AS uddsketch_calc(Float64(0.5),uddsketch_state(Int64(128),Float64(0.01),integers.i)), hll_count(hll_merge(hll(integers.i))) AS hll_count(hll(integers.i))_| |_|_Aggregate: groupBy=[[]], aggr=[[sum(count(integers.i)), sum(sum(integers.i)), uddsketch_merge(Int64(128), Float64(0.01), uddsketch_state(Int64(128),Float64(0.01),integers.i)), hll_merge(hll(integers.i))]]_| -|_|_MergeScan [is_placeholder=false]_| +|_|_MergeScan [is_placeholder=false, remote_input=[_| +|_| Aggregate: groupBy=[[]], aggr=[[count(integers.i), sum(integers.i), uddsketch_state(Int64(128), Float64(0.01), CAST(integers.i AS Float64)), hll(CAST(integers.i AS Utf8))]]_| +|_|_TableScan: integers_| +|_| ]]_| | physical_plan | ProjectionExec: expr=[sum(count(integers.i))@0 as count(integers.i), sum(sum(integers.i))@1 as sum(integers.i), uddsketch_calc(0.5, uddsketch_merge(Int64(128),Float64(0.01),uddsketch_state(Int64(128),Float64(0.01),integers.i))@2) as uddsketch_calc(Float64(0.5),uddsketch_state(Int64(128),Float64(0.01),integers.i)), hll_count(hll_merge(hll(integers.i))@3) as hll_count(hll(integers.i))] | |_|_AggregateExec: mode=Final, gby=[], aggr=[sum(count(integers.i)), sum(sum(integers.i)), uddsketch_merge(Int64(128),Float64(0.01),uddsketch_state(Int64(128),Float64(0.01),integers.i)), hll_merge(hll(integers.i))]_| |_|_CoalescePartitionsExec_| @@ -156,7 +159,10 @@ ORDER BY | logical_plan_| Sort: integers.ts ASC NULLS LAST_| |_|_Projection: integers.ts, sum(count(integers.i)) AS count(integers.i), sum(sum(integers.i)) AS sum(integers.i), uddsketch_calc(Float64(0.5), uddsketch_merge(Int64(128),Float64(0.01),uddsketch_state(Int64(128),Float64(0.01),integers.i))) AS uddsketch_calc(Float64(0.5),uddsketch_state(Int64(128),Float64(0.01),integers.i)), hll_count(hll_merge(hll(integers.i))) AS hll_count(hll(integers.i))_| |_|_Aggregate: groupBy=[[integers.ts]], aggr=[[sum(count(integers.i)), sum(sum(integers.i)), uddsketch_merge(Int64(128), Float64(0.01), uddsketch_state(Int64(128),Float64(0.01),integers.i)), hll_merge(hll(integers.i))]]_| -|_|_MergeScan [is_placeholder=false]_| +|_|_MergeScan [is_placeholder=false, remote_input=[_| +|_| Aggregate: groupBy=[[integers.ts]], aggr=[[count(integers.i), sum(integers.i), uddsketch_state(Int64(128), Float64(0.01), CAST(integers.i AS Float64)), hll(CAST(integers.i AS Utf8))]]_| +|_|_TableScan: integers_| +|_| ]]_| | physical_plan | SortPreservingMergeExec: [ts@0 ASC NULLS LAST]_| |_|_SortExec: expr=[ts@0 ASC NULLS LAST], preserve_partitioning=[true]_| |_|_ProjectionExec: expr=[ts@0 as ts, sum(count(integers.i))@1 as count(integers.i), sum(sum(integers.i))@2 as sum(integers.i), uddsketch_calc(0.5, uddsketch_merge(Int64(128),Float64(0.01),uddsketch_state(Int64(128),Float64(0.01),integers.i))@3) as uddsketch_calc(Float64(0.5),uddsketch_state(Int64(128),Float64(0.01),integers.i)), hll_count(hll_merge(hll(integers.i))@4) as hll_count(hll(integers.i))] | diff --git a/tests/cases/distributed/explain/step_aggr_basic.result b/tests/cases/distributed/explain/step_aggr_basic.result index c522f249a7..973aa657fe 100644 --- a/tests/cases/distributed/explain/step_aggr_basic.result +++ b/tests/cases/distributed/explain/step_aggr_basic.result @@ -50,7 +50,10 @@ FROM +-+-+ | logical_plan_| Projection: sum(count(integers.i)) AS count(integers.i)_| |_|_Aggregate: groupBy=[[]], aggr=[[sum(count(integers.i))]]_| -|_|_MergeScan [is_placeholder=false]_| +|_|_MergeScan [is_placeholder=false, remote_input=[_| +|_| Aggregate: groupBy=[[]], aggr=[[count(integers.i)]]_| +|_|_TableScan: integers_| +|_| ]]_| | physical_plan | ProjectionExec: expr=[sum(count(integers.i))@0 as count(integers.i)]_| |_|_AggregateExec: mode=Final, gby=[], aggr=[sum(count(integers.i))]_| |_|_CoalescePartitionsExec_| @@ -144,7 +147,10 @@ ORDER BY | logical_plan_| Sort: integers.ts ASC NULLS LAST, count(integers.i) ASC NULLS LAST_| |_|_Projection: integers.ts, sum(count(integers.i)) AS count(integers.i)_| |_|_Aggregate: groupBy=[[integers.ts]], aggr=[[sum(count(integers.i))]]_| -|_|_MergeScan [is_placeholder=false]_| +|_|_MergeScan [is_placeholder=false, remote_input=[_| +|_| Aggregate: groupBy=[[integers.ts]], aggr=[[count(integers.i)]]_| +|_|_TableScan: integers_| +|_| ]]_| | physical_plan | SortPreservingMergeExec: [ts@0 ASC NULLS LAST, count(integers.i)@1 ASC NULLS LAST]_| |_|_SortExec: expr=[ts@0 ASC NULLS LAST, count(integers.i)@1 ASC NULLS LAST], preserve_partitioning=[true]_| |_|_ProjectionExec: expr=[ts@0 as ts, sum(count(integers.i))@1 as count(integers.i)]_| @@ -253,7 +259,10 @@ ORDER BY | logical_plan_| Sort: time_window ASC NULLS LAST, count(integers.i) ASC NULLS LAST_| |_|_Projection: date_bin(Utf8("1 hour"),integers.ts) AS time_window, sum(count(integers.i)) AS count(integers.i)_| |_|_Aggregate: groupBy=[[date_bin(Utf8("1 hour"),integers.ts)]], aggr=[[sum(count(integers.i))]]_| -|_|_MergeScan [is_placeholder=false]_| +|_|_MergeScan [is_placeholder=false, remote_input=[_| +|_| Aggregate: groupBy=[[date_bin(CAST(Utf8("1 hour") AS Interval(MonthDayNano)), integers.ts)]], aggr=[[count(integers.i)]]_| +|_|_TableScan: integers_| +|_| ]]_| | physical_plan | SortPreservingMergeExec: [time_window@0 ASC NULLS LAST, count(integers.i)@1 ASC NULLS LAST]_| |_|_SortExec: expr=[time_window@0 ASC NULLS LAST, count(integers.i)@1 ASC NULLS LAST], preserve_partitioning=[true]_| |_|_ProjectionExec: expr=[date_bin(Utf8("1 hour"),integers.ts)@0 as time_window, sum(count(integers.i))@1 as count(integers.i)]_| @@ -369,7 +378,10 @@ ORDER BY | logical_plan_| Sort: integers.ts + Int64(1) ASC NULLS LAST, integers.i / Int64(2) ASC NULLS LAST_| |_|_Projection: integers.ts + Int64(1), integers.i / Int64(2), sum(count(integers.i)) AS count(integers.i)_| |_|_Aggregate: groupBy=[[integers.ts + Int64(1), integers.i / Int64(2)]], aggr=[[sum(count(integers.i))]]_| -|_|_MergeScan [is_placeholder=false]_| +|_|_MergeScan [is_placeholder=false, remote_input=[_| +|_| Aggregate: groupBy=[[CAST(integers.ts AS Int64) + Int64(1), integers.i / Int64(2)]], aggr=[[count(integers.i)]]_| +|_|_TableScan: integers_| +|_| ]]_| | physical_plan | SortPreservingMergeExec: [integers.ts + Int64(1)@0 ASC NULLS LAST, integers.i / Int64(2)@1 ASC NULLS LAST]_| |_|_SortExec: expr=[integers.ts + Int64(1)@0 ASC NULLS LAST, integers.i / Int64(2)@1 ASC NULLS LAST], preserve_partitioning=[true]_| |_|_ProjectionExec: expr=[integers.ts + Int64(1)@0 as integers.ts + Int64(1), integers.i / Int64(2)@1 as integers.i / Int64(2), sum(count(integers.i))@2 as count(integers.i)]_| @@ -497,7 +509,10 @@ FROM +-+-+ | logical_plan_| Projection: uddsketch_calc(Float64(0.5), uddsketch_merge(Int64(128),Float64(0.01),uddsketch_merge(Int64(128),Float64(0.01),sink_table.udd_state))) AS udd_result, hll_count(hll_merge(hll_merge(sink_table.hll_state))) AS hll_result_| |_|_Aggregate: groupBy=[[]], aggr=[[uddsketch_merge(Int64(128), Float64(0.01), uddsketch_merge(Int64(128),Float64(0.01),sink_table.udd_state)), hll_merge(hll_merge(sink_table.hll_state))]]_| -|_|_MergeScan [is_placeholder=false]_| +|_|_MergeScan [is_placeholder=false, remote_input=[_| +|_| Aggregate: groupBy=[[]], aggr=[[uddsketch_merge(Int64(128), Float64(0.01), sink_table.udd_state), hll_merge(sink_table.hll_state)]]_| +|_|_TableScan: sink_table_| +|_| ]]_| | physical_plan | ProjectionExec: expr=[uddsketch_calc(0.5, uddsketch_merge(Int64(128),Float64(0.01),uddsketch_merge(Int64(128),Float64(0.01),sink_table.udd_state))@0) as udd_result, hll_count(hll_merge(hll_merge(sink_table.hll_state))@1) as hll_result] | |_|_AggregateExec: mode=Final, gby=[], aggr=[uddsketch_merge(Int64(128),Float64(0.01),uddsketch_merge(Int64(128),Float64(0.01),sink_table.udd_state)), hll_merge(hll_merge(sink_table.hll_state))]_| |_|_CoalescePartitionsExec_| diff --git a/tests/cases/distributed/explain/step_aggr_massive.result b/tests/cases/distributed/explain/step_aggr_massive.result index 5686962900..e0ec1e22a2 100644 --- a/tests/cases/distributed/explain/step_aggr_massive.result +++ b/tests/cases/distributed/explain/step_aggr_massive.result @@ -247,7 +247,11 @@ GROUP BY +-+-+ | logical_plan_| Projection: base_table.env, base_table.service_name, base_table.city, base_table.page, uddsketch_merge(Int64(128),Float64(0.01),uddsketch_state(Int64(128),Float64(0.01),CASE WHEN base_table.lcp > Int64(0) AND base_table.lcp < Int64(3000000) THEN base_table.lcp ELSE NULL END)) AS lcp_state, max(max(CASE WHEN base_table.lcp > Int64(0) AND base_table.lcp < Int64(3000000) THEN base_table.lcp ELSE NULL END)) AS max_lcp, min(min(CASE WHEN base_table.lcp > Int64(0) AND base_table.lcp < Int64(3000000) THEN base_table.lcp ELSE NULL END)) AS min_lcp, uddsketch_merge(Int64(128),Float64(0.01),uddsketch_state(Int64(128),Float64(0.01),CASE WHEN base_table.fmp > Int64(0) AND base_table.fmp < Int64(3000000) THEN base_table.fmp ELSE NULL END)) AS fmp_state, max(max(CASE WHEN base_table.fmp > Int64(0) AND base_table.fmp < Int64(3000000) THEN base_table.fmp ELSE NULL END)) AS max_fmp, min(min(CASE WHEN base_table.fmp > Int64(0) AND base_table.fmp < Int64(3000000) THEN base_table.fmp ELSE NULL END)) AS min_fmp, uddsketch_merge(Int64(128),Float64(0.01),uddsketch_state(Int64(128),Float64(0.01),CASE WHEN base_table.fcp > Int64(0) AND base_table.fcp < Int64(3000000) THEN base_table.fcp ELSE NULL END)) AS fcp_state, max(max(CASE WHEN base_table.fcp > Int64(0) AND base_table.fcp < Int64(3000000) THEN base_table.fcp ELSE NULL END)) AS max_fcp, min(min(CASE WHEN base_table.fcp > Int64(0) AND base_table.fcp < Int64(3000000) THEN base_table.fcp ELSE NULL END)) AS min_fcp, uddsketch_merge(Int64(128),Float64(0.01),uddsketch_state(Int64(128),Float64(0.01),CASE WHEN base_table.fp > Int64(0) AND base_table.fp < Int64(3000000) THEN base_table.fp ELSE NULL END)) AS fp_state, max(max(CASE WHEN base_table.fp > Int64(0) AND base_table.fp < Int64(3000000) THEN base_table.fp ELSE NULL END)) AS max_fp, min(min(CASE WHEN base_table.fp > Int64(0) AND base_table.fp < Int64(3000000) THEN base_table.fp ELSE NULL END)) AS min_fp, uddsketch_merge(Int64(128),Float64(0.01),uddsketch_state(Int64(128),Float64(0.01),CASE WHEN base_table.tti > Int64(0) AND base_table.tti < Int64(3000000) THEN base_table.tti ELSE NULL END)) AS tti_state, max(max(CASE WHEN base_table.tti > Int64(0) AND base_table.tti < Int64(3000000) THEN base_table.tti ELSE NULL END)) AS max_tti, min(min(CASE WHEN base_table.tti > Int64(0) AND base_table.tti < Int64(3000000) THEN base_table.tti ELSE NULL END)) AS min_tti, uddsketch_merge(Int64(128),Float64(0.01),uddsketch_state(Int64(128),Float64(0.01),CASE WHEN base_table.fid > Int64(0) AND base_table.fid < Int64(3000000) THEN base_table.fid ELSE NULL END)) AS fid_state, max(max(CASE WHEN base_table.fid > Int64(0) AND base_table.fid < Int64(3000000) THEN base_table.fid ELSE NULL END)) AS max_fid, min(min(CASE WHEN base_table.fid > Int64(0) AND base_table.fid < Int64(3000000) THEN base_table.fid ELSE NULL END)) AS min_fid, max(max(base_table.shard_key)) AS shard_key, arrow_cast(date_bin(Utf8("60 seconds"),base_table.time),Utf8("Timestamp(Second, None)"))_| |_|_Aggregate: groupBy=[[base_table.env, base_table.service_name, base_table.city, base_table.page, arrow_cast(date_bin(Utf8("60 seconds"),base_table.time),Utf8("Timestamp(Second, None)"))]], aggr=[[uddsketch_merge(Int64(128), Float64(0.01), uddsketch_state(Int64(128),Float64(0.01),CASE WHEN base_table.lcp > Int64(0) AND base_table.lcp < Int64(3000000) THEN base_table.lcp ELSE NULL END)), max(max(CASE WHEN base_table.lcp > Int64(0) AND base_table.lcp < Int64(3000000) THEN base_table.lcp ELSE NULL END)), min(min(CASE WHEN base_table.lcp > Int64(0) AND base_table.lcp < Int64(3000000) THEN base_table.lcp ELSE NULL END)), uddsketch_merge(Int64(128), Float64(0.01), uddsketch_state(Int64(128),Float64(0.01),CASE WHEN base_table.fmp > Int64(0) AND base_table.fmp < Int64(3000000) THEN base_table.fmp ELSE NULL END)), max(max(CASE WHEN base_table.fmp > Int64(0) AND base_table.fmp < Int64(3000000) THEN base_table.fmp ELSE NULL END)), min(min(CASE WHEN base_table.fmp > Int64(0) AND base_table.fmp < Int64(3000000) THEN base_table.fmp ELSE NULL END)), uddsketch_merge(Int64(128), Float64(0.01), uddsketch_state(Int64(128),Float64(0.01),CASE WHEN base_table.fcp > Int64(0) AND base_table.fcp < Int64(3000000) THEN base_table.fcp ELSE NULL END)), max(max(CASE WHEN base_table.fcp > Int64(0) AND base_table.fcp < Int64(3000000) THEN base_table.fcp ELSE NULL END)), min(min(CASE WHEN base_table.fcp > Int64(0) AND base_table.fcp < Int64(3000000) THEN base_table.fcp ELSE NULL END)), uddsketch_merge(Int64(128), Float64(0.01), uddsketch_state(Int64(128),Float64(0.01),CASE WHEN base_table.fp > Int64(0) AND base_table.fp < Int64(3000000) THEN base_table.fp ELSE NULL END)), max(max(CASE WHEN base_table.fp > Int64(0) AND base_table.fp < Int64(3000000) THEN base_table.fp ELSE NULL END)), min(min(CASE WHEN base_table.fp > Int64(0) AND base_table.fp < Int64(3000000) THEN base_table.fp ELSE NULL END)), uddsketch_merge(Int64(128), Float64(0.01), uddsketch_state(Int64(128),Float64(0.01),CASE WHEN base_table.tti > Int64(0) AND base_table.tti < Int64(3000000) THEN base_table.tti ELSE NULL END)), max(max(CASE WHEN base_table.tti > Int64(0) AND base_table.tti < Int64(3000000) THEN base_table.tti ELSE NULL END)), min(min(CASE WHEN base_table.tti > Int64(0) AND base_table.tti < Int64(3000000) THEN base_table.tti ELSE NULL END)), uddsketch_merge(Int64(128), Float64(0.01), uddsketch_state(Int64(128),Float64(0.01),CASE WHEN base_table.fid > Int64(0) AND base_table.fid < Int64(3000000) THEN base_table.fid ELSE NULL END)), max(max(CASE WHEN base_table.fid > Int64(0) AND base_table.fid < Int64(3000000) THEN base_table.fid ELSE NULL END)), min(min(CASE WHEN base_table.fid > Int64(0) AND base_table.fid < Int64(3000000) THEN base_table.fid ELSE NULL END)), max(max(base_table.shard_key))]]_| -|_|_MergeScan [is_placeholder=false]_| +|_|_MergeScan [is_placeholder=false, remote_input=[_| +|_| Aggregate: groupBy=[[base_table.env, base_table.service_name, base_table.city, base_table.page, arrow_cast(date_bin(CAST(Utf8("60 seconds") AS Interval(MonthDayNano)), base_table.time), Utf8("Timestamp(Second, None)"))]], aggr=[[uddsketch_state(Int64(128), Float64(0.01), CAST(CASE WHEN base_table.lcp > Int64(0) AND base_table.lcp < Int64(3000000) THEN base_table.lcp ELSE CAST(NULL AS Int64) END AS Float64)), max(CASE WHEN base_table.lcp > Int64(0) AND base_table.lcp < Int64(3000000) THEN base_table.lcp ELSE CAST(NULL AS Int64) END), min(CASE WHEN base_table.lcp > Int64(0) AND base_table.lcp < Int64(3000000) THEN base_table.lcp ELSE CAST(NULL AS Int64) END), uddsketch_state(Int64(128), Float64(0.01), CAST(CASE WHEN base_table.fmp > Int64(0) AND base_table.fmp < Int64(3000000) THEN base_table.fmp ELSE CAST(NULL AS Int64) END AS Float64)), max(CASE WHEN base_table.fmp > Int64(0) AND base_table.fmp < Int64(3000000) THEN base_table.fmp ELSE CAST(NULL AS Int64) END), min(CASE WHEN base_table.fmp > Int64(0) AND base_table.fmp < Int64(3000000) THEN base_table.fmp ELSE CAST(NULL AS Int64) END), uddsketch_state(Int64(128), Float64(0.01), CAST(CASE WHEN base_table.fcp > Int64(0) AND base_table.fcp < Int64(3000000) THEN base_table.fcp ELSE CAST(NULL AS Int64) END AS Float64)), max(CASE WHEN base_table.fcp > Int64(0) AND base_table.fcp < Int64(3000000) THEN base_table.fcp ELSE CAST(NULL AS Int64) END), min(CASE WHEN base_table.fcp > Int64(0) AND base_table.fcp < Int64(3000000) THEN base_table.fcp ELSE CAST(NULL AS Int64) END), uddsketch_state(Int64(128), Float64(0.01), CAST(CASE WHEN base_table.fp > Int64(0) AND base_table.fp < Int64(3000000) THEN base_table.fp ELSE CAST(NULL AS Int64) END AS Float64)), max(CASE WHEN base_table.fp > Int64(0) AND base_table.fp < Int64(3000000) THEN base_table.fp ELSE CAST(NULL AS Int64) END), min(CASE WHEN base_table.fp > Int64(0) AND base_table.fp < Int64(3000000) THEN base_table.fp ELSE CAST(NULL AS Int64) END), uddsketch_state(Int64(128), Float64(0.01), CAST(CASE WHEN base_table.tti > Int64(0) AND base_table.tti < Int64(3000000) THEN base_table.tti ELSE CAST(NULL AS Int64) END AS Float64)), max(CASE WHEN base_table.tti > Int64(0) AND base_table.tti < Int64(3000000) THEN base_table.tti ELSE CAST(NULL AS Int64) END), min(CASE WHEN base_table.tti > Int64(0) AND base_table.tti < Int64(3000000) THEN base_table.tti ELSE CAST(NULL AS Int64) END), uddsketch_state(Int64(128), Float64(0.01), CAST(CASE WHEN base_table.fid > Int64(0) AND base_table.fid < Int64(3000000) THEN base_table.fid ELSE CAST(NULL AS Int64) END AS Float64)), max(CASE WHEN base_table.fid > Int64(0) AND base_table.fid < Int64(3000000) THEN base_table.fid ELSE CAST(NULL AS Int64) END), min(CASE WHEN base_table.fid > Int64(0) AND base_table.fid < Int64(3000000) THEN base_table.fid ELSE CAST(NULL AS Int64) END), max(base_table.shard_key)]]_| +|_|_Filter: (base_table.lcp > Int64(0) AND base_table.lcp < Int64(3000000) OR base_table.fmp > Int64(0) AND base_table.fmp < Int64(3000000) OR base_table.fcp > Int64(0) AND base_table.fcp < Int64(3000000) OR base_table.fp > Int64(0) AND base_table.fp < Int64(3000000) OR base_table.tti > Int64(0) AND base_table.tti < Int64(3000000) OR base_table.fid > Int64(0) AND base_table.fid < Int64(3000000)) AND CAST(base_table.time AS Timestamp(Millisecond, Some("+00:00"))) >= CAST(now() AS Timestamp(Millisecond, Some("+00:00")))_| +|_|_TableScan: base_table_| +|_| ]]_| | physical_plan | ProjectionExec: expr=[env@0 as env, service_name@1 as service_name, city@2 as city, page@3 as page, uddsketch_merge(Int64(128),Float64(0.01),uddsketch_state(Int64(128),Float64(0.01),CASE WHEN base_table.lcp > Int64(0) AND base_table.lcp < Int64(3000000) THEN base_table.lcp ELSE NULL END))@5 as lcp_state, max(max(CASE WHEN base_table.lcp > Int64(0) AND base_table.lcp < Int64(3000000) THEN base_table.lcp ELSE NULL END))@6 as max_lcp, min(min(CASE WHEN base_table.lcp > Int64(0) AND base_table.lcp < Int64(3000000) THEN base_table.lcp ELSE NULL END))@7 as min_lcp, uddsketch_merge(Int64(128),Float64(0.01),uddsketch_state(Int64(128),Float64(0.01),CASE WHEN base_table.fmp > Int64(0) AND base_table.fmp < Int64(3000000) THEN base_table.fmp ELSE NULL END))@8 as fmp_state, max(max(CASE WHEN base_table.fmp > Int64(0) AND base_table.fmp < Int64(3000000) THEN base_table.fmp ELSE NULL END))@9 as max_fmp, min(min(CASE WHEN base_table.fmp > Int64(0) AND base_table.fmp < Int64(3000000) THEN base_table.fmp ELSE NULL END))@10 as min_fmp, uddsketch_merge(Int64(128),Float64(0.01),uddsketch_state(Int64(128),Float64(0.01),CASE WHEN base_table.fcp > Int64(0) AND base_table.fcp < Int64(3000000) THEN base_table.fcp ELSE NULL END))@11 as fcp_state, max(max(CASE WHEN base_table.fcp > Int64(0) AND base_table.fcp < Int64(3000000) THEN base_table.fcp ELSE NULL END))@12 as max_fcp, min(min(CASE WHEN base_table.fcp > Int64(0) AND base_table.fcp < Int64(3000000) THEN base_table.fcp ELSE NULL END))@13 as min_fcp, uddsketch_merge(Int64(128),Float64(0.01),uddsketch_state(Int64(128),Float64(0.01),CASE WHEN base_table.fp > Int64(0) AND base_table.fp < Int64(3000000) THEN base_table.fp ELSE NULL END))@14 as fp_state, max(max(CASE WHEN base_table.fp > Int64(0) AND base_table.fp < Int64(3000000) THEN base_table.fp ELSE NULL END))@15 as max_fp, min(min(CASE WHEN base_table.fp > Int64(0) AND base_table.fp < Int64(3000000) THEN base_table.fp ELSE NULL END))@16 as min_fp, uddsketch_merge(Int64(128),Float64(0.01),uddsketch_state(Int64(128),Float64(0.01),CASE WHEN base_table.tti > Int64(0) AND base_table.tti < Int64(3000000) THEN base_table.tti ELSE NULL END))@17 as tti_state, max(max(CASE WHEN base_table.tti > Int64(0) AND base_table.tti < Int64(3000000) THEN base_table.tti ELSE NULL END))@18 as max_tti, min(min(CASE WHEN base_table.tti > Int64(0) AND base_table.tti < Int64(3000000) THEN base_table.tti ELSE NULL END))@19 as min_tti, uddsketch_merge(Int64(128),Float64(0.01),uddsketch_state(Int64(128),Float64(0.01),CASE WHEN base_table.fid > Int64(0) AND base_table.fid < Int64(3000000) THEN base_table.fid ELSE NULL END))@20 as fid_state, max(max(CASE WHEN base_table.fid > Int64(0) AND base_table.fid < Int64(3000000) THEN base_table.fid ELSE NULL END))@21 as max_fid, min(min(CASE WHEN base_table.fid > Int64(0) AND base_table.fid < Int64(3000000) THEN base_table.fid ELSE NULL END))@22 as min_fid, max(max(base_table.shard_key))@23 as shard_key, arrow_cast(date_bin(Utf8("60 seconds"),base_table.time),Utf8("Timestamp(Second, None)"))@4 as arrow_cast(date_bin(Utf8("60 seconds"),base_table.time),Utf8("Timestamp(Second, None)"))] | |_|_AggregateExec: mode=FinalPartitioned, gby=[env@0 as env, service_name@1 as service_name, city@2 as city, page@3 as page, arrow_cast(date_bin(Utf8("60 seconds"),base_table.time),Utf8("Timestamp(Second, None)"))@4 as arrow_cast(date_bin(Utf8("60 seconds"),base_table.time),Utf8("Timestamp(Second, None)"))], aggr=[uddsketch_merge(Int64(128),Float64(0.01),uddsketch_state(Int64(128),Float64(0.01),CASE WHEN base_table.lcp > Int64(0) AND base_table.lcp < Int64(3000000) THEN base_table.lcp ELSE NULL END)), max(max(CASE WHEN base_table.lcp > Int64(0) AND base_table.lcp < Int64(3000000) THEN base_table.lcp ELSE NULL END)), min(min(CASE WHEN base_table.lcp > Int64(0) AND base_table.lcp < Int64(3000000) THEN base_table.lcp ELSE NULL END)), uddsketch_merge(Int64(128),Float64(0.01),uddsketch_state(Int64(128),Float64(0.01),CASE WHEN base_table.fmp > Int64(0) AND base_table.fmp < Int64(3000000) THEN base_table.fmp ELSE NULL END)), max(max(CASE WHEN base_table.fmp > Int64(0) AND base_table.fmp < Int64(3000000) THEN base_table.fmp ELSE NULL END)), min(min(CASE WHEN base_table.fmp > Int64(0) AND base_table.fmp < Int64(3000000) THEN base_table.fmp ELSE NULL END)), uddsketch_merge(Int64(128),Float64(0.01),uddsketch_state(Int64(128),Float64(0.01),CASE WHEN base_table.fcp > Int64(0) AND base_table.fcp < Int64(3000000) THEN base_table.fcp ELSE NULL END)), max(max(CASE WHEN base_table.fcp > Int64(0) AND base_table.fcp < Int64(3000000) THEN base_table.fcp ELSE NULL END)), min(min(CASE WHEN base_table.fcp > Int64(0) AND base_table.fcp < Int64(3000000) THEN base_table.fcp ELSE NULL END)), uddsketch_merge(Int64(128),Float64(0.01),uddsketch_state(Int64(128),Float64(0.01),CASE WHEN base_table.fp > Int64(0) AND base_table.fp < Int64(3000000) THEN base_table.fp ELSE NULL END)), max(max(CASE WHEN base_table.fp > Int64(0) AND base_table.fp < Int64(3000000) THEN base_table.fp ELSE NULL END)), min(min(CASE WHEN base_table.fp > Int64(0) AND base_table.fp < Int64(3000000) THEN base_table.fp ELSE NULL END)), uddsketch_merge(Int64(128),Float64(0.01),uddsketch_state(Int64(128),Float64(0.01),CASE WHEN base_table.tti > Int64(0) AND base_table.tti < Int64(3000000) THEN base_table.tti ELSE NULL END)), max(max(CASE WHEN base_table.tti > Int64(0) AND base_table.tti < Int64(3000000) THEN base_table.tti ELSE NULL END)), min(min(CASE WHEN base_table.tti > Int64(0) AND base_table.tti < Int64(3000000) THEN base_table.tti ELSE NULL END)), uddsketch_merge(Int64(128),Float64(0.01),uddsketch_state(Int64(128),Float64(0.01),CASE WHEN base_table.fid > Int64(0) AND base_table.fid < Int64(3000000) THEN base_table.fid ELSE NULL END)), max(max(CASE WHEN base_table.fid > Int64(0) AND base_table.fid < Int64(3000000) THEN base_table.fid ELSE NULL END)), min(min(CASE WHEN base_table.fid > Int64(0) AND base_table.fid < Int64(3000000) THEN base_table.fid ELSE NULL END)), max(max(base_table.shard_key))]_| |_|_CoalesceBatchesExec: target_batch_size=8192_| @@ -624,7 +628,11 @@ where +-+-+ | logical_plan_| Projection: count(*) AS count(*)_| |_|_Aggregate: groupBy=[[]], aggr=[[sum(count(*)) AS count(*)]]_| -|_|_MergeScan [is_placeholder=false]_| +|_|_MergeScan [is_placeholder=false, remote_input=[_| +|_| Aggregate: groupBy=[[]], aggr=[[count(base_table.time) AS count(*)]]_| +|_|_Filter: CAST(base_table.time AS Timestamp(Millisecond, Some("+00:00"))) >= CAST(now() AS Timestamp(Millisecond, Some("+00:00")))_| +|_|_TableScan: base_table_| +|_| ]]_| | physical_plan | AggregateExec: mode=Final, gby=[], aggr=[count(*)]_| |_|_CoalescePartitionsExec_| |_|_AggregateExec: mode=Partial, gby=[], aggr=[count(*)]_| diff --git a/tests/cases/distributed/explain/subqueries.result b/tests/cases/distributed/explain/subqueries.result index aff0ffc4b9..feb317c273 100644 --- a/tests/cases/distributed/explain/subqueries.result +++ b/tests/cases/distributed/explain/subqueries.result @@ -14,9 +14,14 @@ EXPLAIN SELECT * FROM integers WHERE i IN ((SELECT i FROM integers)) ORDER BY i; +-+-+ | logical_plan_| Sort: integers.i ASC NULLS LAST_| |_|_LeftSemi Join: integers.i = __correlated_sq_1.i_| -|_|_MergeScan [is_placeholder=false]_| +|_|_MergeScan [is_placeholder=false, remote_input=[_| +|_| TableScan: integers_| +|_| ]]_| |_|_SubqueryAlias: __correlated_sq_1_| -|_|_MergeScan [is_placeholder=false]_| +|_|_MergeScan [is_placeholder=false, remote_input=[_| +|_| Projection: integers.i_| +|_|_TableScan: integers_| +|_| ]]_| | physical_plan | SortPreservingMergeExec: [i@0 ASC NULLS LAST]_| |_|_SortExec: expr=[i@0 ASC NULLS LAST], preserve_partitioning=[true]_| |_|_CoalesceBatchesExec: target_batch_size=8192_| @@ -43,10 +48,14 @@ EXPLAIN SELECT * FROM integers i1 WHERE EXISTS(SELECT i FROM integers WHERE i=i1 | logical_plan_| Sort: i1.i ASC NULLS LAST_| |_|_LeftSemi Join: i1.i = __correlated_sq_1.i_| |_|_SubqueryAlias: i1_| -|_|_MergeScan [is_placeholder=false]_| +|_|_MergeScan [is_placeholder=false, remote_input=[_| +|_| TableScan: integers_| +|_| ]]_| |_|_SubqueryAlias: __correlated_sq_1_| |_|_Projection: integers.i_| -|_|_MergeScan [is_placeholder=false]_| +|_|_MergeScan [is_placeholder=false, remote_input=[_| +|_| TableScan: integers_| +|_| ]]_| | physical_plan | SortPreservingMergeExec: [i@0 ASC NULLS LAST]_| |_|_SortExec: expr=[i@0 ASC NULLS LAST], preserve_partitioning=[true]_| |_|_CoalesceBatchesExec: target_batch_size=8192_| @@ -85,9 +94,13 @@ order by t.i desc; |_|_Cross Join:_| |_|_Filter: integers.i IS NOT NULL_| |_|_Projection: integers.i_| -|_|_MergeScan [is_placeholder=false]_| +|_|_MergeScan [is_placeholder=false, remote_input=[_| +|_| TableScan: integers_| +|_| ]]_| |_|_Projection:_| -|_|_MergeScan [is_placeholder=false]_| +|_|_MergeScan [is_placeholder=false, remote_input=[_| +|_| TableScan: other_| +|_| ]]_| | physical_plan | SortPreservingMergeExec: [i@0 DESC]_| |_|_SortExec: expr=[i@0 DESC], preserve_partitioning=[true]_| |_|_CrossJoinExec_| @@ -116,9 +129,15 @@ EXPLAIN INSERT INTO other SELECT i, 2 FROM integers WHERE i=(SELECT MAX(i) FROM | | Projection: integers.i AS i, TimestampMillisecond(2, None) AS j | | | Inner Join: integers.i = __scalar_sq_1.max(integers.i) | | | Projection: integers.i | -| | MergeScan [is_placeholder=false] | +| | MergeScan [is_placeholder=false, remote_input=[ | +| | TableScan: integers | +| | ]] | | | SubqueryAlias: __scalar_sq_1 | -| | MergeScan [is_placeholder=false] | +| | MergeScan [is_placeholder=false, remote_input=[ | +| | Projection: max(integers.i) | +| | Aggregate: groupBy=[[]], aggr=[[max(integers.i)]] | +| | TableScan: integers | +| | ]] | | physical_plan_error | Error during planning: failed to resolve catalog: datafusion | +---------------------+-------------------------------------------------------------------+ diff --git a/tests/cases/distributed/optimizer/filter_push_down.result b/tests/cases/distributed/optimizer/filter_push_down.result index c9744b76be..bafff97a08 100644 --- a/tests/cases/distributed/optimizer/filter_push_down.result +++ b/tests/cases/distributed/optimizer/filter_push_down.result @@ -252,10 +252,14 @@ EXPLAIN SELECT * FROM (SELECT 0=1 AS cond FROM integers i1, integers i2) a1 WHER |_|_Cross Join:_| |_|_SubqueryAlias: i1_| |_|_Projection:_| -|_|_MergeScan [is_placeholder=false]_| +|_|_MergeScan [is_placeholder=false, remote_input=[ | +|_| TableScan: integers_| +|_| ]]_| |_|_SubqueryAlias: i2_| |_|_Projection:_| -|_|_MergeScan [is_placeholder=false]_| +|_|_MergeScan [is_placeholder=false, remote_input=[ | +|_| TableScan: integers_| +|_| ]]_| | physical_plan | CoalescePartitionsExec_| |_|_ProjectionExec: expr=[false as cond]_| |_|_CrossJoinExec_| diff --git a/tests/cases/distributed/optimizer/order_by.result b/tests/cases/distributed/optimizer/order_by.result index 45ee66a6c5..135e52509e 100644 --- a/tests/cases/distributed/optimizer/order_by.result +++ b/tests/cases/distributed/optimizer/order_by.result @@ -4,7 +4,10 @@ explain select * from numbers; +---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | plan_type | plan | +---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| logical_plan | MergeScan [is_placeholder=false] | +| logical_plan | MergeScan [is_placeholder=false, remote_input=[ | +| | Projection: numbers.number | +| | TableScan: numbers | +| | ]] | | physical_plan | StreamScanAdapter: [], schema: [Schema { fields: [Field { name: "number", data_type: UInt32, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }], metadata: {"greptime:version": "0"} }] | | | | +---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -15,7 +18,11 @@ explain select * from numbers order by number desc; +---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | plan_type | plan | +---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| logical_plan | MergeScan [is_placeholder=false] | +| logical_plan | MergeScan [is_placeholder=false, remote_input=[ | +| | Sort: numbers.number DESC NULLS FIRST | +| | Projection: numbers.number | +| | TableScan: numbers | +| | ]] | | physical_plan | SortExec: expr=[number@0 DESC], preserve_partitioning=[false] | | | StreamScanAdapter: [], schema: [Schema { fields: [Field { name: "number", data_type: UInt32, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }], metadata: {"greptime:version": "0"} }] | | | | @@ -27,7 +34,11 @@ explain select * from numbers order by number asc; +---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | plan_type | plan | +---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| logical_plan | MergeScan [is_placeholder=false] | +| logical_plan | MergeScan [is_placeholder=false, remote_input=[ | +| | Sort: numbers.number ASC NULLS LAST | +| | Projection: numbers.number | +| | TableScan: numbers | +| | ]] | | physical_plan | SortExec: expr=[number@0 ASC NULLS LAST], preserve_partitioning=[false] | | | StreamScanAdapter: [], schema: [Schema { fields: [Field { name: "number", data_type: UInt32, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }], metadata: {"greptime:version": "0"} }] | | | | @@ -39,7 +50,12 @@ explain select * from numbers order by number desc limit 10; +---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | plan_type | plan | +---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| logical_plan | MergeScan [is_placeholder=false] | +| logical_plan | MergeScan [is_placeholder=false, remote_input=[ | +| | Limit: skip=0, fetch=10 | +| | Sort: numbers.number DESC NULLS FIRST | +| | Projection: numbers.number | +| | TableScan: numbers | +| | ]] | | physical_plan | SortExec: TopK(fetch=10), expr=[number@0 DESC], preserve_partitioning=[false] | | | StreamScanAdapter: [], schema: [Schema { fields: [Field { name: "number", data_type: UInt32, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }], metadata: {"greptime:version": "0"} }] | | | | @@ -51,7 +67,12 @@ explain select * from numbers order by number asc limit 10; +---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | plan_type | plan | +---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| logical_plan | MergeScan [is_placeholder=false] | +| logical_plan | MergeScan [is_placeholder=false, remote_input=[ | +| | Limit: skip=0, fetch=10 | +| | Sort: numbers.number ASC NULLS LAST | +| | Projection: numbers.number | +| | TableScan: numbers | +| | ]] | | physical_plan | SortExec: TopK(fetch=10), expr=[number@0 ASC NULLS LAST], preserve_partitioning=[false] | | | StreamScanAdapter: [], schema: [Schema { fields: [Field { name: "number", data_type: UInt32, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }], metadata: {"greptime:version": "0"} }] | | | | diff --git a/tests/cases/standalone/common/order/order_by_exceptions.result b/tests/cases/standalone/common/order/order_by_exceptions.result index 6385b9d721..be789c821e 100644 --- a/tests/cases/standalone/common/order/order_by_exceptions.result +++ b/tests/cases/standalone/common/order/order_by_exceptions.result @@ -70,8 +70,14 @@ EXPLAIN SELECT a % 2, b FROM test UNION SELECT a % 2 AS k, b FROM test ORDER BY | logical_plan | Sort: Int64(-1) ASC NULLS LAST | | | Aggregate: groupBy=[[test.a % Int64(2), test.b]], aggr=[[]] | | | Union | -| | MergeScan [is_placeholder=false] | -| | MergeScan [is_placeholder=false] | +| | MergeScan [is_placeholder=false, remote_input=[ | +| | Projection: CAST(test.a AS Int64) % Int64(2) AS test.a % Int64(2), test.b | +| | TableScan: test | +| | ]] | +| | MergeScan [is_placeholder=false, remote_input=[ | +| | Projection: CAST(test.a AS Int64) % Int64(2) AS test.a % Int64(2), test.b | +| | TableScan: test | +| | ]] | | physical_plan | CoalescePartitionsExec | | | AggregateExec: mode=SinglePartitioned, gby=[test.a % Int64(2)@0 as test.a % Int64(2), b@1 as b], aggr=[] | | | InterleaveExec | diff --git a/tests/cases/standalone/common/range/nest.result b/tests/cases/standalone/common/range/nest.result index 016b658bd3..89c0b9c8ff 100644 --- a/tests/cases/standalone/common/range/nest.result +++ b/tests/cases/standalone/common/range/nest.result @@ -57,7 +57,9 @@ EXPLAIN SELECT ts, host, min(val) RANGE '5s' FROM host ALIGN '5s'; +-+-+ | logical_plan_| RangeSelect: range_exprs=[min(host.val) RANGE 5s], align=5000ms, align_to=0ms, align_by=[host.host], time_index=ts | |_|_Projection: host.ts, host.host, host.val_| -|_|_MergeScan [is_placeholder=false]_| +|_|_MergeScan [is_placeholder=false, remote_input=[_| +|_| TableScan: host_| +|_| ]]_| | physical_plan | RangeSelectExec: range_expr=[min(host.val) RANGE 5s], align=5000ms, align_to=0ms, align_by=[host@1], time_index=ts | |_|_CoalescePartitionsExec_| |_|_MergeScanExec: REDACTED diff --git a/tests/cases/standalone/common/tql-explain-analyze/explain.result b/tests/cases/standalone/common/tql-explain-analyze/explain.result index bc3ebc0b35..4a3aa78b44 100644 --- a/tests/cases/standalone/common/tql-explain-analyze/explain.result +++ b/tests/cases/standalone/common/tql-explain-analyze/explain.result @@ -12,13 +12,19 @@ Affected Rows: 3 -- SQLNESS REPLACE (peers.*) REDACTED TQL EXPLAIN (0, 10, '5s') test; -+---------------+-------------------------------------------------+ -| plan_type | plan | -+---------------+-------------------------------------------------+ -| logical_plan | MergeScan [is_placeholder=false] | ++---------------+--------------------------------------------------------------------------------------------------------------+ +| plan_type | plan | ++---------------+--------------------------------------------------------------------------------------------------------------+ +| logical_plan | MergeScan [is_placeholder=false, remote_input=[ | +| | PromInstantManipulate: range=[0..0], lookback=[300000], interval=[300000], time index=[j] | +| | PromSeriesDivide: tags=["k"] | +| | Sort: test.k ASC NULLS FIRST, test.j ASC NULLS FIRST | +| | Filter: test.j >= TimestampMillisecond(-300000, None) AND test.j <= TimestampMillisecond(300000, None) | +| | TableScan: test | +| | ]] | | physical_plan | MergeScanExec: REDACTED -| | | -+---------------+-------------------------------------------------+ +| | | ++---------------+--------------------------------------------------------------------------------------------------------------+ -- 'lookback' parameter is not fully supported, the test has to be updated -- explain at 0s, 5s and 10s. No point at 0s. @@ -26,26 +32,38 @@ TQL EXPLAIN (0, 10, '5s') test; -- SQLNESS REPLACE (peers.*) REDACTED TQL EXPLAIN (0, 10, '1s', '2s') test; -+---------------+-------------------------------------------------+ -| plan_type | plan | -+---------------+-------------------------------------------------+ -| logical_plan | MergeScan [is_placeholder=false] | ++---------------+----------------------------------------------------------------------------------------------------------+ +| plan_type | plan | ++---------------+----------------------------------------------------------------------------------------------------------+ +| logical_plan | MergeScan [is_placeholder=false, remote_input=[ | +| | PromInstantManipulate: range=[0..0], lookback=[2000], interval=[300000], time index=[j] | +| | PromSeriesDivide: tags=["k"] | +| | Sort: test.k ASC NULLS FIRST, test.j ASC NULLS FIRST | +| | Filter: test.j >= TimestampMillisecond(-2000, None) AND test.j <= TimestampMillisecond(2000, None) | +| | TableScan: test | +| | ]] | | physical_plan | MergeScanExec: REDACTED -| | | -+---------------+-------------------------------------------------+ +| | | ++---------------+----------------------------------------------------------------------------------------------------------+ -- explain at 0s, 5s and 10s. No point at 0s. -- SQLNESS REPLACE (RoundRobinBatch.*) REDACTED -- SQLNESS REPLACE (peers.*) REDACTED TQL EXPLAIN ('1970-01-01T00:00:00'::timestamp, '1970-01-01T00:00:00'::timestamp + '10 seconds'::interval, '5s') test; -+---------------+-------------------------------------------------+ -| plan_type | plan | -+---------------+-------------------------------------------------+ -| logical_plan | MergeScan [is_placeholder=false] | ++---------------+--------------------------------------------------------------------------------------------------------------+ +| plan_type | plan | ++---------------+--------------------------------------------------------------------------------------------------------------+ +| logical_plan | MergeScan [is_placeholder=false, remote_input=[ | +| | PromInstantManipulate: range=[0..0], lookback=[300000], interval=[300000], time index=[j] | +| | PromSeriesDivide: tags=["k"] | +| | Sort: test.k ASC NULLS FIRST, test.j ASC NULLS FIRST | +| | Filter: test.j >= TimestampMillisecond(-300000, None) AND test.j <= TimestampMillisecond(300000, None) | +| | TableScan: test | +| | ]] | | physical_plan | MergeScanExec: REDACTED -| | | -+---------------+-------------------------------------------------+ +| | | ++---------------+--------------------------------------------------------------------------------------------------------------+ -- explain verbose at 0s, 5s and 10s. No point at 0s. -- SQLNESS REPLACE (-+) - @@ -71,7 +89,13 @@ TQL EXPLAIN VERBOSE (0, 10, '5s') test; | logical_plan after resolve_grouping_function_| SAME TEXT AS ABOVE_| | logical_plan after type_coercion_| SAME TEXT AS ABOVE_| | logical_plan after DistPlannerAnalyzer_| Projection: test.i, test.j, test.k_| -|_|_MergeScan [is_placeholder=false]_| +|_|_MergeScan [is_placeholder=false, remote_input=[_| +|_| PromInstantManipulate: range=[0..0], lookback=[300000], interval=[300000], time index=[j]_| +|_|_PromSeriesDivide: tags=["k"]_| +|_|_Sort: test.k ASC NULLS FIRST, test.j ASC NULLS FIRST_| +|_|_Filter: test.j >= TimestampMillisecond(-300000, None) AND test.j <= TimestampMillisecond(300000, None)_| +|_|_TableScan: test_| +|_| ]]_| | analyzed_logical_plan_| SAME TEXT AS ABOVE_| | logical_plan after eliminate_nested_union_| SAME TEXT AS ABOVE_| | logical_plan after simplify_expressions_| SAME TEXT AS ABOVE_| @@ -97,7 +121,13 @@ TQL EXPLAIN VERBOSE (0, 10, '5s') test; | logical_plan after unwrap_cast_in_comparison_| SAME TEXT AS ABOVE_| | logical_plan after common_sub_expression_eliminate_| SAME TEXT AS ABOVE_| | logical_plan after eliminate_group_by_constant_| SAME TEXT AS ABOVE_| -| logical_plan after optimize_projections_| MergeScan [is_placeholder=false]_| +| logical_plan after optimize_projections_| MergeScan [is_placeholder=false, remote_input=[_| +|_| PromInstantManipulate: range=[0..0], lookback=[300000], interval=[300000], time index=[j]_| +|_|_PromSeriesDivide: tags=["k"]_| +|_|_Sort: test.k ASC NULLS FIRST, test.j ASC NULLS FIRST_| +|_|_Filter: test.j >= TimestampMillisecond(-300000, None) AND test.j <= TimestampMillisecond(300000, None)_| +|_|_TableScan: test_| +|_| ]]_| | logical_plan after ScanHintRule_| SAME TEXT AS ABOVE_| | logical_plan after eliminate_nested_union_| SAME TEXT AS ABOVE_| | logical_plan after simplify_expressions_| SAME TEXT AS ABOVE_| @@ -125,7 +155,13 @@ TQL EXPLAIN VERBOSE (0, 10, '5s') test; | logical_plan after eliminate_group_by_constant_| SAME TEXT AS ABOVE_| | logical_plan after optimize_projections_| SAME TEXT AS ABOVE_| | logical_plan after ScanHintRule_| SAME TEXT AS ABOVE_| -| logical_plan_| MergeScan [is_placeholder=false]_| +| logical_plan_| MergeScan [is_placeholder=false, remote_input=[_| +|_| PromInstantManipulate: range=[0..0], lookback=[300000], interval=[300000], time index=[j]_| +|_|_PromSeriesDivide: tags=["k"]_| +|_|_Sort: test.k ASC NULLS FIRST, test.j ASC NULLS FIRST_| +|_|_Filter: test.j >= TimestampMillisecond(-300000, None) AND test.j <= TimestampMillisecond(300000, None)_| +|_|_TableScan: test_| +|_| ]]_| | initial_physical_plan_| MergeScanExec: REDACTED |_|_| | initial_physical_plan_with_stats_| MergeScanExec: REDACTED diff --git a/tests/cases/standalone/limit/limit.result b/tests/cases/standalone/limit/limit.result index 323b8ae78d..35c11ec358 100644 --- a/tests/cases/standalone/limit/limit.result +++ b/tests/cases/standalone/limit/limit.result @@ -5,23 +5,37 @@ SELECT * FROM (SELECT SUM(number) FROM numbers LIMIT 100000000000) LIMIT 0; EXPLAIN SELECT * FROM (SELECT SUM(number) FROM numbers LIMIT 100000000000) LIMIT 0; -+---------------+----------------------------------+ -| plan_type | plan | -+---------------+----------------------------------+ -| logical_plan | MergeScan [is_placeholder=false] | -| physical_plan | EmptyExec | -| | | -+---------------+----------------------------------+ ++---------------+-------------------------------------------------------------------------------+ +| plan_type | plan | ++---------------+-------------------------------------------------------------------------------+ +| logical_plan | MergeScan [is_placeholder=false, remote_input=[ | +| | Limit: skip=0, fetch=0 | +| | Projection: sum(numbers.number) | +| | Limit: skip=0, fetch=100000000000 | +| | Projection: sum(numbers.number) | +| | Aggregate: groupBy=[[]], aggr=[[sum(CAST(numbers.number AS UInt64))]] | +| | TableScan: numbers | +| | ]] | +| physical_plan | EmptyExec | +| | | ++---------------+-------------------------------------------------------------------------------+ EXPLAIN SELECT * FROM (SELECT SUM(number) FROM numbers LIMIT 100000000000) WHERE 1=0; -+---------------+----------------------------------+ -| plan_type | plan | -+---------------+----------------------------------+ -| logical_plan | MergeScan [is_placeholder=false] | -| physical_plan | EmptyExec | -| | | -+---------------+----------------------------------+ ++---------------+-------------------------------------------------------------------------------+ +| plan_type | plan | ++---------------+-------------------------------------------------------------------------------+ +| logical_plan | MergeScan [is_placeholder=false, remote_input=[ | +| | Projection: sum(numbers.number) | +| | Filter: Int64(1) = Int64(0) | +| | Limit: skip=0, fetch=100000000000 | +| | Projection: sum(numbers.number) | +| | Aggregate: groupBy=[[]], aggr=[[sum(CAST(numbers.number AS UInt64))]] | +| | TableScan: numbers | +| | ]] | +| physical_plan | EmptyExec | +| | | ++---------------+-------------------------------------------------------------------------------+ CREATE TABLE test (a TIMESTAMP TIME INDEX, b INTEGER); diff --git a/tests/cases/standalone/optimizer/order_by.result b/tests/cases/standalone/optimizer/order_by.result index 322a7c5a59..78870479f8 100644 --- a/tests/cases/standalone/optimizer/order_by.result +++ b/tests/cases/standalone/optimizer/order_by.result @@ -3,7 +3,10 @@ explain select * from numbers; +---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | plan_type | plan | +---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| logical_plan | MergeScan [is_placeholder=false] | +| logical_plan | MergeScan [is_placeholder=false, remote_input=[ | +| | Projection: numbers.number | +| | TableScan: numbers | +| | ]] | | physical_plan | StreamScanAdapter: [], schema: [Schema { fields: [Field { name: "number", data_type: UInt32, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }], metadata: {"greptime:version": "0"} }] | | | | +---------------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ @@ -13,7 +16,11 @@ explain select * from numbers order by number desc; +---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | plan_type | plan | +---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| logical_plan | MergeScan [is_placeholder=false] | +| logical_plan | MergeScan [is_placeholder=false, remote_input=[ | +| | Sort: numbers.number DESC NULLS FIRST | +| | Projection: numbers.number | +| | TableScan: numbers | +| | ]] | | physical_plan | SortExec: expr=[number@0 DESC], preserve_partitioning=[false] | | | StreamScanAdapter: [], schema: [Schema { fields: [Field { name: "number", data_type: UInt32, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }], metadata: {"greptime:version": "0"} }] | | | | @@ -24,7 +31,11 @@ explain select * from numbers order by number asc; +---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | plan_type | plan | +---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| logical_plan | MergeScan [is_placeholder=false] | +| logical_plan | MergeScan [is_placeholder=false, remote_input=[ | +| | Sort: numbers.number ASC NULLS LAST | +| | Projection: numbers.number | +| | TableScan: numbers | +| | ]] | | physical_plan | SortExec: expr=[number@0 ASC NULLS LAST], preserve_partitioning=[false] | | | StreamScanAdapter: [], schema: [Schema { fields: [Field { name: "number", data_type: UInt32, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }], metadata: {"greptime:version": "0"} }] | | | | @@ -35,7 +46,12 @@ explain select * from numbers order by number desc limit 10; +---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | plan_type | plan | +---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| logical_plan | MergeScan [is_placeholder=false] | +| logical_plan | MergeScan [is_placeholder=false, remote_input=[ | +| | Limit: skip=0, fetch=10 | +| | Sort: numbers.number DESC NULLS FIRST | +| | Projection: numbers.number | +| | TableScan: numbers | +| | ]] | | physical_plan | SortExec: TopK(fetch=10), expr=[number@0 DESC], preserve_partitioning=[false] | | | StreamScanAdapter: [], schema: [Schema { fields: [Field { name: "number", data_type: UInt32, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }], metadata: {"greptime:version": "0"} }] | | | | @@ -46,7 +62,12 @@ explain select * from numbers order by number asc limit 10; +---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ | plan_type | plan | +---------------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+ -| logical_plan | MergeScan [is_placeholder=false] | +| logical_plan | MergeScan [is_placeholder=false, remote_input=[ | +| | Limit: skip=0, fetch=10 | +| | Sort: numbers.number ASC NULLS LAST | +| | Projection: numbers.number | +| | TableScan: numbers | +| | ]] | | physical_plan | SortExec: TopK(fetch=10), expr=[number@0 ASC NULLS LAST], preserve_partitioning=[false] | | | StreamScanAdapter: [], schema: [Schema { fields: [Field { name: "number", data_type: UInt32, nullable: false, dict_id: 0, dict_is_ordered: false, metadata: {} }], metadata: {"greptime:version": "0"} }] | | | |