From 462739d22ebdd971084cd4aeb3dd3fc555c321f7 Mon Sep 17 00:00:00 2001 From: Gabriel <45515538+gabotechs@users.noreply.github.com> Date: Tue, 30 Jun 2026 12:48:43 +0200 Subject: [PATCH 01/12] Add cost model (#486) This is one PR from the following stack of PRs: - https://github.com/datafusion-contrib/datafusion-distributed/pull/477 - https://github.com/datafusion-contrib/datafusion-distributed/pull/463 - https://github.com/datafusion-contrib/datafusion-distributed/pull/464 - https://github.com/datafusion-contrib/datafusion-distributed/pull/478 - https://github.com/datafusion-contrib/datafusion-distributed/pull/479 - https://github.com/datafusion-contrib/datafusion-distributed/pull/486 <- you are here - https://github.com/datafusion-contrib/datafusion-distributed/pull/432 --- Mostly rescued from: - https://github.com/datafusion-contrib/datafusion-distributed/pull/311 This PR is pretty big, but the whole purpose is to expose a very simple function: ```rust pub(crate) fn calculate_cost(plan: &Arc, cfg: &DistributedConfig) -> Result; ``` While keeping everything else private to the rest of the codebase. --- This PR introduces a cost model used in [Adaptive task count assignation](https://github.com/datafusion-contrib/datafusion-distributed/pull/432), that attributes a compute cost to a plan based on: 1. The `Statistics` available by normal DataFusion mechanisms (`ExecutionPlan::partition_statistics()`) 2. The compute time complexity of the different operators in a plan The whole meat of this PR lives in the src/distributed_planner/statistics/compute_per_node.rs file: it's in charge of attributing a time complexity to the different `ExecutionPlan` implementations using big O notation. For example: ```rust let plan = plan_costs(r#"SELECT * FROM weather WHERE "MinTemp" > 5"#, 1).await; assert_snapshot!(plan, @r" O((out_Cols+Col0)) | FilterExec: MinTemp@0 > 5 O(out_Cols) | DataSourceExec: file_groups={...} "); ``` In this example: - `DataSourceExec` needs to allocate all the `RecordBatch`es for all the output columns, as it's the data source, so it's time complexity is `O(out_Cols)`, as its compute complexity linearly scales with the amount of columns it needs to allocate. - `FilterExec` needs to: 1. Perform a linear predicate evaluation over the `MinTemp` column (`O(Col0)`) 2. Allocate full new `RecordBatch`es for all output columns based on rows filtered by the evaulated predicate (`O(out_Cols)`) The tests in complexity_cpu.rs and complexity_memory.rs contains several examples of this for the different operators, which can go from pretty simple (`FilterExec`, `ProjectionExec`), to very complex (`HashJoinExec`). Once the time complexity in big O notation is attributed to a node, doing a simple multiplication math of the columns appearing in the notation by the estimated `byte_size` of those columns (given by `Statistics`), gives the compute cost measured in bytes. --- src/distributed_planner/mod.rs | 1 + .../statistics/complexity.rs | 153 +++ .../statistics/complexity_cpu.rs | 874 ++++++++++++++++++ .../statistics/complexity_memory.rs | 256 +++++ .../statistics/complexity_network.rs | 26 + src/distributed_planner/statistics/cost.rs | 55 ++ .../statistics/default_bytes_for_datatype.rs | 137 +++ src/distributed_planner/statistics/mod.rs | 10 + .../statistics/plan_statistics.rs | 154 +++ src/test_utils/plans.rs | 39 + 10 files changed, 1705 insertions(+) create mode 100644 src/distributed_planner/statistics/complexity.rs create mode 100644 src/distributed_planner/statistics/complexity_cpu.rs create mode 100644 src/distributed_planner/statistics/complexity_memory.rs create mode 100644 src/distributed_planner/statistics/complexity_network.rs create mode 100644 src/distributed_planner/statistics/cost.rs create mode 100644 src/distributed_planner/statistics/default_bytes_for_datatype.rs create mode 100644 src/distributed_planner/statistics/mod.rs create mode 100644 src/distributed_planner/statistics/plan_statistics.rs diff --git a/src/distributed_planner/mod.rs b/src/distributed_planner/mod.rs index a1a7c9fb..f12c684c 100644 --- a/src/distributed_planner/mod.rs +++ b/src/distributed_planner/mod.rs @@ -7,6 +7,7 @@ mod partial_reduce_below_network_shuffles; mod prepare_network_boundaries; mod push_fetch_into_network_coalesce; mod session_state_builder_ext; +mod statistics; mod task_estimator; pub use distributed_config::DistributedConfig; diff --git a/src/distributed_planner/statistics/complexity.rs b/src/distributed_planner/statistics/complexity.rs new file mode 100644 index 00000000..b03c6c7e --- /dev/null +++ b/src/distributed_planner/statistics/complexity.rs @@ -0,0 +1,153 @@ +use datafusion::common::Statistics; +use std::fmt::{Debug, Formatter}; +use std::sync::Arc; + +#[derive(Clone, PartialEq)] +pub(super) enum Complexity { + /// Constant complexity + Constant(f32), + /// Linear with a specific column from a specific child. + Linear(LinearComplexity), + /// NLogM + Log(Box, Box), + /// N+M + Plus(Box, Box), + /// N*M + Multiply(Box, Box), +} + +#[derive(Clone, PartialEq, Eq)] +pub(super) enum LinearComplexity { + /// Depends on linearly with the input column with the provided index + Column(usize), + /// Depends on linearly with the all the input columns + AllColumns, + /// Depends on linearly with the input column with the provided index from the left child + ColumnFromLeft(usize), + /// Depends on linearly with the all the input columns from the left child + AllColumnsFromLeft, + /// Depends on linearly with the input column with the provided index from the right child + ColumnFromRight(usize), + /// Depends on linearly with the all the input columns from the right child + AllColumnsFromRight, + /// Depends on linearly with the all the output columns + AllOutputColumns, +} + +impl Complexity { + pub(super) fn log(self, other: Self) -> Self { + match (self, other) { + (Self::Constant(n), Self::Constant(m)) => Self::Constant(n * m.log2()), + (s, o) => Self::Log(Box::new(s), Box::new(o)), + } + } + + pub(super) fn plus(self, other: Self) -> Self { + match (self, other) { + (Self::Constant(n), Self::Constant(m)) => Self::Constant(n + m), + // (A + k1) + k2 = A + (k1 + k2): bubble constants rightward so they can fold + (Self::Plus(a, b), Self::Constant(m)) if matches!(*b, Self::Constant(_)) => { + (*a).plus((*b).plus(Self::Constant(m))) + } + (s, o) if s == o => Self::Constant(2.).multiply(s), + (s, o) => Self::Plus(Box::new(s), Box::new(o)), + } + } + + pub(super) fn multiply(self, other: Self) -> Self { + match (self, other) { + (Self::Constant(n), Self::Constant(m)) => Self::Constant(n * m), + (s, o) => Self::Multiply(Box::new(s), Box::new(o)), + } + } + + /// Computes the total bytes processed given per-child row counts. + /// Returns None if statistics are unavailable for any required input. + pub(super) fn cost( + &self, + output_stat: &Arc, + input_stats: &[Arc], + ) -> Option { + Some(match self { + Self::Constant(v) => *v as usize, + Self::Linear(linear) => match linear { + LinearComplexity::Column(i) => { + let col_stats = &input_stats.first()?.column_statistics; + *col_stats.get(*i)?.byte_size.get_value()? + } + LinearComplexity::AllColumns => { + *input_stats.first()?.total_byte_size.get_value()? + } + LinearComplexity::ColumnFromLeft(i) => { + let col_stats = &input_stats.first()?.column_statistics; + *col_stats.get(*i)?.byte_size.get_value()? + } + LinearComplexity::AllColumnsFromLeft => { + *input_stats.first()?.total_byte_size.get_value()? + } + LinearComplexity::ColumnFromRight(i) => { + let col_stats = &input_stats.last()?.column_statistics; + *col_stats.get(*i)?.byte_size.get_value()? + } + LinearComplexity::AllColumnsFromRight => { + *input_stats.last()?.total_byte_size.get_value()? + } + LinearComplexity::AllOutputColumns => *output_stat.total_byte_size.get_value()?, + }, + Self::Log(n, m) => { + let n = n.cost(output_stat, input_stats)?; + let m = m.cost(output_stat, input_stats)?; + // `ilog2` panics on 0, which happens whenever the logged input has zero estimated + // bytes/rows (e.g. an empty or fully-pruned relation). Flooring at 1 makes log2 + // contribute 0 there, i.e. sorting/merging nothing costs nothing. + n * m.checked_ilog2().unwrap_or(0) as usize + } + Self::Plus(n, m) => n + .cost(output_stat, input_stats)? + .saturating_add(m.cost(output_stat, input_stats)?), + Self::Multiply(n, m) => n + .cost(output_stat, input_stats)? + .saturating_mul(m.cost(output_stat, input_stats)?), + }) + } +} + +impl Debug for Complexity { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + fn trim_parenthesis(dbg: &Complexity) -> String { + let s = format!("{dbg:?}"); + if s.starts_with('(') && s.ends_with(')') { + s[1..s.len() - 1].to_string() + } else { + s + } + } + match self { + Self::Constant(v) => write!(f, "{v}"), + Self::Linear(linear) => match linear { + LinearComplexity::Column(i) => write!(f, "Col{i}"), + LinearComplexity::AllColumns => write!(f, "Cols"), + LinearComplexity::ColumnFromLeft(i) => write!(f, "left_Col{i}"), + LinearComplexity::AllColumnsFromLeft => write!(f, "left_Cols"), + LinearComplexity::ColumnFromRight(i) => write!(f, "right_Col{i}"), + LinearComplexity::AllColumnsFromRight => write!(f, "right_Cols"), + LinearComplexity::AllOutputColumns => write!(f, "out_Cols"), + }, + Self::Log(n, m) => write!(f, "{n:?}*Log({m:?})"), + Self::Plus(n, m) => { + if matches!(n.as_ref(), &Self::Plus(_, _)) { + write!(f, "({}+{m:?})", trim_parenthesis(n)) + } else { + write!(f, "({n:?}+{m:?})") + } + } + Self::Multiply(n, m) => { + if matches!(n.as_ref(), &Self::Multiply(_, _)) { + write!(f, "({}*{m:?})", trim_parenthesis(n)) + } else { + write!(f, "({n:?}*{m:?})") + } + } + } + } +} diff --git a/src/distributed_planner/statistics/complexity_cpu.rs b/src/distributed_planner/statistics/complexity_cpu.rs new file mode 100644 index 00000000..49ed6e77 --- /dev/null +++ b/src/distributed_planner/statistics/complexity_cpu.rs @@ -0,0 +1,874 @@ +use crate::BroadcastExec; +use crate::distributed_planner::statistics::complexity::{Complexity, LinearComplexity}; +use crate::execution_plans::ChildrenIsolatorUnionExec; +use datafusion::catalog::memory::DataSourceExec; +use datafusion::common::JoinSide; +use datafusion::physical_expr::PhysicalExpr; +use datafusion::physical_plan::aggregates::AggregateExec; +use datafusion::physical_plan::coalesce_partitions::CoalescePartitionsExec; +use datafusion::physical_plan::empty::EmptyExec; +use datafusion::physical_plan::expressions::{Column, Literal}; +use datafusion::physical_plan::filter::FilterExec; +use datafusion::physical_plan::joins::utils::{ColumnIndex, JoinFilter}; +use datafusion::physical_plan::joins::{ + CrossJoinExec, HashJoinExec, NestedLoopJoinExec, SortMergeJoinExec, SymmetricHashJoinExec, +}; +use datafusion::physical_plan::limit::{GlobalLimitExec, LocalLimitExec}; +use datafusion::physical_plan::projection::ProjectionExec; +use datafusion::physical_plan::repartition::RepartitionExec; +use datafusion::physical_plan::sorts::sort::SortExec; +use datafusion::physical_plan::sorts::sort_preserving_merge::SortPreservingMergeExec; +use datafusion::physical_plan::union::{InterleaveExec, UnionExec}; +use datafusion::physical_plan::windows::{BoundedWindowAggExec, WindowAggExec}; +use datafusion::physical_plan::{ExecutionPlan, Partitioning}; +use std::sync::Arc; + +/// Calculates the CPU cost for the provided node, without recursing into children. +pub(super) fn complexity_cpu(node: &Arc) -> Complexity { + // NestedLoopJoinExec: O(n*m) - evaluates join condition for each pair of rows + // https://github.com/apache/datafusion/blob/branch-52/datafusion/physical-plan/src/joins/nested_loop_join.rs + if let Some(node) = node.downcast_ref::() { + // Assume we need to do read all input rows one by one. + let n = Complexity::Linear(LinearComplexity::AllColumnsFromLeft); + let m = Complexity::Linear(LinearComplexity::AllColumnsFromRight); + let mut c = n.multiply(m); + // The join condition is evaluated on every (left, right) pair. We can't express the + // exact per-pair cost (it would be filter_cost * n * m), so we add the filter columns + // as a lower-bound refinement; the O(n*m) materialization term above already dominates. + if let Some(filter) = node.filter() { + c = c.plus(join_filter_complexity(filter)); + } + return c; + } + + // CrossJoinExec: O(n*m) - produces Cartesian product of all row pairs + // https://github.com/apache/datafusion/blob/branch-52/datafusion/physical-plan/src/joins/cross_join.rs + if let Some(_node) = node.downcast_ref::() { + // Assume we need to do read all input rows one by one. + let n = Complexity::Linear(LinearComplexity::AllColumnsFromLeft); + let m = Complexity::Linear(LinearComplexity::AllColumnsFromRight); + return n.multiply(m); + } + + // SortExec: O(n log n) - uses lexsort_to_indices, may spill to disk + // https://github.com/apache/datafusion/blob/branch-52/datafusion/physical-plan/src/sorts/sort.rs + if let Some(node) = node.downcast_ref::() { + // All the rows will need to be copied one by one. + let mut n = Complexity::Linear(LinearComplexity::AllColumns); + // The sort comparators read every sort key on every row, so even a plain column key costs + // its bytes (a wide UTF8 key is far costlier to compare than an int). + for expr in node.expr() { + n = n.plus(hashed_or_sorted_key_complexity(&expr.expr)) + } + return n.clone().log(n); + } + + // HashJoinExec: hash table build (O(n)) + probe (O(m)) + // https://github.com/apache/datafusion/blob/branch-52/datafusion/physical-plan/src/joins/hash_join/exec.rs + if let Some(join) = node.downcast_ref::() { + // Build side (left): concat_batches copies all data (2x read), plus hash table storage, + // plus hashing left join keys. + let mut c = Complexity::Linear(LinearComplexity::AllColumnsFromLeft) + .plus(Complexity::Linear(LinearComplexity::AllColumnsFromLeft)); + for (left_key, _) in join.on() { + c = c.plus(join_key_complexity(left_key, true)); + } + // Probe side (right): read all columns + hash right join keys + c = c.plus(Complexity::Linear(LinearComplexity::AllColumnsFromRight)); + for (_, right_key) in join.on() { + c = c.plus(join_key_complexity(right_key, false)); + } + // Optional join filter evaluated on candidate matches during the probe. + if let Some(filter) = join.filter() { + c = c.plus(join_filter_complexity(filter)); + } + return c; + } + + // SortMergeJoinExec: merge of sorted streams with comparisons + // https://github.com/apache/datafusion/blob/branch-52/datafusion/physical-plan/src/joins/sort_merge_join/exec.rs + // Unlike hash join, sort-merge doesn't buffer all data or build hash tables. It streams + // through both sorted inputs with O(max_group_size) memory, using partial_cmp comparisons + // (no hashing). Per-row cost is just key comparisons + optional filter evaluation. + if let Some(node) = node.downcast_ref::() { + let mut c: Option = None; + // Left side: compare join keys during merge + for (left_key, _) in node.on() { + let key = join_key_complexity(left_key, true); + c = Some(match c { + Some(existing) => existing.plus(key), + None => key, + }); + } + // Right side: compare join keys during merge + for (_, right_key) in node.on() { + let key = join_key_complexity(right_key, false); + c = Some(match c { + Some(existing) => existing.plus(key), + None => key, + }); + } + // Optional join filter evaluated on matched pairs during the merge. + if let Some(filter) = node.filter() { + let f = join_filter_complexity(filter); + c = Some(match c { + Some(existing) => existing.plus(f), + None => f, + }); + } + return c.unwrap_or(Complexity::Constant(1.)); + } + + // SymmetricHashJoinExec: streaming join with hash tables on both sides + // https://github.com/apache/datafusion/blob/branch-52/datafusion/physical-plan/src/joins/symmetric_hash_join.rs + // More expensive than HashJoinExec: both sides maintain hash tables, concat_batches + // runs on every incoming batch (not once at end), plus pruning interval computation + // and HashSet tracking for visited rows. + if let Some(node) = node.downcast_ref::() { + // Both sides: concat_batches on every batch (2x read) + hash table + hash keys + let mut c = Complexity::Linear(LinearComplexity::AllColumnsFromLeft) + .plus(Complexity::Linear(LinearComplexity::AllColumnsFromLeft)); + for (left_key, _) in node.on() { + c = c.plus(join_key_complexity(left_key, true)); + } + c = c + .plus(Complexity::Linear(LinearComplexity::AllColumnsFromRight)) + .plus(Complexity::Linear(LinearComplexity::AllColumnsFromRight)); + for (_, right_key) in node.on() { + c = c.plus(join_key_complexity(right_key, false)); + } + // Optional join filter evaluated on matched pairs as batches stream in. + if let Some(filter) = node.filter() { + c = c.plus(join_filter_complexity(filter)); + } + return c; + } + + // Aggregation: hash group-by keys + accumulate aggregate inputs + // https://github.com/apache/datafusion/blob/branch-52/datafusion/physical-plan/src/aggregates/mod.rs + if let Some(agg) = node.downcast_ref::() { + // Base: read all input columns for accumulation + let mut c = Complexity::Linear(LinearComplexity::AllColumns); + // Additional: evaluate and hash group-by key expressions + for (expr, _) in agg.group_expr().expr() { + c = c.plus(hashed_or_sorted_key_complexity(expr)); + } + // Per-aggregate filter expressions (e.g. COUNT(*) FILTER (WHERE ...)) + for filter in agg.filter_expr().iter().flatten() { + c = c.plus(expression_complexity(filter)); + } + return c; + } + + // Window functions: buffer partitions, compute aggregates over windows + // https://github.com/apache/datafusion/blob/branch-52/datafusion/physical-plan/src/windows/window_agg_exec.rs + if let Some(node) = node.downcast_ref::() { + // Read all input data + evaluate/hash partition key expressions + let mut c = Complexity::Linear(LinearComplexity::AllColumns); + for expr in node.partition_keys() { + c = c.plus(hashed_or_sorted_key_complexity(&expr)); + } + return c; + } + + if let Some(node) = node.downcast_ref::() { + let mut c = Complexity::Linear(LinearComplexity::AllColumns); + for expr in node.partition_keys() { + c = c.plus(hashed_or_sorted_key_complexity(&expr)); + } + return c; + } + + // SortPreservingMergeExec: merges pre-sorted streams with comparisons + // https://github.com/apache/datafusion/blob/branch-52/datafusion/physical-plan/src/sorts/sort_preserving_merge.rs + // K-way merge: O(N log K) comparisons on sort key expressions + if let Some(node) = node.downcast_ref::() { + // need to copy all rows... + let mut n = Complexity::Linear(LinearComplexity::AllColumns); + // and compare the sort keys on all of them; a plain column key still costs its bytes. + for expr in node.expr() { + n = n.plus(hashed_or_sorted_key_complexity(&expr.expr)) + } + return n; + } + + // FilterExec: evaluates predicate expression per row + // https://github.com/apache/datafusion/blob/branch-52/datafusion/physical-plan/src/filter.rs + // Cost depends on predicate complexity - LIKE/Regex operations are expensive + if let Some(node) = node.downcast_ref::() { + // It needs to perform a copy operation just to the output rows... + let n = Complexity::Linear(LinearComplexity::AllOutputColumns); + // ...and predicate evaluation on all input rows. + return n.plus(expression_complexity(node.predicate())); + } + + // ProjectionExec: cost depends on whether it's simple columns or expressions + // https://github.com/apache/datafusion/blob/branch-52/datafusion/physical-plan/src/projection.rs + if let Some(node) = node.downcast_ref::() { + let mut n: Option = None; + for expr in node.expr() { + n = if let Some(n) = n { + Some(n.plus(expression_complexity(&expr.expr))) + } else { + Some(expression_complexity(&expr.expr)) + }; + } + return n.unwrap_or(Complexity::Constant(1.)); + } + + // RepartitionExec with Hash: computes hash per row + take_arrays + // https://github.com/apache/datafusion/blob/branch-52/datafusion/physical-plan/src/repartition/mod.rs + if let Some(node) = node.downcast_ref::() { + // It needs to copy all the data for chunking it to the different output partitions... + let mut n = Complexity::Linear(LinearComplexity::AllColumns); + // And it might need to compute a hash per row based on the provided expressions; hashing a + // plain column key still costs its bytes. + match node.partitioning() { + Partitioning::Hash(expressions, _) => { + for expr in expressions { + n = n.plus(hashed_or_sorted_key_complexity(expr)) + } + } + Partitioning::RoundRobinBatch(_) => {} + Partitioning::UnknownPartitioning(_) => {} + }; + return n; + } + + // DataSourceExec: Produces data, so assume that it's an O(N) operation over all the columns. + if node.is::() { + return Complexity::Linear(LinearComplexity::AllOutputColumns); + } + + // Limit: just counts rows and stops early. + // https://github.com/apache/datafusion/blob/branch-52/datafusion/physical-plan/src/limit.rs + if node.is::() || node.is::() { + return Complexity::Constant(1.); + } + + // CoalescePartitionsExec: receives batches from partitions, just passes through the record + // batches in a zero copy manner. + // https://github.com/apache/datafusion/blob/branch-52/datafusion/physical-plan/src/coalesce_partitions.rs + if node.is::() { + return Complexity::Constant(1.0); + } + + // BroadcastExec: This node does not do any computation, does not even read the data. + if node.is::() { + return Complexity::Constant(1.); + } + + // UnionExec: combines multiple input streams, no processing + // https://github.com/apache/datafusion/blob/branch-52/datafusion/physical-plan/src/union.rs + if node.is::() || node.is::() { + return Complexity::Constant(1.); + } + + // InterleaveExec: round-robin merging of inputs, no processing + // https://github.com/apache/datafusion/blob/branch-52/datafusion/physical-plan/src/union.rs + if node.is::() { + return Complexity::Constant(1.); + } + + // EmptyExec: produces no data + // https://github.com/apache/datafusion/blob/branch-52/datafusion/physical-plan/src/empty.rs + if node.is::() { + return Complexity::Constant(1.); + } + + // For unknown node types, assume we have to do an O(N) operation over all the rows. + Complexity::Linear(LinearComplexity::AllOutputColumns) +} + +struct BytesPerRow { + processed: Option, + cols_read: Vec, +} + +fn expression_complexity(expression: &Arc) -> Complexity { + _expression_complexity(expression) + .processed + .unwrap_or(Complexity::Constant(1.)) +} + +/// Computes the complexity of processing a join key expression, including the cost of +/// reading the leaf columns from the appropriate child (left or right). +/// Unlike `expression_complexity`, this accounts for the cost of hashing/comparing +/// simple column references (which have zero evaluation cost but real I/O cost). +fn join_key_complexity(expression: &Arc, from_left: bool) -> Complexity { + let bpr = _expression_complexity(expression); + let mut result: Option = None; + for col_idx in &bpr.cols_read { + let linear = if from_left { + LinearComplexity::ColumnFromLeft(*col_idx) + } else { + LinearComplexity::ColumnFromRight(*col_idx) + }; + result = Some(match result { + Some(r) => r.plus(Complexity::Linear(linear)), + None => Complexity::Linear(linear), + }); + } + result.unwrap_or(Complexity::Constant(1.)) +} + +/// Computes the per-row processing cost of a join filter predicate. +/// +/// A `JoinFilter` is evaluated against an intermediate batch whose columns are described by +/// `column_indices`: intermediate column `i` originates from the left or right child at some +/// original index. `expression_complexity` returns a `Complexity` whose `LinearComplexity::Column` +/// terms reference those intermediate indices, so we remap each of them back onto the +/// corresponding child column before the cost can be evaluated against child statistics. +fn join_filter_complexity(filter: &JoinFilter) -> Complexity { + remap_filter_columns( + expression_complexity(filter.expression()), + filter.column_indices(), + ) +} + +/// Rewrites a `Complexity` built from a join filter's intermediate schema so that every +/// `LinearComplexity::Column` term refers to the left/right child column it actually reads. +/// Columns belonging to neither side (the mark-join sentinel) carry no child bytes, so they +/// collapse to a constant. +fn remap_filter_columns(c: Complexity, column_indices: &[ColumnIndex]) -> Complexity { + match c { + Complexity::Constant(v) => Complexity::Constant(v), + Complexity::Linear(LinearComplexity::Column(i)) => match column_indices.get(i) { + Some(ColumnIndex { + index, + side: JoinSide::Left, + }) => Complexity::Linear(LinearComplexity::ColumnFromLeft(*index)), + Some(ColumnIndex { + index, + side: JoinSide::Right, + }) => Complexity::Linear(LinearComplexity::ColumnFromRight(*index)), + _ => Complexity::Constant(1.), + }, + // `expression_complexity` only ever emits `Column` linear terms, but keep the rest + // intact so the remapping stays total. + Complexity::Linear(other) => Complexity::Linear(other), + Complexity::Log(n, m) => { + remap_filter_columns(*n, column_indices).log(remap_filter_columns(*m, column_indices)) + } + Complexity::Plus(n, m) => { + remap_filter_columns(*n, column_indices).plus(remap_filter_columns(*m, column_indices)) + } + Complexity::Multiply(n, m) => remap_filter_columns(*n, column_indices) + .multiply(remap_filter_columns(*m, column_indices)), + } +} + +/// Cost of using an expression as a hashing or comparison key. +/// +/// Unlike `expression_complexity` (which only counts the CPU of *evaluating* a `PhysicalExpr`, +/// so a bare column passthrough is free), this charges the bytes of each underlying leaf column. +/// The hashing/comparison itself is performed by the operator — hash-table build, partition +/// hashing, sort comparators — not by any expression in the plan, and its cost scales with the +/// key's byte width. Use it for group-by keys, hash-partition keys and sort keys. +fn hashed_or_sorted_key_complexity(expression: &Arc) -> Complexity { + let bpr = _expression_complexity(expression); + let mut result: Option = None; + for col_idx in &bpr.cols_read { + result = Some(match result { + Some(r) => r.plus(Complexity::Linear(LinearComplexity::Column(*col_idx))), + None => Complexity::Linear(LinearComplexity::Column(*col_idx)), + }); + } + result.unwrap_or(Complexity::Constant(1.)) +} + +fn _expression_complexity(expression: &Arc) -> BytesPerRow { + if let Some(col) = expression.downcast_ref::() { + BytesPerRow { + processed: None, + cols_read: vec![col.index()], + } + } else if expression.is::() { + BytesPerRow { + processed: None, + cols_read: vec![], + } + } else { + // Generic handler for all other expressions: CastExpr, TryCastExpr, CaseExpr, + // InListExpr, IsNullExpr, IsNotNullExpr, NotExpr, NegativeExpr, LikeExpr, + // ScalarFunctionExpr, AsyncFuncExpr, etc. + let mut bytes_per_row = BytesPerRow { + processed: None, + cols_read: vec![], + }; + // This operation processes the result of every child once. We model its per-row cost as + // the sum of (1) the processing already incurred inside each child sub-expression and + // (2) one linear pass over each leaf column feeding the child. A leaf column therefore + // contributes once per operation sitting above it, i.e. its bytes are weighted by its + // depth in the expression tree. Carrying (1) is what keeps nested operations + // (e.g. the `+` in `(a + b) * c`) from being silently dropped. + for child in expression.children() { + let c = _expression_complexity(child); + if let Some(child_processed) = c.processed { + bytes_per_row.processed = Some(match bytes_per_row.processed.take() { + Some(processed) => processed.plus(child_processed), + None => child_processed, + }); + } + for col_read in &c.cols_read { + bytes_per_row.processed = Some(match bytes_per_row.processed.take() { + Some(processed) => { + processed.plus(Complexity::Linear(LinearComplexity::Column(*col_read))) + } + None => Complexity::Linear(LinearComplexity::Column(*col_read)), + }); + } + bytes_per_row.cols_read.extend(&c.cols_read); + } + bytes_per_row + } +} + +#[cfg(test)] +mod tests { + use crate::assert_snapshot; + use crate::distributed_planner::statistics::complexity_cpu::complexity_cpu; + use crate::test_utils::plans::TestPlanBuilder; + use datafusion::common::tree_node::{Transformed, TreeNode}; + use datafusion::physical_plan::{ExecutionPlan, displayable}; + use std::cell::RefCell; + use std::sync::Arc; + /* schema for the "weather" table + + MinTemp [type=DOUBLE] [repetitiontype=OPTIONAL] + MaxTemp [type=DOUBLE] [repetitiontype=OPTIONAL] + Rainfall [type=DOUBLE] [repetitiontype=OPTIONAL] + Evaporation [type=DOUBLE] [repetitiontype=OPTIONAL] + Sunshine [type=BYTE_ARRAY] [convertedtype=UTF8] [repetitiontype=OPTIONAL] + WindGustDir [type=BYTE_ARRAY] [convertedtype=UTF8] [repetitiontype=OPTIONAL] + WindGustSpeed [type=BYTE_ARRAY] [convertedtype=UTF8] [repetitiontype=OPTIONAL] + WindDir9am [type=BYTE_ARRAY] [convertedtype=UTF8] [repetitiontype=OPTIONAL] + WindDir3pm [type=BYTE_ARRAY] [convertedtype=UTF8] [repetitiontype=OPTIONAL] + WindSpeed9am [type=BYTE_ARRAY] [convertedtype=UTF8] [repetitiontype=OPTIONAL] + WindSpeed3pm [type=INT64] [convertedtype=INT_64] [repetitiontype=OPTIONAL] + Humidity9am [type=INT64] [convertedtype=INT_64] [repetitiontype=OPTIONAL] + Humidity3pm [type=INT64] [convertedtype=INT_64] [repetitiontype=OPTIONAL] + Pressure9am [type=DOUBLE] [repetitiontype=OPTIONAL] + Pressure3pm [type=DOUBLE] [repetitiontype=OPTIONAL] + Cloud9am [type=INT64] [convertedtype=INT_64] [repetitiontype=OPTIONAL] + Cloud3pm [type=INT64] [convertedtype=INT_64] [repetitiontype=OPTIONAL] + Temp9am [type=DOUBLE] [repetitiontype=OPTIONAL] + Temp3pm [type=DOUBLE] [repetitiontype=OPTIONAL] + RainToday [type=BYTE_ARRAY] [convertedtype=UTF8] [repetitiontype=OPTIONAL] + RISK_MM [type=DOUBLE] [repetitiontype=OPTIONAL] + RainTomorrow [type=BYTE_ARRAY] [convertedtype=UTF8] [repetitiontype=OPTIONAL] + */ + + // DataSourceExec: produces data, modeled as O(N) over all output columns. + #[tokio::test] + async fn data_source_exec() { + let plan = TestPlanBuilder::new() + .target_partitions(1) + .physical_plan(r#"SELECT "MinTemp" FROM weather"#) + .await; + assert_snapshot!(plan_costs(plan), @"O(out_Cols) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MinTemp], file_type=parquet"); + } + + // FilterExec: copies the output rows + evaluates the predicate over the input rows. + #[tokio::test] + async fn filter_exec() { + let plan = TestPlanBuilder::new() + .target_partitions(1) + .physical_plan(r#"SELECT * FROM weather WHERE "MinTemp" > 5"#) + .await; + assert_snapshot!(plan_costs(plan), @r" + O((out_Cols+Col0)) | FilterExec: MinTemp@0 > 5 + O(out_Cols) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MinTemp, MaxTemp, Rainfall, Evaporation, Sunshine, WindGustDir, WindGustSpeed, WindDir9am, WindDir3pm, WindSpeed9am, WindSpeed3pm, Humidity9am, Humidity3pm, Pressure9am, Pressure3pm, Cloud9am, Cloud3pm, Temp9am, Temp3pm, RainToday, RISK_MM, RainTomorrow], file_type=parquet, predicate=MinTemp@0 > 5, pruning_predicate=MinTemp_null_count@1 != row_count@2 AND MinTemp_max@0 > 5, required_guarantees=[] + "); + } + + // ProjectionExec: cost is the sum of its expressions; plain column passthroughs are free. + #[tokio::test] + async fn projection_exec() { + let plan = TestPlanBuilder::new() + .target_partitions(1) + .physical_plan(r#"SELECT "MinTemp" + "MaxTemp" AS s FROM weather"#) + .await; + assert_snapshot!(plan_costs(plan), @"O(out_Cols) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MinTemp@0 + MaxTemp@1 as s], file_type=parquet"); + } + + // AggregateExec: reads all input columns + hashes the group-by keys. + #[tokio::test] + async fn aggregate_exec() { + let plan = TestPlanBuilder::new() + .target_partitions(1) + .physical_plan(r#"SELECT "RainToday", COUNT(*) FROM weather GROUP BY "RainToday""#) + .await; + assert_snapshot!(plan_costs(plan), @r" + O(2) | ProjectionExec: expr=[RainToday@0 as RainToday, count(Int64(1))@1 as count(*)] + O((Cols+Col0)) | AggregateExec: mode=Single, gby=[RainToday@0 as RainToday], aggr=[count(Int64(1))] + O(out_Cols) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[RainToday], file_type=parquet + "); + } + + // SortExec: O(n log n) copy + sort-key evaluation. + #[tokio::test] + async fn sort_exec() { + let plan = TestPlanBuilder::new() + .target_partitions(1) + .physical_plan(r#"SELECT * FROM weather ORDER BY "WindGustDir""#) + .await; + assert_snapshot!(plan_costs(plan), @r" + O((Cols+Col5)*Log((Cols+Col5))) | SortExec: expr=[WindGustDir@5 ASC NULLS LAST], preserve_partitioning=[false] + O(out_Cols) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MinTemp, MaxTemp, Rainfall, Evaporation, Sunshine, WindGustDir, WindGustSpeed, WindDir9am, WindDir3pm, WindSpeed9am, WindSpeed3pm, Humidity9am, Humidity3pm, Pressure9am, Pressure3pm, Cloud9am, Cloud3pm, Temp9am, Temp3pm, RainToday, RISK_MM, RainTomorrow], file_type=parquet, sort_order_for_reorder=[WindGustDir@5 ASC NULLS LAST] + "); + } + + // SortPreservingMergeExec: appears when several pre-sorted partitions are merged. + #[tokio::test] + async fn sort_preserving_merge_exec() { + let plan = TestPlanBuilder::new() + .target_partitions(4) + .physical_plan(r#"SELECT * FROM weather ORDER BY "WindGustDir""#) + .await; + assert_snapshot!(plan_costs(plan), @r" + O((Cols+Col5)) | SortPreservingMergeExec: [WindGustDir@5 ASC NULLS LAST] + O((Cols+Col5)*Log((Cols+Col5))) | SortExec: expr=[WindGustDir@5 ASC NULLS LAST], preserve_partitioning=[true] + O(out_Cols) | DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MinTemp, MaxTemp, Rainfall, Evaporation, Sunshine, WindGustDir, WindGustSpeed, WindDir9am, WindDir3pm, WindSpeed9am, WindSpeed3pm, Humidity9am, Humidity3pm, Pressure9am, Pressure3pm, Cloud9am, Cloud3pm, Temp9am, Temp3pm, RainToday, RISK_MM, RainTomorrow], file_type=parquet, sort_order_for_reorder=[WindGustDir@5 ASC NULLS LAST] + "); + } + + // RepartitionExec (Hash): copies all data + hashes the partition keys. + #[tokio::test] + async fn repartition_hash_exec() { + let plan = TestPlanBuilder::new() + .target_partitions(4) + .physical_plan(r#"SELECT "RainToday", COUNT(*) FROM weather GROUP BY "RainToday""#) + .await; + + assert_snapshot!(plan_costs(plan), @r" + O(2) | ProjectionExec: expr=[RainToday@0 as RainToday, count(Int64(1))@1 as count(*)] + O((Cols+Col0)) | AggregateExec: mode=FinalPartitioned, gby=[RainToday@0 as RainToday], aggr=[count(Int64(1))] + O((Cols+Col0)) | RepartitionExec: partitioning=Hash([RainToday@0], 4), input_partitions=3 + O((Cols+Col0)) | AggregateExec: mode=Partial, gby=[RainToday@0 as RainToday], aggr=[count(Int64(1))] + O(out_Cols) | DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[RainToday], file_type=parquet + "); + } + + // HashJoinExec: build side (2x read + key hash) + probe side (read + key hash). + #[tokio::test] + async fn hash_join_exec() { + let plan = TestPlanBuilder::new() + .target_partitions(1) + .physical_plan( + r#" + SELECT a."MinTemp", b."MaxTemp" + FROM weather a JOIN weather b ON a."RainToday" = b."RainToday" + "#, + ) + .await; + assert_snapshot!(plan_costs(plan), @r" + O(((2*left_Cols)+left_Col1+right_Cols+right_Col1)) | HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(RainToday@1, RainToday@1)], projection=[MinTemp@0, MaxTemp@2] + O(out_Cols) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MinTemp, RainToday], file_type=parquet + O(out_Cols) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] + "); + } + + // HashJoinExec with a residual filter: the equi-predicate becomes the hash join key while the + // inequality (`a.MinTemp > b.MaxTemp`) becomes a JoinFilter over an intermediate schema, so + // the cost must include the left/right columns the filter reads, not just the join keys. + #[tokio::test] + async fn hash_join_with_filter_exec() { + let plan = TestPlanBuilder::new() + .target_partitions(1) + .physical_plan( + r#" + SELECT a."MinTemp", b."MaxTemp" + FROM weather a + JOIN weather b + ON a."RainToday" = b."RainToday" + AND a."MinTemp" > b."MaxTemp" + "#, + ) + .await; + assert_snapshot!(plan_costs(plan), @r" + O(((2*left_Cols)+left_Col1+right_Cols+right_Col1+(left_Col0+right_Col0))) | HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(RainToday@1, RainToday@1)], filter=MinTemp@0 > MaxTemp@1, projection=[MinTemp@0, MaxTemp@2] + O(out_Cols) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MinTemp, RainToday], file_type=parquet + O(out_Cols) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] + "); + } + + // CrossJoinExec: O(n*m) Cartesian product over all columns of both sides. + #[tokio::test] + async fn cross_join_exec() { + let plan = TestPlanBuilder::new() + .target_partitions(1) + .physical_plan(r#"SELECT a."MinTemp", b."MaxTemp" FROM weather a CROSS JOIN weather b"#) + .await; + assert_snapshot!(plan_costs(plan), @r" + O((left_Cols*right_Cols)) | CrossJoinExec + O(out_Cols) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MinTemp], file_type=parquet + O(out_Cols) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MaxTemp], file_type=parquet + "); + } + + // NestedLoopJoinExec: produced when a join has no equi-key, only an inequality filter. + #[tokio::test] + async fn nested_loop_join_exec() { + let plan = TestPlanBuilder::new() + .target_partitions(1) + .physical_plan( + r#" + SELECT a."MinTemp", b."MaxTemp" + FROM weather a JOIN weather b ON a."MinTemp" > b."MaxTemp" + "#, + ) + .await; + assert_snapshot!(plan_costs(plan), @r" + O(((left_Cols*right_Cols)+(left_Col0+right_Col0))) | NestedLoopJoinExec: join_type=Inner, filter=MinTemp@0 > MaxTemp@1 + O(out_Cols) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MinTemp], file_type=parquet + O(out_Cols) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MaxTemp], file_type=parquet + "); + } + + // SortMergeJoinExec: produced when hash joins are disabled; streams both sorted inputs. + // Requires target_partitions > 1 + repartition_joins + !prefer_hash_join (see physical_planner). + #[tokio::test] + async fn sort_merge_join_exec() { + let plan = TestPlanBuilder::new() + .target_partitions(4) + .information_schema(true) + .prefer_hash_joins(false) + .physical_plan( + r#" + SELECT a."MinTemp", b."MaxTemp" + FROM weather a JOIN weather b ON a."RainToday" = b."RainToday" + "#, + ) + .await; + assert_snapshot!(plan_costs(plan), @r" + O(2) | ProjectionExec: expr=[MinTemp@0 as MinTemp, MaxTemp@2 as MaxTemp] + O((left_Col1+right_Col1)) | SortMergeJoinExec: join_type=Inner, on=[(RainToday@1, RainToday@1)] + O((Cols+Col1)*Log((Cols+Col1))) | SortExec: expr=[RainToday@1 ASC], preserve_partitioning=[true] + O((Cols+Col1)) | RepartitionExec: partitioning=Hash([RainToday@1], 4), input_partitions=3 + O(out_Cols) | DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MinTemp, RainToday], file_type=parquet + O((Cols+Col1)*Log((Cols+Col1))) | SortExec: expr=[RainToday@1 ASC], preserve_partitioning=[true] + O((Cols+Col1)) | RepartitionExec: partitioning=Hash([RainToday@1], 4), input_partitions=3 + O(out_Cols) | DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet + "); + } + + // BoundedWindowAggExec: window function with an ORDER BY frame (RANK). + #[tokio::test] + async fn bounded_window_agg_exec() { + let plan = TestPlanBuilder::new() + .target_partitions(1) + .physical_plan( + r#" + SELECT RANK() OVER (PARTITION BY "RainToday" ORDER BY "MaxTemp") FROM weather + "#, + ) + .await; + assert_snapshot!(plan_costs(plan), @r#" + O(1) | ProjectionExec: expr=[rank() PARTITION BY [weather.RainToday] ORDER BY [weather.MaxTemp ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@2 as rank() PARTITION BY [weather.RainToday] ORDER BY [weather.MaxTemp ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW] + O((Cols+Col1)) | BoundedWindowAggExec: wdw=[rank() PARTITION BY [weather.RainToday] ORDER BY [weather.MaxTemp ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW: Field { "rank() PARTITION BY [weather.RainToday] ORDER BY [weather.MaxTemp ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW": UInt64 }, frame: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW], mode=[Sorted] + O((Cols+Col1+Col0)*Log((Cols+Col1+Col0))) | SortExec: expr=[RainToday@1 ASC NULLS LAST, MaxTemp@0 ASC NULLS LAST], preserve_partitioning=[false] + O(out_Cols) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000002.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000000.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, sort_order_for_reorder=[RainToday@1 ASC NULLS LAST, MaxTemp@0 ASC NULLS LAST] + "#); + } + + // WindowAggExec: window aggregate without an ORDER BY (unbounded frame). + #[tokio::test] + async fn window_agg_exec() { + let plan = TestPlanBuilder::new() + .target_partitions(1) + .physical_plan( + r#"SELECT SUM("Rainfall") OVER (PARTITION BY "WindGustDir") FROM weather"#, + ) + .await; + assert_snapshot!(plan_costs(plan), @r#" + O(1) | ProjectionExec: expr=[sum(weather.Rainfall) PARTITION BY [weather.WindGustDir] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING@2 as sum(weather.Rainfall) PARTITION BY [weather.WindGustDir] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING] + O((Cols+Col1)) | WindowAggExec: wdw=[sum(weather.Rainfall) PARTITION BY [weather.WindGustDir] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING: Ok(Field { name: "sum(weather.Rainfall) PARTITION BY [weather.WindGustDir] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING", data_type: Float64, nullable: true }), frame: WindowFrame { units: Rows, start_bound: Preceding(UInt64(NULL)), end_bound: Following(UInt64(NULL)), is_causal: false }] + O((Cols+Col1)*Log((Cols+Col1))) | SortExec: expr=[WindGustDir@1 ASC NULLS LAST], preserve_partitioning=[false] + O(out_Cols) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[Rainfall, WindGustDir], file_type=parquet, sort_order_for_reorder=[WindGustDir@1 ASC NULLS LAST] + "#); + } + + // UnionExec: combines input streams with no per-row processing. + #[tokio::test] + async fn union_exec() { + let plan = TestPlanBuilder::new() + .target_partitions(1) + .physical_plan( + r#" + SELECT "MinTemp" AS t FROM weather + UNION ALL + SELECT "MaxTemp" AS t FROM weather + "#, + ) + .await; + assert_snapshot!(plan_costs(plan), @r" + O(1) | UnionExec + O(out_Cols) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MinTemp@0 as t], file_type=parquet + O(out_Cols) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MaxTemp@1 as t], file_type=parquet + "); + } + + // AggregateExec with no GROUP BY + CoalescePartitionsExec: the filter prevents the planner from + // answering COUNT(*) straight from parquet metadata, so a real partial aggregate runs per + // partition and is merged through a CoalescePartitionsExec before the single final aggregate. + #[tokio::test] + async fn aggregate_no_group_by_and_coalesce_partitions() { + let plan = TestPlanBuilder::new() + .target_partitions(4) + .physical_plan(r#"SELECT COUNT(*) FROM weather WHERE "MinTemp" > 5"#) + .await; + assert_snapshot!(plan_costs(plan), @r" + O(1) | ProjectionExec: expr=[count(Int64(1))@0 as count(*)] + O(Cols) | AggregateExec: mode=Final, gby=[], aggr=[count(Int64(1))] + O(1) | CoalescePartitionsExec + O(Cols) | AggregateExec: mode=Partial, gby=[], aggr=[count(Int64(1))] + O((out_Cols+Col0)) | FilterExec: MinTemp@0 > 5, projection=[] + O(Cols) | RepartitionExec: partitioning=RoundRobinBatch(4), input_partitions=3 + O(out_Cols) | DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MinTemp], file_type=parquet, predicate=MinTemp@0 > 5, pruning_predicate=MinTemp_null_count@1 != row_count@2 AND MinTemp_max@0 > 5, required_guarantees=[] + "); + } + + // GlobalLimitExec: an OFFSET can't be pushed down as a per-partition fetch, so a GlobalLimitExec + // is materialized. (LocalLimitExec shares this exact cost branch but the DF53 planner prefers to + // carry `fetch` on CoalescePartitionsExec rather than emit a separate LocalLimitExec node.) + #[tokio::test] + async fn global_limit_exec() { + let plan = TestPlanBuilder::new() + .target_partitions(4) + .physical_plan(r#"SELECT * FROM weather WHERE "MinTemp" > 5 LIMIT 10 OFFSET 5"#) + .await; + assert_snapshot!(plan_costs(plan), @r" + O(1) | GlobalLimitExec: skip=5, fetch=10 + O(1) | CoalescePartitionsExec: fetch=15 + O((out_Cols+Col0)) | FilterExec: MinTemp@0 > 5, fetch=15 + O(Cols) | RepartitionExec: partitioning=RoundRobinBatch(4), input_partitions=3 + O(out_Cols) | DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MinTemp, MaxTemp, Rainfall, Evaporation, Sunshine, WindGustDir, WindGustSpeed, WindDir9am, WindDir3pm, WindSpeed9am, WindSpeed3pm, Humidity9am, Humidity3pm, Pressure9am, Pressure3pm, Cloud9am, Cloud3pm, Temp9am, Temp3pm, RainToday, RISK_MM, RainTomorrow], file_type=parquet, predicate=MinTemp@0 > 5, pruning_predicate=MinTemp_null_count@1 != row_count@2 AND MinTemp_max@0 > 5, required_guarantees=[] + "); + } + + // EmptyExec: an always-false predicate collapses to an empty relation that produces no data. + #[tokio::test] + async fn empty_exec() { + let plan = TestPlanBuilder::new() + .target_partitions(1) + .physical_plan(r#"SELECT "MinTemp" FROM weather WHERE 1 = 0"#) + .await; + assert_snapshot!(plan_costs(plan), @"O(1) | EmptyExec"); + } + + // RoundRobin RepartitionExec: has no hash keys, so it takes the bare all-columns copy path. + #[tokio::test] + async fn round_robin_repartition_exec() { + let plan = TestPlanBuilder::new() + .target_partitions(4) + .physical_plan(r#"SELECT * FROM weather WHERE "MinTemp" > 5"#) + .await; + assert_snapshot!(plan_costs(plan), @r" + O((out_Cols+Col0)) | FilterExec: MinTemp@0 > 5 + O(Cols) | RepartitionExec: partitioning=RoundRobinBatch(4), input_partitions=3 + O(out_Cols) | DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MinTemp, MaxTemp, Rainfall, Evaporation, Sunshine, WindGustDir, WindGustSpeed, WindDir9am, WindDir3pm, WindSpeed9am, WindSpeed3pm, Humidity9am, Humidity3pm, Pressure9am, Pressure3pm, Cloud9am, Cloud3pm, Temp9am, Temp3pm, RainToday, RISK_MM, RainTomorrow], file_type=parquet, predicate=MinTemp@0 > 5, pruning_predicate=MinTemp_null_count@1 != row_count@2 AND MinTemp_max@0 > 5, required_guarantees=[] + "); + } + + // HashJoinExec in Partitioned mode: a distinct planner path from CollectLeft. The cost formula + // is the same (build 2x read + key hash, probe read + key hash), now over hash-repartitioned + // inputs rather than a collected left side. + #[tokio::test] + async fn partitioned_hash_join_exec() { + let plan = TestPlanBuilder::new() + .target_partitions(4) + .information_schema(true) + // Zero the single-partition thresholds so the planner uses Partitioned mode (hash + // repartition on both sides) instead of collecting the left side. + .hash_join_single_partition_threshold(0) + .hash_join_single_partition_threshold_rows(0) + .physical_plan( + r#" + SELECT a."MinTemp", b."MaxTemp" + FROM weather a JOIN weather b ON a."RainToday" = b."RainToday" + "#, + ) + .await; + assert_snapshot!(plan_costs(plan), @r" + O(((2*left_Cols)+left_Col1+right_Cols+right_Col1)) | HashJoinExec: mode=Partitioned, join_type=Inner, on=[(RainToday@1, RainToday@1)], projection=[MinTemp@0, MaxTemp@2] + O((Cols+Col1)) | RepartitionExec: partitioning=Hash([RainToday@1], 4), input_partitions=3 + O(out_Cols) | DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MinTemp, RainToday], file_type=parquet + O((Cols+Col1)) | RepartitionExec: partitioning=Hash([RainToday@1], 4), input_partitions=3 + O(out_Cols) | DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] + "); + } + + // InterleaveExec: unioning two identically hash-partitioned aggregates lets the planner + // interleave the partitions instead of concatenating streams. + #[tokio::test] + async fn interleave_exec() { + let plan = TestPlanBuilder::new() + .target_partitions(4) + .physical_plan( + r#" + SELECT "RainToday" AS k, COUNT(*) AS c FROM weather GROUP BY "RainToday" + UNION ALL + SELECT "RainTomorrow" AS k, COUNT(*) AS c FROM weather GROUP BY "RainTomorrow" + "#, + ) + .await; + assert_snapshot!(plan_costs(plan), @r" + O(1) | InterleaveExec + O(2) | ProjectionExec: expr=[RainToday@0 as k, count(Int64(1))@1 as c] + O((Cols+Col0)) | AggregateExec: mode=FinalPartitioned, gby=[RainToday@0 as RainToday], aggr=[count(Int64(1))] + O((Cols+Col0)) | RepartitionExec: partitioning=Hash([RainToday@0], 4), input_partitions=3 + O((Cols+Col0)) | AggregateExec: mode=Partial, gby=[RainToday@0 as RainToday], aggr=[count(Int64(1))] + O(out_Cols) | DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[RainToday], file_type=parquet + O(2) | ProjectionExec: expr=[RainTomorrow@0 as k, count(Int64(1))@1 as c] + O((Cols+Col0)) | AggregateExec: mode=FinalPartitioned, gby=[RainTomorrow@0 as RainTomorrow], aggr=[count(Int64(1))] + O((Cols+Col0)) | RepartitionExec: partitioning=Hash([RainTomorrow@0], 4), input_partitions=3 + O((Cols+Col0)) | AggregateExec: mode=Partial, gby=[RainTomorrow@0 as RainTomorrow], aggr=[count(Int64(1))] + O(out_Cols) | DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[RainTomorrow], file_type=parquet + "); + } + + // Default fallback for unhandled nodes: `SELECT 1` plans a PlaceholderRowExec, which has no + // dedicated branch and therefore takes the catch-all O(N)-over-output-columns estimate. This is + // intentionally conservative; for a 1-row placeholder the output byte size is tiny anyway. + #[tokio::test] + async fn default_fallback_unhandled_node() { + let plan = TestPlanBuilder::new() + .target_partitions(1) + .physical_plan(r#"SELECT 1"#) + .await; + assert_snapshot!(plan_costs(plan), @r" + O(1) | ProjectionExec: expr=[1 as Int64(1)] + O(out_Cols) | PlaceholderRowExec + "); + } + + // NOTE: BroadcastExec and ChildrenIsolatorUnionExec are inserted only by the distributed + // planner (not by plain DataFusion planning), and SymmetricHashJoinExec requires unbounded + // streaming inputs — none are reachable from these parquet-backed queries. + + fn plan_costs(plan: Arc) -> String { + let mut display = String::new(); + let depth = RefCell::new(0); + plan.transform_down_up( + |plan| { + let indent = " ".repeat(*depth.borrow()); + // `one_line()` renders just this node (with its full config), not its children. + let node = displayable(plan.as_ref()).one_line().to_string(); + display += &format!( + "{indent}O({:?}) | {}\n", + complexity_cpu(&plan), + node.trim_end() + ); + *depth.borrow_mut() += 1; + Ok(Transformed::no(plan)) + }, + |plan| { + *depth.borrow_mut() -= 1; + Ok(Transformed::no(plan)) + }, + ) + .expect("Cannot fail"); + display + } +} diff --git a/src/distributed_planner/statistics/complexity_memory.rs b/src/distributed_planner/statistics/complexity_memory.rs new file mode 100644 index 00000000..f7e2a0c6 --- /dev/null +++ b/src/distributed_planner/statistics/complexity_memory.rs @@ -0,0 +1,256 @@ +use crate::BroadcastExec; +use crate::distributed_planner::statistics::complexity::{Complexity, LinearComplexity}; +use datafusion::physical_plan::ExecutionPlan; +use datafusion::physical_plan::aggregates::AggregateExec; +use datafusion::physical_plan::joins::{ + CrossJoinExec, HashJoinExec, NestedLoopJoinExec, SortMergeJoinExec, SymmetricHashJoinExec, +}; +use datafusion::physical_plan::sorts::sort::SortExec; +use datafusion::physical_plan::sorts::sort_preserving_merge::SortPreservingMergeExec; +use datafusion::physical_plan::windows::{BoundedWindowAggExec, WindowAggExec}; +use std::sync::Arc; + +/// Calculates the memory cost for the provided node, without recursing into children. +pub(super) fn complexity_memory(node: &Arc) -> Complexity { + // NestedLoopJoinExec buffers the left/build side and streams the right/probe side. Its CPU + // cost is O(left * right), but its retained memory is bounded by the build side plus small + // output/bitmap buffers. + // https://github.com/apache/datafusion/blob/branch-54/datafusion/physical-plan/src/joins/nested_loop_join.rs + if node.is::() { + return Complexity::Linear(LinearComplexity::AllColumnsFromLeft); + } + + // CrossJoinExec also loads the left/build side into memory once and combines it with the + // streamed right side. + // https://github.com/apache/datafusion/blob/branch-54/datafusion/physical-plan/src/joins/cross_join.rs + if node.is::() { + return Complexity::Linear(LinearComplexity::AllColumnsFromLeft); + } + + // SortExec buffers input batches. For a full sort, DataFusion may need both input and sorted + // output working space before spilling. For TopK, the retained heap is capped by the fetch + // output, so use the output statistics instead of full input size. + // https://github.com/apache/datafusion/blob/branch-54/datafusion/physical-plan/src/sorts/sort.rs + if let Some(node) = node.downcast_ref::() { + if node.fetch().is_some() { + return Complexity::Linear(LinearComplexity::AllOutputColumns); + } + + let input = Complexity::Linear(LinearComplexity::AllColumns); + return input.clone().plus(input); + } + + // HashJoinExec retains the left/build side in hash-table state. The right/probe side streams. + // https://github.com/apache/datafusion/blob/branch-54/datafusion/physical-plan/src/joins/hash_join/exec.rs + if node.is::() { + return Complexity::Linear(LinearComplexity::AllColumnsFromLeft); + } + + // SortMergeJoinExec streams sorted inputs and only keeps bounded merge state. + // https://github.com/apache/datafusion/blob/branch-54/datafusion/physical-plan/src/joins/sort_merge_join/exec.rs + if node.is::() { + return Complexity::Constant(0.); + } + + // SymmetricHashJoinExec keeps hash tables for both inputs. + // https://github.com/apache/datafusion/blob/branch-54/datafusion/physical-plan/src/joins/symmetric_hash_join.rs + if node.is::() { + return Complexity::Linear(LinearComplexity::AllColumnsFromLeft) + .plus(Complexity::Linear(LinearComplexity::AllColumnsFromRight)); + } + + // Hash/group aggregation retains one accumulator state per group. Without a GROUP BY the + // retained state is just the fixed set of aggregate accumulators. + // https://github.com/apache/datafusion/blob/branch-54/datafusion/physical-plan/src/aggregates/mod.rs + if let Some(agg) = node.downcast_ref::() { + if agg.group_expr().is_true_no_grouping() { + return Complexity::Constant(1.); + } + + return Complexity::Linear(LinearComplexity::AllOutputColumns); + } + + // WindowAggExec can retain full partitions for unbounded frames. BoundedWindowAggExec is only + // selected when every window expression reports bounded memory, so keep that fixed-size. + // https://github.com/apache/datafusion/blob/branch-54/datafusion/physical-plan/src/windows/window_agg_exec.rs + if node.is::() { + return Complexity::Linear(LinearComplexity::AllColumns); + } + + if node.is::() { + return Complexity::Constant(1.); + } + + // SortPreservingMergeExec performs a streaming K-way merge. + // https://github.com/apache/datafusion/blob/branch-54/datafusion/physical-plan/src/sorts/sort_preserving_merge.rs + if node.is::() { + return Complexity::Constant(0.); + } + + // BroadcastExec retains batches so several consumers can replay the same input partition. + if node.is::() { + return Complexity::Linear(LinearComplexity::AllOutputColumns); + } + + Complexity::Constant(0.) +} + +#[cfg(test)] +mod tests { + use crate::assert_snapshot; + use crate::distributed_planner::statistics::complexity_memory::complexity_memory; + use crate::test_utils::plans::TestPlanBuilder; + use datafusion::common::tree_node::{Transformed, TreeNode}; + use datafusion::physical_plan::{ExecutionPlan, displayable}; + use std::cell::RefCell; + use std::sync::Arc; + + #[tokio::test] + async fn hash_join_buffers_build_side() { + let plan = TestPlanBuilder::new() + .target_partitions(1) + .physical_plan( + r#" + SELECT a."MinTemp", b."MaxTemp" + FROM weather a JOIN weather b ON a."RainToday" = b."RainToday" + "#, + ) + .await; + assert_snapshot!(plan_memory(plan), @r" + M(left_Cols) | HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(RainToday@1, RainToday@1)], projection=[MinTemp@0, MaxTemp@2] + M(0) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MinTemp, RainToday], file_type=parquet + M(0) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] + "); + } + + #[tokio::test] + async fn cross_and_nested_loop_join_buffer_build_side() { + let cross = TestPlanBuilder::new() + .target_partitions(1) + .physical_plan(r#"SELECT a."MinTemp", b."MaxTemp" FROM weather a CROSS JOIN weather b"#) + .await; + assert_snapshot!(plan_memory(cross), @r" + M(left_Cols) | CrossJoinExec + M(0) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MinTemp], file_type=parquet + M(0) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MaxTemp], file_type=parquet + "); + + let nested = TestPlanBuilder::new() + .target_partitions(1) + .physical_plan( + r#" + SELECT a."MinTemp", b."MaxTemp" + FROM weather a JOIN weather b ON a."MinTemp" > b."MaxTemp" + "#, + ) + .await; + assert_snapshot!(plan_memory(nested), @r" + M(left_Cols) | NestedLoopJoinExec: join_type=Inner, filter=MinTemp@0 > MaxTemp@1 + M(0) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MinTemp], file_type=parquet + M(0) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MaxTemp], file_type=parquet + "); + } + + #[tokio::test] + async fn sort_buffers_input_and_topk_buffers_output() { + let full_sort = TestPlanBuilder::new() + .target_partitions(1) + .physical_plan(r#"SELECT * FROM weather ORDER BY "WindGustDir""#) + .await; + assert_snapshot!(plan_memory(full_sort), @r" + M((2*Cols)) | SortExec: expr=[WindGustDir@5 ASC NULLS LAST], preserve_partitioning=[false] + M(0) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MinTemp, MaxTemp, Rainfall, Evaporation, Sunshine, WindGustDir, WindGustSpeed, WindDir9am, WindDir3pm, WindSpeed9am, WindSpeed3pm, Humidity9am, Humidity3pm, Pressure9am, Pressure3pm, Cloud9am, Cloud3pm, Temp9am, Temp3pm, RainToday, RISK_MM, RainTomorrow], file_type=parquet, sort_order_for_reorder=[WindGustDir@5 ASC NULLS LAST] + "); + + let topk = TestPlanBuilder::new() + .target_partitions(1) + .physical_plan(r#"SELECT * FROM weather ORDER BY "WindGustDir" LIMIT 10"#) + .await; + assert_snapshot!(plan_memory(topk), @r" + M(out_Cols) | SortExec: TopK(fetch=10), expr=[WindGustDir@5 ASC NULLS LAST], preserve_partitioning=[false] + M(0) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MinTemp, MaxTemp, Rainfall, Evaporation, Sunshine, WindGustDir, WindGustSpeed, WindDir9am, WindDir3pm, WindSpeed9am, WindSpeed3pm, Humidity9am, Humidity3pm, Pressure9am, Pressure3pm, Cloud9am, Cloud3pm, Temp9am, Temp3pm, RainToday, RISK_MM, RainTomorrow], file_type=parquet, predicate=DynamicFilter [ empty ], sort_order_for_reorder=[WindGustDir@5 ASC NULLS LAST] + "); + } + + #[tokio::test] + async fn aggregate_memory_tracks_group_state() { + let grouped = TestPlanBuilder::new() + .target_partitions(1) + .physical_plan(r#"SELECT "RainToday", COUNT(*) FROM weather GROUP BY "RainToday""#) + .await; + assert_snapshot!(plan_memory(grouped), @r" + M(0) | ProjectionExec: expr=[RainToday@0 as RainToday, count(Int64(1))@1 as count(*)] + M(out_Cols) | AggregateExec: mode=Single, gby=[RainToday@0 as RainToday], aggr=[count(Int64(1))] + M(0) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[RainToday], file_type=parquet + "); + + let no_grouping = TestPlanBuilder::new() + .target_partitions(4) + .physical_plan(r#"SELECT COUNT(*) FROM weather WHERE "MinTemp" > 5"#) + .await; + assert_snapshot!(plan_memory(no_grouping), @r" + M(0) | ProjectionExec: expr=[count(Int64(1))@0 as count(*)] + M(1) | AggregateExec: mode=Final, gby=[], aggr=[count(Int64(1))] + M(0) | CoalescePartitionsExec + M(1) | AggregateExec: mode=Partial, gby=[], aggr=[count(Int64(1))] + M(0) | FilterExec: MinTemp@0 > 5, projection=[] + M(0) | RepartitionExec: partitioning=RoundRobinBatch(4), input_partitions=3 + M(0) | DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MinTemp], file_type=parquet, predicate=MinTemp@0 > 5, pruning_predicate=MinTemp_null_count@1 != row_count@2 AND MinTemp_max@0 > 5, required_guarantees=[] + "); + } + + #[tokio::test] + async fn window_memory_distinguishes_unbounded_and_bounded() { + let unbounded = TestPlanBuilder::new() + .target_partitions(1) + .physical_plan( + r#"SELECT SUM("Rainfall") OVER (PARTITION BY "WindGustDir") FROM weather"#, + ) + .await; + assert_snapshot!(plan_memory(unbounded), @r#" + M(0) | ProjectionExec: expr=[sum(weather.Rainfall) PARTITION BY [weather.WindGustDir] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING@2 as sum(weather.Rainfall) PARTITION BY [weather.WindGustDir] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING] + M(Cols) | WindowAggExec: wdw=[sum(weather.Rainfall) PARTITION BY [weather.WindGustDir] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING: Ok(Field { name: "sum(weather.Rainfall) PARTITION BY [weather.WindGustDir] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING", data_type: Float64, nullable: true }), frame: WindowFrame { units: Rows, start_bound: Preceding(UInt64(NULL)), end_bound: Following(UInt64(NULL)), is_causal: false }] + M((2*Cols)) | SortExec: expr=[WindGustDir@1 ASC NULLS LAST], preserve_partitioning=[false] + M(0) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[Rainfall, WindGustDir], file_type=parquet, sort_order_for_reorder=[WindGustDir@1 ASC NULLS LAST] + "#); + + let bounded = TestPlanBuilder::new() + .target_partitions(1) + .physical_plan( + r#" + SELECT RANK() OVER (PARTITION BY "RainToday" ORDER BY "MaxTemp") FROM weather + "#, + ) + .await; + assert_snapshot!(plan_memory(bounded), @r#" + M(0) | ProjectionExec: expr=[rank() PARTITION BY [weather.RainToday] ORDER BY [weather.MaxTemp ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@2 as rank() PARTITION BY [weather.RainToday] ORDER BY [weather.MaxTemp ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW] + M(1) | BoundedWindowAggExec: wdw=[rank() PARTITION BY [weather.RainToday] ORDER BY [weather.MaxTemp ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW: Field { "rank() PARTITION BY [weather.RainToday] ORDER BY [weather.MaxTemp ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW": UInt64 }, frame: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW], mode=[Sorted] + M((2*Cols)) | SortExec: expr=[RainToday@1 ASC NULLS LAST, MaxTemp@0 ASC NULLS LAST], preserve_partitioning=[false] + M(0) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000002.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000000.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, sort_order_for_reorder=[RainToday@1 ASC NULLS LAST, MaxTemp@0 ASC NULLS LAST] + "#); + } + + fn plan_memory(plan: Arc) -> String { + let mut display = String::new(); + let depth = RefCell::new(0); + plan.transform_down_up( + |plan| { + let indent = " ".repeat(*depth.borrow()); + let node = displayable(plan.as_ref()).one_line().to_string(); + display += &format!( + "{indent}M({:?}) | {}\n", + complexity_memory(&plan), + node.trim_end() + ); + *depth.borrow_mut() += 1; + Ok(Transformed::no(plan)) + }, + |plan| { + *depth.borrow_mut() -= 1; + Ok(Transformed::no(plan)) + }, + ) + .expect("Cannot fail"); + display + } +} diff --git a/src/distributed_planner/statistics/complexity_network.rs b/src/distributed_planner/statistics/complexity_network.rs new file mode 100644 index 00000000..c52b3393 --- /dev/null +++ b/src/distributed_planner/statistics/complexity_network.rs @@ -0,0 +1,26 @@ +use crate::distributed_planner::statistics::complexity::{Complexity, LinearComplexity}; +use crate::{BroadcastExec, NetworkBoundaryExt}; +use datafusion::physical_plan::ExecutionPlan; +use std::sync::Arc; + +/// Calculates the network cost for the provided node, without recursing into children. +pub(super) fn complexity_network(node: &Arc) -> Complexity { + if node.is_network_boundary() { + let bytes = Complexity::Linear(LinearComplexity::AllOutputColumns); + // A broadcast boundary replicates its input to every consumer task, so the bytes that + // cross the network scale with the consumer task count, unlike shuffle/coalesce which move + // each row once. The broadcast boundary's only child is always a BroadcastExec (enforced + // by NetworkBroadcastExec::try_new), which carries the replication factor. + if let Some(bcast) = node + .children() + .first() + .copied() + .and_then(|c| c.downcast_ref::()) + { + return bytes.multiply(Complexity::Constant(bcast.consumer_task_count() as f32)); + } + return bytes; + } + + Complexity::Constant(0.) +} diff --git a/src/distributed_planner/statistics/cost.rs b/src/distributed_planner/statistics/cost.rs new file mode 100644 index 00000000..9382ce09 --- /dev/null +++ b/src/distributed_planner/statistics/cost.rs @@ -0,0 +1,55 @@ +use crate::distributed_planner::statistics::complexity_cpu::complexity_cpu; +use crate::distributed_planner::statistics::complexity_memory::complexity_memory; +use crate::distributed_planner::statistics::complexity_network::complexity_network; +use crate::distributed_planner::statistics::plan_statistics::plan_statistics; +use datafusion::common::Result; +use datafusion::common::stats::Precision; +use datafusion::physical_plan::{ExecutionPlan, Statistics}; +use std::ops::AddAssign; +use std::sync::Arc; + +#[derive(Default)] +pub(crate) struct Cost { + pub(crate) cpu: Precision, + pub(crate) memory: Precision, + pub(crate) network: Precision, +} + +impl AddAssign for Cost { + fn add_assign(&mut self, rhs: Self) { + self.cpu = self.cpu.add(&rhs.cpu); + self.memory = self.memory.add(&rhs.memory); + self.network = self.network.add(&rhs.network); + } +} + +pub(crate) fn calculate_cost(plan: &Arc) -> Result { + f(plan).map(|(cost, _stats)| cost) +} + +fn f(plan: &Arc) -> Result<(Cost, Arc)> { + let children = plan.children(); + let mut child_stats = Vec::with_capacity(children.len()); + let mut acc_cost = Cost::default(); + for child in children { + let (cost, child_stat) = f(child)?; + acc_cost += cost; + child_stats.push(child_stat); + } + + let stats = plan_statistics(plan, &child_stats)?; + let new_cost = Cost { + cpu: inexact_or_absent(complexity_cpu(plan).cost(&stats, &child_stats)), + memory: inexact_or_absent(complexity_memory(plan).cost(&stats, &child_stats)), + network: inexact_or_absent(complexity_network(plan).cost(&stats, &child_stats)), + }; + acc_cost += new_cost; + Ok((acc_cost, stats)) +} + +fn inexact_or_absent(value: Option) -> Precision { + match value { + None => Precision::Absent, + Some(v) => Precision::Inexact(v), + } +} diff --git a/src/distributed_planner/statistics/default_bytes_for_datatype.rs b/src/distributed_planner/statistics/default_bytes_for_datatype.rs new file mode 100644 index 00000000..994fd6ea --- /dev/null +++ b/src/distributed_planner/statistics/default_bytes_for_datatype.rs @@ -0,0 +1,137 @@ +use datafusion::arrow::datatypes::{DataType, IntervalUnit}; + +/// Default data size estimate for variable-width columns when no statistics are available. +/// +/// Reference: Trino's PlanNodeStatsEstimate.java:40 +/// https://github.com/trinodb/trino/blob/458/core/trino-main/src/main/java/io/trino/cost/PlanNodeStatsEstimate.java#L40 +const DEFAULT_DATA_SIZE_PER_COLUMN: usize = 50; + +/// This function returns the amount of bytes each row is estimated to occupy. +/// +/// The estimation follows Trino's approach for calculating output size per row: +/// - For fixed-width (primitive) types: uses the type's fixed byte width +/// - For variable-width types: uses a default estimate plus offset overhead +/// - Accounts for validity bitmap overhead (1 bit per value, rounded to 1 byte per row) +/// +/// DataFusion has `Statistics::calculate_total_byte_size()` which uses `DataType::primitive_width()`, +/// but it returns `Precision::Absent` (unknown) when encountering any non-primitive type: +/// https://github.com/apache/datafusion/blob/branch-52/datafusion/common/src/stats.rs#L326-L347 +/// +/// For distributed query planning, we need estimates even for variable-width types to make +/// cost-based decisions about data shuffling and task count assignation. This implementation +/// provides estimates for all types following Trino's cost model. +/// +/// Reference: Trino's PlanNodeStatsEstimate.getOutputSizeForSymbol() +/// https://github.com/trinodb/trino/blob/458/core/trino-main/src/main/java/io/trino/cost/PlanNodeStatsEstimate.java#L89-L114 +pub(super) fn default_bytes_for_datatype(data_type: &DataType) -> usize { + // 1 byte for validity bitmap per row (Arrow uses 1 bit, but we round up for estimation). + // Trino calls this the "is null" boolean array. + // Reference: PlanNodeStatsEstimate.java:98-99 + // https://github.com/trinodb/trino/blob/458/core/trino-main/src/main/java/io/trino/cost/PlanNodeStatsEstimate.java#L98-L99 + const VALIDITY_OVERHEAD: usize = 1; + + // Handle non-primitive types. + // NOTE: The cases below are Arrow-specific adaptations. Trino only distinguishes between + // FixedWidthType and variable-width types, using Integer.BYTES (4) for offsets. + // Reference: PlanNodeStatsEstimate.java:108-109 + // https://github.com/trinodb/trino/blob/458/core/trino-main/src/main/java/io/trino/cost/PlanNodeStatsEstimate.java#L108-L109 + match data_type { + // Primitive types from data_type.primitive_width() + DataType::Int8 => VALIDITY_OVERHEAD + 1, + DataType::Int16 => VALIDITY_OVERHEAD + 2, + DataType::Int32 => VALIDITY_OVERHEAD + 4, + DataType::Int64 => VALIDITY_OVERHEAD + 8, + DataType::UInt8 => VALIDITY_OVERHEAD + 1, + DataType::UInt16 => VALIDITY_OVERHEAD + 2, + DataType::UInt32 => VALIDITY_OVERHEAD + 4, + DataType::UInt64 => VALIDITY_OVERHEAD + 8, + DataType::Float16 => VALIDITY_OVERHEAD + 2, + DataType::Float32 => VALIDITY_OVERHEAD + 4, + DataType::Float64 => VALIDITY_OVERHEAD + 8, + DataType::Timestamp(_, _) => VALIDITY_OVERHEAD + 8, + DataType::Date32 => VALIDITY_OVERHEAD + 4, + DataType::Date64 => VALIDITY_OVERHEAD + 8, + DataType::Time32(_) => VALIDITY_OVERHEAD + 4, + DataType::Time64(_) => VALIDITY_OVERHEAD + 8, + DataType::Duration(_) => VALIDITY_OVERHEAD + 8, + DataType::Interval(IntervalUnit::YearMonth) => VALIDITY_OVERHEAD + 4, + DataType::Interval(IntervalUnit::DayTime) => VALIDITY_OVERHEAD + 8, + DataType::Interval(IntervalUnit::MonthDayNano) => VALIDITY_OVERHEAD + 16, + DataType::Decimal32(_, _) => VALIDITY_OVERHEAD + 4, + DataType::Decimal64(_, _) => VALIDITY_OVERHEAD + 8, + DataType::Decimal128(_, _) => VALIDITY_OVERHEAD + 16, + DataType::Decimal256(_, _) => VALIDITY_OVERHEAD + 32, + // Null type has no data (Arrow-specific) + DataType::Null => 0, + + // Boolean is stored as bits (1/8 byte per value), but we round up (Arrow-specific) + DataType::Boolean => VALIDITY_OVERHEAD + 1, + + // Fixed-size binary: just the fixed size + validity (Arrow-specific) + DataType::FixedSizeBinary(size) => VALIDITY_OVERHEAD + (*size as usize), + + // Fixed-size list: fixed count * element size (Arrow-specific) + DataType::FixedSizeList(field, size) => { + VALIDITY_OVERHEAD + (*size as usize) * default_bytes_for_datatype(field.data_type()) + } + + // Struct: sum of all child field sizes (Arrow-specific) + // Trino would treat ROW types as variable-width + DataType::Struct(fields) => fields + .iter() + .map(|f| default_bytes_for_datatype(f.data_type())) + .sum(), + + // Dictionary-encoded: just the key indices, values are shared across rows (Arrow-specific) + // Trino doesn't have dictionary encoding at the type level + DataType::Dictionary(key_type, _value_type) => default_bytes_for_datatype(key_type), + + // Union: type_id (1 byte) + max child size (Arrow-specific) + DataType::Union(fields, _) => { + let max_child_size = fields + .iter() + .map(|(_, f)| default_bytes_for_datatype(f.data_type())) + .max() + .unwrap_or(0); + 1 + max_child_size + } + + // Run-end encoded: estimate as if it were the value type (Arrow-specific) + // Actual compression depends on data distribution + DataType::RunEndEncoded(_, values) => default_bytes_for_datatype(values.data_type()), + + // Variable-width string/binary types. + // Offset size follows Trino's Integer.BYTES (4 bytes). + // Reference: PlanNodeStatsEstimate.java:109 + DataType::Utf8 | DataType::Binary => { + VALIDITY_OVERHEAD + size_of::() + DEFAULT_DATA_SIZE_PER_COLUMN + } + // Large variants use i64 offsets (Arrow-specific, Trino doesn't have large variants) + DataType::LargeUtf8 | DataType::LargeBinary => { + VALIDITY_OVERHEAD + size_of::() + DEFAULT_DATA_SIZE_PER_COLUMN + } + // View types use 16-byte inline representation (Arrow-specific) + // Reference: https://arrow.apache.org/docs/format/Columnar.html#variable-size-binary-view-layout + DataType::Utf8View | DataType::BinaryView => VALIDITY_OVERHEAD + 16, + + // List types (Arrow-specific adaptation) + // Spark assumes 1 element average for collections (SPARK-18853). Trino treats them + // as flat variable-width with 50-byte default. We follow Spark's 1-element assumption + // to avoid massive overestimation (e.g. Map was 605 bytes with 10 elements). + DataType::List(field) => { + VALIDITY_OVERHEAD + size_of::() + default_bytes_for_datatype(field.data_type()) + } + DataType::LargeList(field) => { + VALIDITY_OVERHEAD + size_of::() + default_bytes_for_datatype(field.data_type()) + } + DataType::ListView(field) | DataType::LargeListView(field) => { + VALIDITY_OVERHEAD + 8 + default_bytes_for_datatype(field.data_type()) + } + + // Map type: stored as List> (Arrow-specific) + // Uses same 1-element assumption as List types (following Spark). + DataType::Map(field, _) => { + VALIDITY_OVERHEAD + size_of::() + default_bytes_for_datatype(field.data_type()) + } // Fallback for any other types - use Trino's default + } +} diff --git a/src/distributed_planner/statistics/mod.rs b/src/distributed_planner/statistics/mod.rs new file mode 100644 index 00000000..59f1ec04 --- /dev/null +++ b/src/distributed_planner/statistics/mod.rs @@ -0,0 +1,10 @@ +mod complexity; +mod complexity_cpu; +mod complexity_memory; +mod complexity_network; +mod cost; +mod default_bytes_for_datatype; +mod plan_statistics; + +#[allow(unused)] // will be used in a follow-up PR. +pub(crate) use cost::calculate_cost; diff --git a/src/distributed_planner/statistics/plan_statistics.rs b/src/distributed_planner/statistics/plan_statistics.rs new file mode 100644 index 00000000..d3d54b8e --- /dev/null +++ b/src/distributed_planner/statistics/plan_statistics.rs @@ -0,0 +1,154 @@ +use crate::distributed_planner::statistics::default_bytes_for_datatype::default_bytes_for_datatype; +use datafusion::common::stats::Precision; +use datafusion::common::{Statistics, not_impl_err, plan_err}; +use datafusion::config::ConfigOptions; +use datafusion::error::Result; +use datafusion::execution::{SendableRecordBatchStream, TaskContext}; +use datafusion::physical_plan::execution_plan::CardinalityEffect; +use datafusion::physical_plan::{DisplayAs, DisplayFormatType, ExecutionPlan, PlanProperties}; +use delegate::delegate; +use itertools::Itertools; +use std::fmt::Formatter; +use std::sync::Arc; + +/// Ratio applied to the total number of rows for calculating the fallback value for NDVs. +/// +/// If NDVs are absent for a specific column, this ratio kicks in and is applied to the estimated +/// number of rows for calculating the final NDV value. +const FALLBACK_NDV_RATIO: f64 = 0.5; + +/// Uses upstream DataFusion stats system with some small overrides. +pub(super) fn plan_statistics( + node: &Arc, + children_stats: &[Arc], +) -> Result> { + let mut stats = partition_statistics_with_children_override(node, None, children_stats)?; + + // If rows are absent, but the children declares rows, be conservative and assume that the node + // is not going to reduce cardinality and that the row count stays the same. + if matches!(stats.num_rows, Precision::Absent) + && let Some(child_rows) = children_stats + .iter() + .flat_map(|v| v.num_rows.get_value()) + .sum1::() + { + stats.num_rows = Precision::Inexact(child_rows) + } + + let schema = node.schema(); + + for (i, col_stats) in &mut stats.column_statistics.iter_mut().enumerate() { + let Some(rows) = stats.num_rows.get_value() else { + break; + }; + + // If a column's NDV is absent, fall back to a fraction of the row count + if matches!(col_stats.distinct_count, Precision::Absent) { + let fallback_ndv = ((*rows as f64) * FALLBACK_NDV_RATIO) as usize; + col_stats.distinct_count = Precision::Inexact(fallback_ndv); + } + + // If the per-column byte size stats are not present, estimate the byte size based on the + // data type and the row count. + let Some(dt) = schema.fields.get(i).map(|v| v.data_type()) else { + return plan_err!("Field with index {i} not present in schema: {schema:?}"); + }; + + // If it turns out that we do not have `byte_size` stats, but we do have an estimated number + // of rows, do a best-effort in trying to infer the byte size for each column. + if matches!(col_stats.byte_size, Precision::Absent) { + col_stats.byte_size = + Precision::Inexact(default_bytes_for_datatype(dt).saturating_mul(*rows)) + } + } + + // If bytes are absent, let's just infer them based on the schema and the + // number of rows. + if matches!(stats.total_byte_size, Precision::Absent) { + let mut total_byte_size: usize = 0; + for col_stats in &stats.column_statistics { + total_byte_size = + total_byte_size.saturating_add(*col_stats.byte_size.get_value().unwrap_or(&0)); + } + stats.total_byte_size = Precision::Inexact(total_byte_size); + } + + Ok(Arc::new(stats)) +} + +// FIXME: because of limitations the the statistics API on DataFusion, we need to resource to +// this sketchy way of overriding child statistics, as we cannot just provide our own. +// If we don't do this: +// 1. we cannot tell nodes to compute statistics based on the ones we provide. +// 2. we recompute statistics unnecessarily across the plan +// This is tracked by https://github.com/apache/datafusion/issues/20184 upstream, and until +// that one is solved, we need to resource to this wrapper. +fn partition_statistics_with_children_override( + node: &Arc, + partition: Option, + child_stats: &[Arc], +) -> Result { + // DataFusion stats system is not very mature yet. This override layer brings in changes + // that might not have already been released or informed overrides. + let statistics_wrapped_children = child_stats + .iter() + .zip(node.children()) + .map(|(stats, child)| StatisticsWrapper { + inner: Arc::clone(child), + stats: Arc::clone(stats), + }) + .map(|v| Arc::new(v) as _) + .collect(); + + let stats = Arc::clone(node) + .with_new_children(statistics_wrapped_children)? + .partition_statistics(partition)?; + + Ok(stats.as_ref().clone()) +} + +#[derive(Debug)] +struct StatisticsWrapper { + stats: Arc, + inner: Arc, +} + +impl DisplayAs for StatisticsWrapper { + delegate! { + to self.inner { + fn fmt_as(&self, t: DisplayFormatType, f: &mut Formatter) -> std::fmt::Result; + } + } +} + +impl ExecutionPlan for StatisticsWrapper { + fn partition_statistics(&self, partition: Option) -> Result> { + if partition.is_some() { + return plan_err!("StatisticsWrapper not prepared for partition-specific stats"); + } + Ok(Arc::clone(&self.stats)) + } + + delegate! { + to self.inner { + fn name(&self) -> &str; + fn properties(&self) -> &Arc; + fn maintains_input_order(&self) -> Vec; + fn benefits_from_input_partitioning(&self) -> Vec; + fn children(&self) -> Vec<&Arc>; + fn repartitioned(&self, _target_partitions: usize, _config: &ConfigOptions) -> Result>>; + fn execute(&self, partition: usize, context: Arc) -> Result; + fn supports_limit_pushdown(&self) -> bool; + fn with_fetch(&self, _limit: Option) -> Option>; + fn fetch(&self) -> Option; + fn cardinality_effect(&self) -> CardinalityEffect; + } + } + + fn with_new_children( + self: Arc, + _: Vec>, + ) -> Result> { + not_impl_err!("with_new_children not implemented") + } +} diff --git a/src/test_utils/plans.rs b/src/test_utils/plans.rs index c5245697..7d299489 100644 --- a/src/test_utils/plans.rs +++ b/src/test_utils/plans.rs @@ -139,6 +139,9 @@ pub(crate) struct TestPlanBuilder { distributed_partial_reduce: Option, distributed_children_isolator_unions: Option, distributed_max_tasks_per_stage: Option, + prefer_hash_join: Option, + hash_join_single_partition_threshold: Option, + hash_join_single_partition_threshold_rows: Option, } #[cfg(test)] @@ -156,6 +159,9 @@ impl TestPlanBuilder { distributed_partial_reduce: None, distributed_children_isolator_unions: None, distributed_max_tasks_per_stage: None, + prefer_hash_join: None, + hash_join_single_partition_threshold: None, + hash_join_single_partition_threshold_rows: None, } } @@ -192,6 +198,21 @@ impl TestPlanBuilder { self } + pub fn prefer_hash_joins(mut self, prefer_hash_joins: bool) -> Self { + self.prefer_hash_join = Some(prefer_hash_joins); + self + } + + pub fn hash_join_single_partition_threshold(mut self, v: usize) -> Self { + self.hash_join_single_partition_threshold = Some(v); + self + } + + pub fn hash_join_single_partition_threshold_rows(mut self, v: usize) -> Self { + self.hash_join_single_partition_threshold_rows = Some(v); + self + } + pub fn broadcast_joins(mut self, enabled: bool) -> Self { self.broadcast_joins = enabled; self @@ -250,6 +271,21 @@ impl TestPlanBuilder { if let Some(enabled) = self.information_schema { config = config.with_information_schema(enabled); } + if let Some(enabled) = self.prefer_hash_join { + config.options_mut().optimizer.prefer_hash_join = enabled + } + if let Some(value) = self.hash_join_single_partition_threshold { + config + .options_mut() + .optimizer + .hash_join_single_partition_threshold = value + } + if let Some(value) = self.hash_join_single_partition_threshold_rows { + config + .options_mut() + .optimizer + .hash_join_single_partition_threshold_rows = value + } config } @@ -310,6 +346,9 @@ impl Default for TestPlanBuilder { distributed_partial_reduce: None, distributed_children_isolator_unions: None, distributed_max_tasks_per_stage: None, + prefer_hash_join: None, + hash_join_single_partition_threshold: None, + hash_join_single_partition_threshold_rows: None, } } } From 0cce7782f1b5f0ed1feae7c26ecd6cc23564cb2d Mon Sep 17 00:00:00 2001 From: Gabriel <45515538+gabotechs@users.noreply.github.com> Date: Tue, 30 Jun 2026 14:33:35 +0200 Subject: [PATCH 02/12] Rearrange if statements in planner (#514) Just a small rearrangement of the `if` branches in the inject_network_boundaries.rs file so that everything is a bit clearer and hierarchically the same. --- .../inject_network_boundaries.rs | 130 +++++++++--------- 1 file changed, 63 insertions(+), 67 deletions(-) diff --git a/src/distributed_planner/inject_network_boundaries.rs b/src/distributed_planner/inject_network_boundaries.rs index 21898440..37d5ee95 100644 --- a/src/distributed_planner/inject_network_boundaries.rs +++ b/src/distributed_planner/inject_network_boundaries.rs @@ -286,82 +286,78 @@ async fn _inject_network_boundaries( // Cap the reconciled task count by the configured max-per-stage budget. task_count = task_count.limit(nb_ctx.max_tasks()?); - // Upon reaching a hash repartition, we need to introduce a shuffle right above it. - if let Some(r_exec) = plan.downcast_ref::() { - if matches!(r_exec.partitioning(), Partitioning::Hash(_, _)) { - let input_stage = LocalStage { - query_id: nb_ctx.query_id, - num: nb_ctx.fetch_add_stage_id(), - plan: nb_ctx.plan_with_task_count(plan, task_count), - tasks: task_count.as_usize(), - }; - let result = nb_ctx - .nb_builder - .build(input_stage, TypeId::of::(), nb_ctx) - .await?; - let nb = Arc::new(NetworkShuffleExec::from_stage( - result.input_stage, - result.input_properties, - )); - return Ok(nb_ctx.plan_with_task_count(nb, result.consumer_task_count)); - } + // Upon reaching a hash repartition, we need to introduce a network shuffle right above it. + if let Some(r_exec) = plan.downcast_ref::() + && matches!(r_exec.partitioning(), Partitioning::Hash(_, _)) + { + let input_stage = LocalStage { + query_id: nb_ctx.query_id, + num: nb_ctx.fetch_add_stage_id(), + plan: nb_ctx.plan_with_task_count(plan, task_count), + tasks: task_count.as_usize(), + }; + let result = nb_ctx + .nb_builder + .build(input_stage, TypeId::of::(), nb_ctx) + .await?; + let nb = Arc::new(NetworkShuffleExec::from_stage( + result.input_stage, + result.input_properties, + )); + Ok(nb_ctx.plan_with_task_count(nb, result.consumer_task_count)) + } + // Upon reaching a broadcast, we need to introduce a network broadcast right above it. + else if let Some(_b_exec) = plan.downcast_ref::() { + let input_stage = LocalStage { + query_id: nb_ctx.query_id, + num: nb_ctx.fetch_add_stage_id(), + plan: nb_ctx.plan_with_task_count(plan, task_count), + tasks: task_count.as_usize(), + }; + let result = nb_ctx + .nb_builder + .build(input_stage, TypeId::of::(), nb_ctx) + .await?; + let nb = Arc::new(NetworkBroadcastExec::from_stage( + result.input_stage, + result.input_properties, + )); + Ok(nb_ctx.plan_with_task_count(nb, result.consumer_task_count)) + } // If the parent of the current node is either a `CoalescePartitionsExec` or a // `SortPreservingMergeExec`, a network boundary below it is necessary. - } else if let Some(parent) = parent + else if let Some(parent) = parent // If this node is a leaf node, putting a network boundary above is a bit wasteful, so // we don't want to do it. && !plan.children().is_empty() - // If the parent is trying to coalesce all partitions into one, we need to introduce - // a network coalesce right below it (or in other words, above the current node) && (parent.is::() || parent.is::()) { - // A BroadcastExec underneath a coalesce parent means the build side will cross stages. - return if plan.is::() { - let input_stage = LocalStage { - query_id: nb_ctx.query_id, - num: nb_ctx.fetch_add_stage_id(), - plan: nb_ctx.plan_with_task_count(plan, task_count), - tasks: task_count.as_usize(), - }; - let result = nb_ctx - .nb_builder - .build(input_stage, TypeId::of::(), nb_ctx) - .await?; - let nb = Arc::new(NetworkBroadcastExec::from_stage( - result.input_stage, - result.input_properties, - )); - Ok(nb_ctx.plan_with_task_count(nb, result.consumer_task_count)) - } else { - let input_stage = LocalStage { - query_id: nb_ctx.query_id, - num: nb_ctx.fetch_add_stage_id(), - plan: nb_ctx.plan_with_task_count(plan, task_count), - tasks: task_count.as_usize(), - }; - let result = nb_ctx - .nb_builder - .build(input_stage, TypeId::of::(), nb_ctx) - .await?; - if !matches!(result.consumer_task_count, Maximum(1)) { - return plan_err!( - "A NetworkCoalesceExec must return exactly a Maximum(1) annotation above" - ); - } - // The parent that triggered this branch is a `CoalescePartitionsExec` or - // `SortPreservingMergeExec`, both of which fold all partitions into one — so the - // stage above this boundary must run in exactly one task. - let nb = Arc::new(NetworkCoalesceExec::from_stage( - result.input_stage, - result.input_properties, - 1, - )); - Ok(nb_ctx.plan_with_task_count(nb, result.consumer_task_count)) + let input_stage = LocalStage { + query_id: nb_ctx.query_id, + num: nb_ctx.fetch_add_stage_id(), + plan: nb_ctx.plan_with_task_count(plan, task_count), + tasks: task_count.as_usize(), }; - } - - if parent.is_none() { + let result = nb_ctx + .nb_builder + .build(input_stage, TypeId::of::(), nb_ctx) + .await?; + if !matches!(result.consumer_task_count, Maximum(1)) { + return plan_err!( + "A NetworkCoalesceExec must return exactly a Maximum(1) annotation above" + ); + } + // The parent that triggered this branch is a `CoalescePartitionsExec` or + // `SortPreservingMergeExec`, both of which fold all partitions into one — so the + // stage above this boundary must run in exactly one task. + let nb = Arc::new(NetworkCoalesceExec::from_stage( + result.input_stage, + result.input_properties, + 1, + )); + Ok(nb_ctx.plan_with_task_count(nb, result.consumer_task_count)) + } else if parent.is_none() { // We've just finished walking the head stage's subplan. Run a final propagation so // every node in the head stage (which never crossed a stage boundary on the way up) // gets its task count recorded. From e8079c5fd04c12463f9d3c21dac467579d60f9ec Mon Sep 17 00:00:00 2001 From: Gabriel <45515538+gabotechs@users.noreply.github.com> Date: Tue, 30 Jun 2026 14:36:30 +0200 Subject: [PATCH 03/12] Show rewritten physical plan with --debug in local benchmarks (#515) Just a small QOL improvement for local benchmarks. --- benchmarks/src/run.rs | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/benchmarks/src/run.rs b/benchmarks/src/run.rs index 94345f30..0583bb41 100644 --- a/benchmarks/src/run.rs +++ b/benchmarks/src/run.rs @@ -25,15 +25,17 @@ use datafusion::common::{config_err, exec_err, not_impl_err}; use datafusion::datasource::source::DataSourceExec; use datafusion::error::{DataFusionError, Result}; use datafusion::execution::SessionStateBuilder; -use datafusion::physical_plan::display::DisplayableExecutionPlan; -use datafusion::physical_plan::{collect, displayable}; +use datafusion::physical_plan::collect; use datafusion::prelude::*; use datafusion_distributed::test_utils::localhost::LocalHostWorkerResolver; use datafusion_distributed::test_utils::work_unit_file_scan::{ WorkUnitFileScanCodec, WorkUnitFileScanConfig, WorkUnitFileScanRule, WorkUnitFileScanTaskEstimator, }; -use datafusion_distributed::{DistributedExt, NetworkBoundaryExt, SessionStateBuilderExt, Worker}; +use datafusion_distributed::{ + DistributedExt, DistributedMetricsFormat, NetworkBoundaryExt, SessionStateBuilderExt, Worker, + display_plan_ascii, rewrite_distributed_plan_with_metrics, +}; use datafusion_distributed_benchmarks::datasets::{clickbench, register_tables, tpcds, tpch}; use std::error::Error; use std::fs; @@ -211,7 +213,7 @@ impl RunOpt { })? .with_distributed_children_isolator_unions(self.children_isolator_unions)? .with_distributed_broadcast_joins(self.broadcast_joins)? - .with_distributed_metrics_collection(self.collect_metrics)? + .with_distributed_metrics_collection(self.collect_metrics || self.debug)? .with_distributed_max_tasks_per_stage(self.max_tasks_per_stage)? .with_distributed_user_codec(WorkUnitFileScanCodec) .with_distributed_task_estimator(WorkUnitFileScanTaskEstimator) @@ -324,21 +326,8 @@ impl RunOpt { let plan = ctx.sql(sql).await?; let (state, plan) = plan.into_parts(); - if self.debug { - println!("=== Logical plan ===\n{plan}\n"); - } - let plan = state.optimize(&plan)?; - if self.debug { - println!("=== Optimized logical plan ===\n{plan}\n"); - } let physical_plan = state.create_physical_plan(&plan).await?; - if self.debug { - println!( - "=== Physical plan ===\n{}\n", - displayable(physical_plan.as_ref()).indent(true) - ); - } let mut n_tasks = 0; physical_plan.clone().transform_down(|node| { if let Some(node) = node.as_network_boundary() { @@ -348,9 +337,14 @@ impl RunOpt { })?; let result = collect(physical_plan.clone(), state.task_ctx()).await?; if self.debug { + let physical_plan = rewrite_distributed_plan_with_metrics( + physical_plan.clone(), + DistributedMetricsFormat::PerTask, + ) + .await?; println!( "=== Physical plan with metrics ===\n{}\n", - DisplayableExecutionPlan::with_metrics(physical_plan.as_ref()).indent(true) + display_plan_ascii(physical_plan.as_ref(), true) ); } Ok((result, n_tasks)) From 57dcc533452a28490f7c0340c7bbb4c651d40616 Mon Sep 17 00:00:00 2001 From: Gabriel <45515538+gabotechs@users.noreply.github.com> Date: Wed, 1 Jul 2026 08:27:27 +0200 Subject: [PATCH 04/12] Adaptive task count assignation (#432) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This is one PR from the following stack of PRs: - https://github.com/datafusion-contrib/datafusion-distributed/pull/477 - https://github.com/datafusion-contrib/datafusion-distributed/pull/463 - https://github.com/datafusion-contrib/datafusion-distributed/pull/464 - https://github.com/datafusion-contrib/datafusion-distributed/pull/478 - https://github.com/datafusion-contrib/datafusion-distributed/pull/479 - https://github.com/datafusion-contrib/datafusion-distributed/pull/486 - https://github.com/datafusion-contrib/datafusion-distributed/pull/432 <- you are here --- This PR implements support for dynamic task count assignation, allowing the distributed planner to determine the optimal number of tasks for each stage based on runtime characteristics and available resources. This enables adaptive query execution where task counts are optimized for the specific execution context rather than being determined statically. There are two fundamental pieces delivered in this PR that make adaptive task count assignation possible: 1. [SamplerExec](https://github.com/datafusion-contrib/datafusion-distributed/pull/432/changes#diff-17bd8d290d703ba259143955ade0265fd22463f45cfe752c6071ab136331fe7f) 2. [prepare_dynamic_plan](https://github.com/datafusion-contrib/datafusion-distributed/pull/432/changes#diff-01ffef8aa9ef0e8104dfe1c133320f1c1edd157fd968798b9206a3e04dd95228) ## SamplerExec This is a new `ExecutionPlan` implementation that peeks a few initial record batches before execution, gathers statistics over them, and then reports a `LoadInfo` message to the `prepare_dynamic_plan` running on the coordinator ```rust ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ ┌─────────────────────┐ │ │ │ │ ┌───────────────────▶│ DistributedExec │◀──────────────────────┐ │ │ │ │ │ │ │ └─────────────────────┘ │ ┌──┴─────┐ │ ┌─────────────────────┐ │ ┌─────┴──┐ │LoadInfo│ │ │ │LoadInfo│ └──┬─────┘ │ │ ... │ │ └─────┬──┘ │ │ │ │ │ │ └─────────────────────┘ │ │ │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ │ │ │ ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐│ │ ┌─────────────────────┐ ┌─────────────────────┐ │ │ │ │ ProducerHead │ │ │ │ ProducerHead │ ││ │ │ (RepartitionExec or │ │ (RepartitionExec or │ │ │ │ │ BroadcastExec) │ │ │ │ BroadcastExec) │ ││ │ └─────────────────────┘ └─────────────────────┘ │ │ │ ┌─────────────────────┐ │ │ ┌─────────────────────┐ ││ │ │ │ │ │ │ └─┼───│ SamplerExec │ │ │ │ SamplerExec │───┼┘ │ │ │ │ │ └─────────────────────┘ │ │ └─────────────────────┘ │ ┌─────────────────────┐ ┌─────────────────────┐ │ │ │ │ │ │ │ │ │ ... │ │ ... │ │ │ │ │ │ │ │ │ └─────────────────────┘ └─────────────────────┘ │ ┌─────────────────────┐ │ │ ┌─────────────────────┐ │ │ │ │ │ │ │ DataSourceExec │ │ │ │ DataSourceExec │ │ │ │ │ │ │ └─────────────────────┘ │ │ └─────────────────────┘ │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ``` Each `SamplerExec` node contains one `PartitionSampler` per partition, and each partition sampling is treated independently: ```rust ┌────────────────────────────────────────────────────────────────────────────┐ │ SamplerExec │ │ ┌────────────────┐┌────────────────┐ ┌────────────────┐ │ │ │ ││ │ │ │ │ │ │PartitionSampler││PartitionSampler│ ... │PartitionSampler│ │ │ │ ││ │ │ │ │ │ └────────────────┘└────────────────┘ └────────────────┘ │ └────────────────────────────────────────────────────────────────────────────┘ ``` The way a `PartitionSampler` works is that, before actual execution, it will peek a representative number of `RecordBatch`es and gather stats over them (per column byte count, per column NDV, per column null count, total row count, etc...). For that the following things happen: 1. Pulls all the `RecordBatch`es that are available synchronously without `async` gaps. Some operators like `Aggregate(Partial)` retain big internal representations in memory that can yield more than 1 `RecordBatch` synchronously, because they were already computed and stored in memory. ```rust ┌───────────────────────────────────────────────────────────────┐ │ PartitionSampler │ │ │ │┌───────────┬───────────┬───────────┐ │ ││ │ │ │ │ ││RecordBatch│RecordBatch│RecordBatch│ │ ││ │ │ │ │ │└───────────┴───────────┴───────────┘ │ └───────────────────────────────────────────────────────────────┘ ``` 2. Once an `async` gap is reached, it pulls just 1 more record batch, and it measures the time it takes in this `async` gap: ```rust ┌───────────────────────────────────────────────────────────────┐ │ PartitionSampler │ │ │ │┌───────────┬───────────┬───────────┐ ┌───────────┐│ ││ │ │ │ │ ││ ││RecordBatch│RecordBatch│RecordBatch│ async wait │RecordBatch││ ││ │ │ │ │ ││ │└───────────┴───────────┴───────────┘ └───────────┘│ └───────────────────────────────────────────────────────────────┘ ``` 3. With this information, two sources of useful information are present: - Bytes ready to be yielded immediately - The velocity at with new `RecordBatch`es are arriving ```rust ┌───────────────────────────────────────────────────────────────┐ │ PartitionSampler │ │ │ │┌───────────┬───────────┬───────────┐ ┌───────────┐│ ││ │ │ │ │ ││ ││RecordBatch│RecordBatch│RecordBatch│ async wait │RecordBatch││ ││ │ │ │ │ ││ │└─────┬─────┴─────┬─────┴───┬─────┬─┘ └────▲────┬─┘│ └──────┼───────────┼─────────┼─────┼────────────────────┼────┼──┘ │ │ │ ─────────────────────│ │ │ │ │ │ │ │ │ RecordBatch velocity │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ┌─────────────────────────┘ ▼ ▼ ▼ ▼ Batches to be yielded immediately ``` This velocity information is what really matters towards deciding how many task count should be yielded. - Scanning a lot of data is not problematic if you can do it in a streaming fashion and the DataSources are bottleneck on IO, in this situations, 1 node might be enough. - If DataSources yield data very quickly, or if the compute cost over that data is very expensive, even if it's not a lot of data, it might still bottleneck the query en CPU power, so we'll benefit from more CPUs (more machines). # prepare_dynamic_plan This is analogous to the existing `prepare_static_plan`, but with a runtime based dynamic task count assignation. In order to understand how it works, let's use the classical aggregation example: ```rust ┌───────────────────┐ │CoalescePartitions │ └───────────────────┘ ┌───────────────────┐ │ ProjectionExec │ └───────────────────┘ ┌───────────────────┐ │ Aggregate(final) │ └───────────────────┘ ┌───────────────────┐ │ RepartitionExec │ └───────────────────┘ ┌───────────────────┐ │Aggregate(partial) │ └───────────────────┘ ┌───────────────────┐ │ FilterExec │ └───────────────────┘ ┌───────────────────┐ │ DataSourceExec │ └───────────────────┘ ``` The plan walks from bottom to top, until we delimit a stage, same as before: ```rust Stage 1 ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ ┌───────────────────┐ │ │ RepartitionExec │ │ └───────────────────┘ │ ┌───────────────────┐ │ │Aggregate(partial) │ │ └───────────────────┘ │ ┌───────────────────┐ │ │ FilterExec │ │ └───────────────────┘ │ ┌───────────────────┐ │ │ DataSourceExec │ │ └───────────────────┘ │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ``` We'll use runtime information of "Stage 1" in order to determine the task count for the future "Stage 2". For that, the plan is modified and a `SamplerExec` is inserted just below the producer head (`RepartitionExec`): ```rust Stage 1 ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┐ ┌───────────────────┐ │ │ RepartitionExec │ │ └───────────────────┘ │ ┌───────────────────┐ │ │ SamplerExec │◀──────────── │ └───────────────────┘ │ ┌───────────────────┐ │ │Aggregate(partial) │ │ └───────────────────┘ │ ┌───────────────────┐ │ │ FilterExec │ │ └───────────────────┘ │ ┌───────────────────┐ │ │ DataSourceExec │ │ └───────────────────┘ └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘ ``` Let's say that the `TaskEstimator` for the leaf node `DataSourceExec` decided a `Desired(3)` task estimation. This subplan is then immediately sent to three workers, and upon setting the plan on the workers, all the `SamplerExec`s are kicked off and they start sampling even before any call to `.execute()` in any node: ```rust ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─Stage 1 ┌ ─ ─ ─ ─ ─ ─ ─Worker 1 ┌ ─ ─ ─ ─ ─ ─ ─Worker 2 ┌ ─ ─ ─ ─ ─ ─ ─Worker 3 │ ┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐ │ ││ RepartitionExec ││ ││ RepartitionExec ││ ││ RepartitionExec ││ │ └───────────────────┘ └───────────────────┘ └───────────────────┘ │ │┌───────────────────┐│ │┌───────────────────┐│ │┌───────────────────┐│ │ │ SamplerExec │ │ SamplerExec │ │ SamplerExec │ │ │└───────────────────┘│ │└───────────────────┘│ │└───────────────────┘│ │ │ │ │ │ │ Eager kick off │ │ Eager kick off │ │ Eager kick off │ │ ▼ ▼ ▼ │ │┌───────────────────┐│ │┌───────────────────┐│ │┌───────────────────┐│ │ │Aggregate(partial) │ │Aggregate(partial) │ │Aggregate(partial) │ │ │└───────────────────┘│ │└───────────────────┘│ │└───────────────────┘│ │ ┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐ │ ││ FilterExec ││ ││ FilterExec ││ ││ FilterExec ││ │ └───────────────────┘ └───────────────────┘ └───────────────────┘ │ │┌───────────────────┐│ │┌───────────────────┐│ │┌───────────────────┐│ │ │ DataSourceExec │ │ DataSourceExec │ │ DataSourceExec │ │ │└───────────────────┘│ │└───────────────────┘│ │└───────────────────┘│ │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ``` All the `SamplerExec`s start sampling, and they start reporting `LoadInfo` messages to the `prepare_dynamic_plan` function, which builds the next `NetworkShuffleExec` boundary with some pre-defined `Statistics`, the ones that where collected at runtime by the `SamplerExec`s below: ```rust ┌───────────────────┐ * │ ProjectionExec │ * └───────────────────┘ * ┌───────────────────┐ * │ Aggregate(final) │ * └───────────────────┘ * Still not planned ┌───────────────────┐ * │NetworkShuffleExec │ * │ (+ runtime stats) │ * └───────▲──▲──▲─────┘ * │ │ │ ┌──────────────────────────────────────┘ │ └────────┐ │ ┌────────────┘ │ │ │ │ │ ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─│─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┼ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─Stage 1 │ ┌ ─ ─ ─ ─ ─ ─ ─Worker 1 │┌ ─ ─ ─ ─ ─ ─ ─Worker 2 │┌ ─ ─ ─ ─ ─ ─ ─Worker 3 │ │ ┌───────────────────┐ │ ┌───────────────────┐ │ ┌───────────────────┐ │ │ ││ RepartitionExec ││ │││ RepartitionExec ││ │││ RepartitionExec ││ │ │ └───────────────────┘ │ └───────────────────┘ │ └───────────────────┘ │ │ │┌───────────────────┐│ ││┌───────────────────┐│ ││┌───────────────────┐│ └─┼───┤ SamplerExec │ └─┤ SamplerExec │ └─┤ SamplerExec │ │ │└───────────────────┘│ │└───────────────────┘│ │└───────────────────┘│ │ │ │ │ │ │ Eager kick off │ │ Eager kick off │ │ Eager kick off │ │ ▼ ▼ ▼ │ │┌───────────────────┐│ │┌───────────────────┐│ │┌───────────────────┐│ │ │Aggregate(partial) │ │Aggregate(partial) │ │Aggregate(partial) │ │ │└───────────────────┘│ │└───────────────────┘│ │└───────────────────┘│ │ ┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐ │ ││ FilterExec ││ ││ FilterExec ││ ││ FilterExec ││ │ └───────────────────┘ └───────────────────┘ └───────────────────┘ │ │┌───────────────────┐│ │┌───────────────────┐│ │┌───────────────────┐│ │ │ DataSourceExec │ │ DataSourceExec │ │ DataSourceExec │ │ │└───────────────────┘│ │└───────────────────┘│ │└───────────────────┘│ │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ``` While delimiting the next stage, the one that contains the `ProjectionExec` and the `Aggregate(final)`, the task count for that stage is decided purely over its compute cost, based on stats. At this point, the stats we have in that slice of the plan are very accurate, as we manage to gather them and condense them in `NetworkShuffleExec`, which at that point acts as a leaf node (as it's stage was already set to `Stage::Remote` because it already was sent and started sampling). Based on the compute cost inferred from the runtime stats, we suddenly realize that there's very very little data flowing through the `SamplerExec`, and as a consequence, the compute cost of "Stage 2" is estimated to be super low, so we collapse early to a single node: ```rust ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─Stage 2 ┌ ─ ─ ─ ─ ─ ─ ─Worker 1 │ ┌───────────────────┐ │ ││ ProjectionExec ││ │ └───────────────────┘ │ │┌───────────────────┐│ │ │ Aggregate(final) │ Very little data flowing, │ │└───────────────────┘│ 1 task is enough │ ┌───────────────────┐ │ ││NetworkShuffleExec ││ │ │ (+ runtime stats) │ │ │└───────────────────┘│ │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ │ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┌ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─Stage 1 ┌ ─ ─ ─ ─ ─ ─ ─Worker 1 ┌ ─ ─ ─ ─ ─ ─ ─Worker 2 ┌ ─ ─ ─ ─ ─ ─ ─Worker 3 │ ┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐ │ ││ RepartitionExec ││ ││ RepartitionExec ││ ││ RepartitionExec ││ │ └───────────────────┘ └───────────────────┘ └───────────────────┘ │ │┌───────────────────┐│ │┌───────────────────┐│ │┌───────────────────┐│ │ │ SamplerExec │ │ SamplerExec │ │ SamplerExec │ │ │└───────────────────┘│ │└───────────────────┘│ │└───────────────────┘│ │ ┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐ │ ││Aggregate(partial) ││ ││Aggregate(partial) ││ ││Aggregate(partial) ││ │ └───────────────────┘ └───────────────────┘ └───────────────────┘ │ │┌───────────────────┐│ │┌───────────────────┐│ │┌───────────────────┐│ │ │ FilterExec │ │ FilterExec │ │ FilterExec │ │ │└───────────────────┘│ │└───────────────────┘│ │└───────────────────┘│ │ ┌───────────────────┐ ┌───────────────────┐ ┌───────────────────┐ │ ││ DataSourceExec ││ ││ DataSourceExec ││ ││ DataSourceExec ││ │ └───────────────────┘ └───────────────────┘ └───────────────────┘ │ └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘ └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘ └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘ └ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ─ ┘ ``` # Benchmarks Extracted comparing runs of this same branch with `--dynamic false` VS `--dynamic true`:
TPCH SF1: Tasks 279 -> 318, prev=14631 ms, new=6727 ms, diff=2.17 faster ✅ ``` q1: prev= 319 ms, new= 307 ms, diff=1.04 faster ✔ q2: prev=1054 ms, new= 393 ms, diff=2.68 faster ✅ q3: prev= 989 ms, new= 504 ms, diff=1.96 faster ✅ q4: prev= 436 ms, new= 449 ms, diff=1.03 slower ✖ q5: prev=1019 ms, new= 314 ms, diff=3.25 faster ✅ q6: prev= 255 ms, new= 206 ms, diff=1.24 faster ✅ q7: prev= 934 ms, new= 310 ms, diff=3.01 faster ✅ q8: prev=1307 ms, new= 467 ms, diff=2.80 faster ✅ q9: prev=1208 ms, new= 331 ms, diff=3.65 faster ✅ q10: prev= 585 ms, new= 381 ms, diff=1.54 faster ✅ q11: prev= 380 ms, new= 183 ms, diff=2.08 faster ✅ q12: prev= 328 ms, new= 170 ms, diff=1.93 faster ✅ q13: prev= 477 ms, new= 176 ms, diff=2.71 faster ✅ q14: prev= 644 ms, new= 222 ms, diff=2.90 faster ✅ q15: prev= 946 ms, new= 175 ms, diff=5.41 faster ✅ q16: prev= 268 ms, new= 297 ms, diff=1.11 slower ✖ q17: prev= 828 ms, new= 281 ms, diff=2.95 faster ✅ q18: prev= 838 ms, new= 261 ms, diff=3.21 faster ✅ q19: prev= 424 ms, new= 313 ms, diff=1.35 faster ✅ q20: prev= 374 ms, new= 200 ms, diff=1.87 faster ✅ q21: prev= 815 ms, new= 608 ms, diff=1.34 faster ✅ q22: prev= 203 ms, new= 179 ms, diff=1.13 faster ✔ TOTAL: prev=14631 ms, new=6727 ms, diff=2.17 faster ✅ ```
TPCH SF10: Tasks 363 -> 734, prev=35577 ms, new=13014 ms, diff=2.73 faster ✅ ``` q1: prev=1498 ms, new= 604 ms, diff=2.48 faster ✅ q2: prev=2258 ms, new= 529 ms, diff=4.27 faster ✅ q3: prev=2005 ms, new= 567 ms, diff=3.54 faster ✅ q4: prev= 841 ms, new= 468 ms, diff=1.80 faster ✅ q5: prev=2051 ms, new= 701 ms, diff=2.93 faster ✅ q6: prev= 679 ms, new= 575 ms, diff=1.18 faster ✔ q7: prev=1810 ms, new= 723 ms, diff=2.50 faster ✅ q8: prev=3028 ms, new= 769 ms, diff=3.94 faster ✅ q9: prev=3011 ms, new= 885 ms, diff=3.40 faster ✅ q10: prev=1699 ms, new= 764 ms, diff=2.22 faster ✅ q11: prev=1142 ms, new= 304 ms, diff=3.76 faster ✅ q12: prev= 913 ms, new= 427 ms, diff=2.14 faster ✅ q13: prev= 789 ms, new= 925 ms, diff=1.17 slower ✖ q14: prev=1261 ms, new= 489 ms, diff=2.58 faster ✅ q15: prev=2132 ms, new= 541 ms, diff=3.94 faster ✅ q16: prev= 610 ms, new= 242 ms, diff=2.52 faster ✅ q17: prev=1771 ms, new= 589 ms, diff=3.01 faster ✅ q18: prev=2162 ms, new= 795 ms, diff=2.72 faster ✅ q19: prev=1157 ms, new= 480 ms, diff=2.41 faster ✅ q20: prev=1350 ms, new= 669 ms, diff=2.02 faster ✅ q21: prev=2830 ms, new= 747 ms, diff=3.79 faster ✅ q22: prev= 580 ms, new= 221 ms, diff=2.62 faster ✅ TOTAL: prev=35577 ms, new=13014 ms, diff=2.73 faster ✅ ```
TPCH SF100: Tasks 387 -> 1175, prev=307187 ms, new=62943 ms, diff=4.88 faster ✅ ``` q1: prev=16724 ms, new=3086 ms, diff=5.42 faster ✅ q2: prev=3282 ms, new=1038 ms, diff=3.16 faster ✅ q3: prev=14599 ms, new=2683 ms, diff=5.44 faster ✅ q4: prev=9351 ms, new=1378 ms, diff=6.79 faster ✅ q5: prev=16400 ms, new=3628 ms, diff=4.52 faster ✅ q6: prev=9168 ms, new=1552 ms, diff=5.91 faster ✅ q7: prev=17370 ms, new=4049 ms, diff=4.29 faster ✅ q8: prev=22325 ms, new=4329 ms, diff=5.16 faster ✅ q9: prev=24036 ms, new=5788 ms, diff=4.15 faster ✅ q10: prev=14957 ms, new=5010 ms, diff=2.99 faster ✅ q11: prev=2642 ms, new= 852 ms, diff=3.10 faster ✅ q12: prev=10561 ms, new=1726 ms, diff=6.12 faster ✅ q13: prev=4839 ms, new=1503 ms, diff=3.22 faster ✅ q14: prev=9423 ms, new=1625 ms, diff=5.80 faster ✅ q15: prev=26224 ms, new=3120 ms, diff=8.41 faster ✅ q16: prev=1426 ms, new= 566 ms, diff=2.52 faster ✅ q17: prev=21121 ms, new=4623 ms, diff=4.57 faster ✅ q18: prev=25218 ms, new=5256 ms, diff=4.80 faster ✅ q19: prev=11387 ms, new=1751 ms, diff=6.50 faster ✅ q20: prev=13517 ms, new=2141 ms, diff=6.31 faster ✅ q21: prev=29777 ms, new=6310 ms, diff=4.72 faster ✅ q22: prev=2840 ms, new= 929 ms, diff=3.06 faster ✅ TOTAL: prev=307187 ms, new=62943 ms, diff=4.88 faster ✅ ```
TPCDS SF1: Tasks 3079->2770, prev=62815 ms, new=44737 ms, diff=1.40 faster ✅ ``` q1: prev=1039 ms, new= 531 ms, diff=1.96 faster ✅ q2: prev= 677 ms, new= 396 ms, diff=1.71 faster ✅ q3: prev= 618 ms, new= 288 ms, diff=2.15 faster ✅ q4: prev=3420 ms, new=2582 ms, diff=1.32 faster ✅ q5: prev= 767 ms, new= 554 ms, diff=1.38 faster ✅ q6: prev=1002 ms, new= 967 ms, diff=1.04 faster ✔ q7: prev= 614 ms, new= 421 ms, diff=1.46 faster ✅ q8: prev= 484 ms, new= 422 ms, diff=1.15 faster ✔ q9: prev= 267 ms, new= 341 ms, diff=1.28 slower ❌ q10: prev= 648 ms, new= 826 ms, diff=1.27 slower ❌ q11: prev=2281 ms, new=1663 ms, diff=1.37 faster ✅ q12: prev= 287 ms, new= 229 ms, diff=1.25 faster ✅ q13: prev= 962 ms, new= 720 ms, diff=1.34 faster ✅ q14: prev=1095 ms, new= 737 ms, diff=1.49 faster ✅ q15: prev= 314 ms, new= 212 ms, diff=1.48 faster ✅ q16: prev= 528 ms, new= 597 ms, diff=1.13 slower ✖ q17: prev= 768 ms, new= 257 ms, diff=2.99 faster ✅ q18: prev= 780 ms, new= 339 ms, diff=2.30 faster ✅ q19: prev= 280 ms, new= 269 ms, diff=1.04 faster ✔ q20: prev= 180 ms, new= 169 ms, diff=1.07 faster ✔ q21: prev= 708 ms, new= 382 ms, diff=1.85 faster ✅ q22: prev= 490 ms, new= 435 ms, diff=1.13 faster ✔ q23: prev=1149 ms, new= 567 ms, diff=2.03 faster ✅ q24: prev=1148 ms, new= 586 ms, diff=1.96 faster ✅ q25: prev= 558 ms, new= 275 ms, diff=2.03 faster ✅ q26: prev= 346 ms, new= 265 ms, diff=1.31 faster ✅ q27: prev= 480 ms, new= 328 ms, diff=1.46 faster ✅ q28: prev= 329 ms, new= 221 ms, diff=1.49 faster ✅ q29: prev= 663 ms, new= 251 ms, diff=2.64 faster ✅ q31: prev=1268 ms, new= 218 ms, diff=5.82 faster ✅ q32: prev= 426 ms, new= 190 ms, diff=2.24 faster ✅ q33: prev= 429 ms, new= 321 ms, diff=1.34 faster ✅ q34: prev= 424 ms, new= 373 ms, diff=1.14 faster ✔ q35: prev= 655 ms, new= 546 ms, diff=1.20 faster ✔ q36: prev= 388 ms, new= 290 ms, diff=1.34 faster ✅ q37: prev= 389 ms, new= 384 ms, diff=1.01 faster ✔ q38: prev= 568 ms, new= 252 ms, diff=2.25 faster ✅ q39: prev= 547 ms, new= 479 ms, diff=1.14 faster ✔ q40: prev= 612 ms, new= 417 ms, diff=1.47 faster ✅ q41: prev= 128 ms, new= 143 ms, diff=1.12 slower ✖ q42: prev= 331 ms, new= 139 ms, diff=2.38 faster ✅ q43: prev= 158 ms, new= 204 ms, diff=1.29 slower ❌ q44: prev= 514 ms, new= 353 ms, diff=1.46 faster ✅ q45: prev= 398 ms, new= 237 ms, diff=1.68 faster ✅ q46: prev= 641 ms, new= 495 ms, diff=1.29 faster ✅ q47: prev= 964 ms, new= 488 ms, diff=1.98 faster ✅ q48: prev= 514 ms, new= 418 ms, diff=1.23 faster ✅ q49: prev= 550 ms, new= 314 ms, diff=1.75 faster ✅ q50: prev= 549 ms, new= 445 ms, diff=1.23 faster ✅ q51: prev= 425 ms, new= 226 ms, diff=1.88 faster ✅ q52: prev= 252 ms, new= 117 ms, diff=2.15 faster ✅ q53: prev= 202 ms, new= 223 ms, diff=1.10 slower ✖ q54: prev= 679 ms, new= 383 ms, diff=1.77 faster ✅ q55: prev= 191 ms, new= 155 ms, diff=1.23 faster ✅ q56: prev= 448 ms, new= 332 ms, diff=1.35 faster ✅ q57: prev= 673 ms, new= 288 ms, diff=2.34 faster ✅ q58: prev= 644 ms, new= 289 ms, diff=2.23 faster ✅ q59: prev= 447 ms, new= 294 ms, diff=1.52 faster ✅ q60: prev= 301 ms, new= 291 ms, diff=1.03 faster ✔ q61: prev=1017 ms, new=1095 ms, diff=1.08 slower ✖ q62: prev= 776 ms, new= 761 ms, diff=1.02 faster ✔ q63: prev= 243 ms, new= 223 ms, diff=1.09 faster ✔ q64: prev=1907 ms, new=1370 ms, diff=1.39 faster ✅ q65: prev= 432 ms, new= 259 ms, diff=1.67 faster ✅ q66: prev= 839 ms, new= 781 ms, diff=1.07 faster ✔ q67: prev= 486 ms, new= 389 ms, diff=1.25 faster ✅ q68: prev= 432 ms, new= 373 ms, diff=1.16 faster ✔ q69: prev= 596 ms, new= 618 ms, diff=1.04 slower ✖ q70: prev= 440 ms, new= 541 ms, diff=1.23 slower ❌ q71: prev= 406 ms, new= 298 ms, diff=1.36 faster ✅ q72: prev=5276 ms, new=3156 ms, diff=1.67 faster ✅ q73: prev= 259 ms, new= 294 ms, diff=1.14 slower ✖ q74: prev= 733 ms, new= 656 ms, diff=1.12 faster ✔ q75: prev=1004 ms, new= 542 ms, diff=1.85 faster ✅ q76: prev= 362 ms, new= 232 ms, diff=1.56 faster ✅ q77: prev= 549 ms, new= 305 ms, diff=1.80 faster ✅ q78: prev= 954 ms, new= 299 ms, diff=3.19 faster ✅ q79: prev= 278 ms, new= 266 ms, diff=1.05 faster ✔ q80: prev= 689 ms, new= 398 ms, diff=1.73 faster ✅ q81: prev= 441 ms, new= 344 ms, diff=1.28 faster ✅ q82: prev= 315 ms, new= 310 ms, diff=1.02 faster ✔ q83: prev= 551 ms, new= 299 ms, diff=1.84 faster ✅ q84: prev= 321 ms, new= 359 ms, diff=1.12 slower ✖ q85: prev= 594 ms, new= 545 ms, diff=1.09 faster ✔ q86: prev= 168 ms, new= 186 ms, diff=1.11 slower ✖ q87: prev= 394 ms, new= 283 ms, diff=1.39 faster ✅ q88: prev= 479 ms, new= 484 ms, diff=1.01 slower ✖ q89: prev= 262 ms, new= 207 ms, diff=1.27 faster ✅ q90: prev= 352 ms, new= 274 ms, diff=1.28 faster ✅ q91: prev= 541 ms, new= 404 ms, diff=1.34 faster ✅ q92: prev= 326 ms, new= 207 ms, diff=1.57 faster ✅ q93: prev= 287 ms, new= 226 ms, diff=1.27 faster ✅ q94: prev= 401 ms, new= 451 ms, diff=1.12 slower ✖ q95: prev= 444 ms, new= 354 ms, diff=1.25 faster ✅ q96: prev= 193 ms, new= 235 ms, diff=1.22 slower ❌ q97: prev= 268 ms, new= 174 ms, diff=1.54 faster ✅ q98: prev= 165 ms, new= 176 ms, diff=1.07 slower ✖ q99: prev=1038 ms, new=1229 ms, diff=1.18 slower ✖ TOTAL: prev=62815 ms, new=44737 ms, diff=1.40 faster ✅ ```
ClickBench 0-100: Tasks 912->609, prev=35116 ms, new=34185 ms, diff=1.03 faster ✔ ``` q0: prev= 2 ms, new= 2 ms, diff=1.00 slower ✖ q1: prev= 506 ms, new= 396 ms, diff=1.28 faster ✅ q2: prev= 477 ms, new= 337 ms, diff=1.42 faster ✅ q3: prev= 323 ms, new= 452 ms, diff=1.40 slower ❌ q4: prev= 405 ms, new= 439 ms, diff=1.08 slower ✖ q5: prev= 585 ms, new= 555 ms, diff=1.05 faster ✔ q6: prev= 2 ms, new= 2 ms, diff=1.00 slower ✖ q7: prev= 253 ms, new= 363 ms, diff=1.43 slower ❌ q8: prev= 492 ms, new= 477 ms, diff=1.03 faster ✔ q9: prev= 620 ms, new= 635 ms, diff=1.02 slower ✖ q10: prev= 478 ms, new= 461 ms, diff=1.04 faster ✔ q11: prev= 449 ms, new= 392 ms, diff=1.15 faster ✔ q12: prev= 596 ms, new= 550 ms, diff=1.08 faster ✔ q13: prev= 771 ms, new= 792 ms, diff=1.03 slower ✖ q14: prev= 536 ms, new= 549 ms, diff=1.02 slower ✖ q15: prev= 477 ms, new= 414 ms, diff=1.15 faster ✔ q16: prev= 775 ms, new= 753 ms, diff=1.03 faster ✔ q17: prev= 749 ms, new= 726 ms, diff=1.03 faster ✔ q18: prev=1114 ms, new=1038 ms, diff=1.07 faster ✔ q19: prev= 380 ms, new= 391 ms, diff=1.03 slower ✖ q20: prev=1886 ms, new=1786 ms, diff=1.06 faster ✔ q21: prev=1807 ms, new=1775 ms, diff=1.02 faster ✔ q22: prev=2144 ms, new=2053 ms, diff=1.04 faster ✔ q23: prev=5267 ms, new=5354 ms, diff=1.02 slower ✖ q24: prev= 461 ms, new= 554 ms, diff=1.20 slower ❌ q25: prev= 409 ms, new= 482 ms, diff=1.18 slower ✖ q26: prev= 582 ms, new= 463 ms, diff=1.26 faster ✅ q27: prev=1958 ms, new=1955 ms, diff=1.00 faster ✔ q28: prev=2504 ms, new=2367 ms, diff=1.06 faster ✔ q29: prev= 297 ms, new= 261 ms, diff=1.14 faster ✔ q30: prev= 614 ms, new= 589 ms, diff=1.04 faster ✔ q31: prev= 714 ms, new= 656 ms, diff=1.09 faster ✔ q32: prev= 946 ms, new= 891 ms, diff=1.06 faster ✔ q33: prev=2557 ms, new=2397 ms, diff=1.07 faster ✔ q34: prev=2521 ms, new=2440 ms, diff=1.03 faster ✔ q35: prev= 459 ms, new= 438 ms, diff=1.05 faster ✔ TOTAL: prev=35116 ms, new=34185 ms, diff=1.03 faster ✔ ```
--- .github/workflows/ci.yml | 43 +- Cargo.lock | 1 + Cargo.toml | 1 + benchmarks/cdk/bin/datafusion-bench.ts | 10 + benchmarks/src/run.rs | 5 + src/common/mod.rs | 2 + src/common/recursion.rs | 1 + src/common/vec.rs | 80 +++ src/coordinator/distributed.rs | 8 +- src/coordinator/mod.rs | 1 + src/coordinator/prepare_dynamic_plan.rs | 361 +++++++++++ src/coordinator/prepare_static_plan.rs | 1 + src/coordinator/query_coordinator.rs | 52 +- src/distributed_ext.rs | 74 +++ src/distributed_planner/distributed_config.rs | 9 + .../distributed_query_planner.rs | 8 + .../inject_network_boundaries.rs | 12 +- src/distributed_planner/mod.rs | 6 +- src/distributed_planner/network_boundary.rs | 61 +- .../prepare_network_boundaries.rs | 7 +- .../benchmarks/shuffle_bench.rs | 1 + .../benchmarks/transport_bench.rs | 1 + src/execution_plans/mod.rs | 2 + src/execution_plans/network_broadcast.rs | 13 +- src/execution_plans/network_coalesce.rs | 20 +- src/execution_plans/network_shuffle.rs | 18 +- src/execution_plans/sampler.rs | 594 ++++++++++++++++++ src/metrics/bytes_metric.rs | 11 + src/metrics/task_metrics_rewriter.rs | 2 + src/protobuf/distributed_codec.rs | 26 +- src/stage.rs | 72 ++- src/work_unit_feed/remote_work_unit_feed.rs | 10 + src/worker/generated/worker.rs | 36 +- src/worker/impl_coordinator_channel.rs | 36 +- src/worker/task_data.rs | 7 +- src/worker/worker.proto | 27 + tests/clickbench_correctness_test.rs | 6 +- tests/metrics_collection.rs | 32 + tests/stateful_data_cleanup.rs | 23 +- tests/tpcds_correctness_test.rs | 6 +- tests/tpch_correctness_test.rs | 6 +- 41 files changed, 1611 insertions(+), 81 deletions(-) create mode 100644 src/common/vec.rs create mode 100644 src/coordinator/prepare_dynamic_plan.rs create mode 100644 src/execution_plans/sampler.rs diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cc217c7b..3c5da3fd 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -41,19 +41,33 @@ jobs: - uses: ./.github/actions/setup - run: cargo test --features integration - tpch-test: + tpch-correctness-test: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + planning_mode: [ "adaptive", "static" ] + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/setup + - run: cargo test --features tpch --test tpch_correctness_test + env: + ADAPTIVE: ${{ matrix.planning_mode == 'adaptive' }} + + tpch-plans-test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: ./.github/actions/setup - - run: cargo test --features tpch --test 'tpch_*' + - run: cargo test --features tpch --test tpch_plans_test tpcds-correctness-test: runs-on: ubuntu-latest strategy: fail-fast: false matrix: - shard: ["01", "02", "03", "04", "05", "06", "07", "08", "09", "10"] + shard: [ "01", "02", "03", "04", "05", "06", "07", "08", "09", "10" ] + planning_mode: [ "adaptive", "static" ] steps: - uses: actions/checkout@v4 - uses: ./.github/actions/setup @@ -62,6 +76,8 @@ jobs: path: testdata/tpcds/main.zip key: "main.zip" - run: cargo test --features tpcds --test tpcds_correctness_test shard${{ matrix.shard }} + env: + ADAPTIVE: ${{ matrix.planning_mode == 'adaptive' }} tpcds-plans-test: runs-on: ubuntu-latest @@ -74,7 +90,24 @@ jobs: key: "main.zip" - run: cargo test --features tpcds --test tpcds_plans_test - clickbench-test: + clickbench-correctness-test: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + planning_mode: [ "adaptive", "static" ] + steps: + - uses: actions/checkout@v4 + - uses: ./.github/actions/setup + - uses: actions/cache@v4 + with: + path: testdata/clickbench/ + key: "data" + - run: cargo test --features clickbench --test clickbench_correctness_test + env: + ADAPTIVE: ${{ matrix.planning_mode == 'adaptive' }} + + clickbench-plans-test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -83,7 +116,7 @@ jobs: with: path: testdata/clickbench/ key: "data" - - run: cargo test --features clickbench --test 'clickbench_*' + - run: cargo test --features clickbench --test clickbench_plans_test format-check: runs-on: ubuntu-latest diff --git a/Cargo.lock b/Cargo.lock index ebe698d2..7044adaa 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2208,6 +2208,7 @@ dependencies = [ "insta", "itertools 0.14.0", "moka", + "num-traits", "object_store", "parquet", "pin-project", diff --git a/Cargo.toml b/Cargo.toml index 4d6e3e7e..fd5ceab2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -48,6 +48,7 @@ moka = { version = "0.12", features = ["sync", "future"] } crossbeam-queue = "0.3" sysinfo = { version = "0.30", optional = true } sketches-ddsketch = { version = "0.3", features = ["use_serde"] } +num-traits = "0.2" bincode = "1" tonic-prost = "0.14.2" diff --git a/benchmarks/cdk/bin/datafusion-bench.ts b/benchmarks/cdk/bin/datafusion-bench.ts index f5d15eea..f32af829 100644 --- a/benchmarks/cdk/bin/datafusion-bench.ts +++ b/benchmarks/cdk/bin/datafusion-bench.ts @@ -24,6 +24,8 @@ async function main() { .option('--max-tasks-per-stage ', 'Max tasks per stage', '0') .option('--repartition-file-min-size ', 'repartition_file_min_size DF option', '10485760' /* upstream default */) .option('--target-partitions ', 'target_partitions DF option', '8') + .option('--dynamic ', 'Use the dynamic task count assigner', 'false') + .option('--bytes-per-partition-per-second ', 'Target throughput in bytes per partition per second for the dynamic task count allocator', `${16 * 1024 * 1024}`) .option('--queries ', 'Specific queries to run', undefined) .option('--debug ', 'Print the generated plans to stdout') .option('--warmup ', 'Perform a warmup query before the benchmarks', 'true') @@ -46,6 +48,8 @@ async function main() { const childrenIsolatorUnions = options.childrenIsolatorUnions === 'true' || options.childrenIsolatorUnions === 1 const broadcastJoins = options.broadcastJoins === 'true' || options.broadcastJoins === 1 const partialReduce = options.partialReduce === 'true' || options.partialReduce === 1 + const dynamicTaskCount = options.dynamic === 'true' || options.dynamic === 1 + const bytesPerPartitionPerSecond = parseInt(options.bytesPerPartitionPerSecond) const debug = options.debug === true || options.debug === 'true' || options.debug === 1 const warmup = options.warmup === true || options.warmup === 'true' || options.warmup === 1 @@ -59,6 +63,8 @@ async function main() { compression, broadcastJoins, partialReduce, + dynamicTaskCount, + bytesPerPartitionPerSecond, maxTasksPerStage, repartitionFileMinSize, targetPartitions @@ -98,6 +104,8 @@ class DataFusionRunner implements BenchmarkRunner { childrenIsolatorUnions: boolean; broadcastJoins: boolean; partialReduce: boolean; + dynamicTaskCount: boolean; + bytesPerPartitionPerSecond: number; maxTasksPerStage: number; repartitionFileMinSize: number; targetPartitions: number; @@ -177,6 +185,8 @@ class DataFusionRunner implements BenchmarkRunner { SET distributed.children_isolator_unions=${this.options.childrenIsolatorUnions}; SET distributed.broadcast_joins=${this.options.broadcastJoins}; SET distributed.partial_reduce=${this.options.partialReduce}; + SET distributed.dynamic_task_count=${this.options.dynamicTaskCount}; + SET distributed.bytes_per_partition_per_second=${this.options.bytesPerPartitionPerSecond}; SET distributed.max_tasks_per_stage=${this.options.maxTasksPerStage}; SET datafusion.optimizer.repartition_file_min_size=${this.options.repartitionFileMinSize}; SET datafusion.execution.target_partitions=${this.options.targetPartitions}; diff --git a/benchmarks/src/run.rs b/benchmarks/src/run.rs index 0583bb41..69aff7a6 100644 --- a/benchmarks/src/run.rs +++ b/benchmarks/src/run.rs @@ -108,6 +108,10 @@ pub struct RunOpt { #[structopt(long, default_value = "0")] max_tasks_per_stage: usize, + /// Activate dynamic task count + #[structopt(long)] + dynamic: bool, + /// Number of iterations of each test run #[structopt(short = "i", long = "iterations", default_value = "5")] iterations: usize, @@ -205,6 +209,7 @@ impl RunOpt { .with_distributed_cardinality_effect_task_scale_factor( self.cardinality_task_sf.unwrap_or(1.0), )? + .with_distributed_dynamic_task_count(self.dynamic)? .with_distributed_compression(match self.compression.as_str() { "zstd" => Some(CompressionType::ZSTD), "lz4" => Some(CompressionType::LZ4_FRAME), diff --git a/src/common/mod.rs b/src/common/mod.rs index bf9ed549..18cb28a1 100644 --- a/src/common/mod.rs +++ b/src/common/mod.rs @@ -5,6 +5,7 @@ mod recursion; mod task_context_helpers; mod time; mod uuid; +mod vec; pub(crate) use children_helpers::require_one_child; pub(crate) use on_drop_stream::on_drop_stream; @@ -13,3 +14,4 @@ pub(crate) use recursion::TreeNodeExt; pub(crate) use task_context_helpers::task_ctx_with_extension; pub(crate) use time::now_ns; pub(crate) use uuid::{deserialize_uuid, serialize_uuid}; +pub(crate) use vec::{element_wise_sum, vec_avg_reduce, vec_cast, vec_div, vec_mul}; diff --git a/src/common/recursion.rs b/src/common/recursion.rs index 2f2b9463..5c16116e 100644 --- a/src/common/recursion.rs +++ b/src/common/recursion.rs @@ -589,6 +589,7 @@ mod tests { query_id: uuid::Uuid::nil(), num: 0, workers: vec![], + runtime_stats: None, })) .unwrap() } diff --git a/src/common/vec.rs b/src/common/vec.rs new file mode 100644 index 00000000..ec62678b --- /dev/null +++ b/src/common/vec.rs @@ -0,0 +1,80 @@ +use datafusion::common::internal_err; +use datafusion::error::Result; +use num_traits::AsPrimitive; +use std::ops::{AddAssign, DivAssign, MulAssign}; + +/// Converts a slice of type `I` to a `Vec` using `as`-style primitive casting. +pub(crate) fn vec_cast(input: &[I]) -> Vec +where + I: AsPrimitive, + O: Copy + 'static, +{ + input.iter().map(|v| v.as_()).collect() +} + +/// Adds each element of `other` into the corresponding element of `one`, converting types via `AsPrimitive`. +pub(crate) fn element_wise_sum(mut one: Vec, other: &[O]) -> Result> +where + I: AddAssign + Copy + 'static, + O: AsPrimitive + 'static, +{ + if one.len() != other.len() { + return internal_err!("Cannot do an element wise sum of two vectors of different lengths"); + } + for i in 0..one.len() { + one[i] += other[i].as_(); + } + Ok(one) +} + +/// Multiplies every element of `one` by the scalar `other`, converting types via `AsPrimitive`. +pub(crate) fn vec_mul(mut one: Vec, other: O) -> Vec +where + I: MulAssign + Copy + 'static, + O: AsPrimitive + 'static, +{ + for el in one.iter_mut() { + *el *= other.as_(); + } + one +} + +/// Divides every element of `one` by the scalar `other`, converting types via `AsPrimitive`. +pub(crate) fn vec_div(mut one: Vec, other: O) -> Vec +where + I: DivAssign + Copy + 'static, + O: AsPrimitive + 'static, +{ + for el in one.iter_mut() { + *el /= other.as_(); + } + one +} + +/// Reduces a collection of same-length `f32` vectors into a single vector by averaging element-wise. +/// Empty inner vecs are skipped; returns an empty vec if all inputs are empty. +pub(crate) fn vec_avg_reduce(vecs: Vec>) -> Result> { + let sample_count = vecs.len(); + let mut iter = vecs.into_iter(); + let mut acc = loop { + let Some(v) = iter.next() else { + return Ok(vec![]); + }; + if !v.is_empty() { + break v; + } + }; + for v in iter { + if v.is_empty() { + continue; + } else if acc.len() != v.len() { + return internal_err!( + "vec_avg_reduce: length mismatch — first vec has {} elements, got {}", + acc.len(), + v.len() + ); + } + acc = element_wise_sum(acc, &v)?; + } + Ok(vec_div(acc, sample_count as f32)) +} diff --git a/src/coordinator/distributed.rs b/src/coordinator/distributed.rs index fe1bbff3..d7d62a08 100644 --- a/src/coordinator/distributed.rs +++ b/src/coordinator/distributed.rs @@ -1,5 +1,7 @@ +use crate::DistributedConfig; use crate::common::{require_one_child, serialize_uuid}; use crate::coordinator::metrics_store::MetricsStore; +use crate::coordinator::prepare_dynamic_plan::prepare_dynamic_plan; use crate::coordinator::prepare_static_plan::prepare_static_plan; use crate::coordinator::query_coordinator::QueryCoordinator; use crate::distributed_planner::NetworkBoundaryExt; @@ -198,7 +200,11 @@ impl ExecutionPlan for DistributedExec { builder.spawn(async move { let _guard = query_coordinator.end_query_guard(); - let result = prepare_static_plan(&query_coordinator, &base_plan)?; + let d_cfg = DistributedConfig::from_config_options(context.session_config().options())?; + let result = match d_cfg.dynamic_task_count { + true => prepare_dynamic_plan(&query_coordinator, &base_plan).await?, + false => prepare_static_plan(&query_coordinator, &base_plan)?, + }; plan_for_viz .lock() diff --git a/src/coordinator/mod.rs b/src/coordinator/mod.rs index 8fe771d3..c1a8a8dd 100644 --- a/src/coordinator/mod.rs +++ b/src/coordinator/mod.rs @@ -1,6 +1,7 @@ mod distributed; mod latency_metric; mod metrics_store; +mod prepare_dynamic_plan; mod prepare_static_plan; mod query_coordinator; diff --git a/src/coordinator/prepare_dynamic_plan.rs b/src/coordinator/prepare_dynamic_plan.rs new file mode 100644 index 00000000..cfea3d5d --- /dev/null +++ b/src/coordinator/prepare_dynamic_plan.rs @@ -0,0 +1,361 @@ +use crate::TaskCountAnnotation::{Desired, Maximum}; +use crate::common::{TreeNodeExt, element_wise_sum, vec_avg_reduce, vec_div, vec_mul}; +use crate::coordinator::distributed::PreparedPlan; +use crate::coordinator::query_coordinator::QueryCoordinator; +use crate::distributed_planner::{ + InjectNetworkBoundaryContext, NetworkBoundaryBuilderResult, ProducerHead, calculate_cost, + inject_network_boundaries, +}; +use crate::execution_plans::SamplerExec; +use crate::stage::{LocalStage, RemoteStage}; +use crate::worker::generated::worker as pb; +use crate::{BytesCounterMetric, NetworkBoundaryExt, NetworkCoalesceExec, Stage}; +use dashmap::DashMap; +use datafusion::common::stats::Precision; +use datafusion::common::tree_node::{Transformed, TreeNode, TreeNodeRecursion}; +use datafusion::common::{Result, exec_err, plan_err}; +use datafusion::physical_plan::metrics::MetricsSet; +use datafusion::physical_plan::{ + ColumnStatistics, ExecutionPlan, ExecutionPlanProperties, Statistics, +}; +use futures::{Stream, StreamExt}; +use std::any::TypeId; +use std::sync::Arc; +use tokio_stream::wrappers::UnboundedReceiverStream; + +pub(super) async fn prepare_dynamic_plan( + query_coordinator: &QueryCoordinator, + base_plan: &Arc, +) -> Result { + let plans_for_viz = Arc::new(PlanReconstructor::default()); + + let head_stage = inject_network_boundaries( + Arc::clone(base_plan), + |mut input_stage: LocalStage, nb_type: TypeId, nb_ctx: &InjectNetworkBoundaryContext| { + let mut metrics = MetricsSet::new(); + + // At this point, input_stage.plan has two kind of leaf nodes: + // - The ones that naturally do not read from any children, like DataSourceExec + // - Network boundaries whose Stage was set to Stage::Remote by a previous iteration + // of this same function. + // Both types of leaf nodes contain very valuable and accurate statistics that are used + // here for computing an estimation of the compute cost (measured in bytes): + // - DataSourceExec (or natural leaf nodes) contain stats pulled directly from their + // data source, like parquet files. + // - Network boundaries contain statistics collected from runtime information, gathered + // by the SamplerExec injected by this same function. + let cost = calculate_cost(&input_stage.plan)?; + metrics.push(BytesCounterMetric::new_metric( + "cpu_cost", + *cost.cpu.get_value().unwrap_or(&0), + )); + metrics.push(BytesCounterMetric::new_metric( + "memory_cost", + *cost.memory.get_value().unwrap_or(&0), + )); + metrics.push(BytesCounterMetric::new_metric( + "network_cost", + *cost.network.get_value().unwrap_or(&0), + )); + let compute_based_task_count = cost + .cpu + .get_value() + .unwrap_or(&0) + .div_ceil(nb_ctx.d_cfg.bytes_per_partition_per_second.max(1)) + .div_ceil(input_stage.plan.output_partitioning().partition_count()) + .clamp(1, nb_ctx.max_tasks()?); + let task_count = nb_ctx + .task_count(&input_stage.plan)? + .merge(Desired(compute_based_task_count)); + + // Propagate the final task_count inferred based on runtime statistics and compute cost. + // Here is where leaf nodes are scaled up by TaskEstimator::scale_up_leaf_node, and the + // plan is finally left ready for distribution. + input_stage.plan = nb_ctx + .propagate_task_count_until_network_boundaries(&input_stage.plan, task_count)?; + input_stage.tasks = task_count.as_usize(); + // In order to infer the compute the cost of the stage above this one, here a sampler + // is injected to gather runtime statistics. + input_stage.plan = ProducerHead::insert_sampler(input_stage.plan)?; + + let mut stage_coordinator = query_coordinator.stage_coordinator(&input_stage); + + let mut workers = Vec::with_capacity(input_stage.tasks); + let mut load_info_rxs = Vec::with_capacity(input_stage.tasks); + + let routed_urls = if input_stage.tasks == 1 { + // If there's an input stage with a single worker, and the current stage is also + // going to run in a single worker, we want to co-locate them so that unnecessary + // network transfers are avoided. + match stage_coordinator.find_input_stage_with_single_url() { + Some(single_url) => vec![single_url], + None => stage_coordinator.routed_urls()?, + } + } else { + stage_coordinator.routed_urls()? + }; + + for (i, routed_url) in routed_urls.into_iter().enumerate() { + workers.push(routed_url.clone()); + // Spawns the task that feeds this subplan to this worker. There will be as + // many as this spawned tasks as workers. + let (worker_tx, worker_rx) = stage_coordinator.send_plan_task(i, routed_url)?; + load_info_rxs.push({ + let rx = stage_coordinator.worker_to_coordinator_task(i, worker_rx); + UnboundedReceiverStream::new(rx) + }); + stage_coordinator.coordinator_to_worker_task(i, worker_tx)?; + } + + let plans_for_viz = Arc::clone(&plans_for_viz); + Ok(async move { + let (stats, consumer_tc) = if nb_type == TypeId::of::() { + (None, Maximum(1)) + } else { + let stats = gather_runtime_statistics(load_info_rxs, &input_stage.plan).await?; + let sampled_bytes = *stats.total_byte_size.get_value().unwrap_or(&0); + metrics.push(BytesCounterMetric::new_metric( + "sampled_bytes", + sampled_bytes, + )); + // returning Desired(1) here is our way to tell the planner that we don't care + // about the task count assigned to the network boundary in the consumer stage, + // and we don't want it to affect other task count decisions. + (Some(Arc::new(stats)), Desired(1)) + }; + + // Capture the output partitioning of the (rescaled, sampler-wrapped) input plan + // before it's moved: the returned stage is remote and carries no plan to read it + // back from. + let input_properties = Arc::clone(input_stage.plan.properties()); + plans_for_viz.insert(input_stage.num, input_stage.plan, metrics); + Ok(NetworkBoundaryBuilderResult { + consumer_task_count: consumer_tc, + input_stage: Stage::Remote(RemoteStage { + query_id: input_stage.query_id, + num: input_stage.num, + workers, + runtime_stats: stats, + }), + input_properties, + }) + }) + }, + query_coordinator.session_config().options(), + ) + .await?; + + Ok(PreparedPlan { + plan_for_viz: plans_for_viz.reconstruct(&head_stage)?, + head_stage, + }) +} + +/// Reconstructs the plan dynamically as stages get transitioned to Remote and get sent to the +/// respective workers. +/// +/// As the [prepare_dynamic_plan] function recurses and progressively sends the plan to workers, the +/// original plan gets modified, and subplans belong to the different [Stage]s get lost as they get +/// transitioned to [Stage::Remote]. +/// +/// This struct is in charge of tracking the [prepare_dynamic_plan] process and storing the final +/// version of all the subplans so that it can be reconstructed into a fully blown plan for +/// visualization purposes. +#[derive(Default)] +struct PlanReconstructor { + stage_map: DashMap, MetricsSet)>, +} + +impl PlanReconstructor { + fn insert(&self, stage: usize, plan: Arc, metrics_set: MetricsSet) { + self.stage_map.insert(stage, (plan, metrics_set)); + } + + fn reconstruct(&self, head_stage: &Arc) -> Result> { + let head_stage = Arc::clone(head_stage); + let reconstructed = head_stage.transform_down_with_task_count(1, |plan, tc| { + let Some(nb) = plan.as_network_boundary() else { + return Ok(Transformed::no(plan)); + }; + let input_stage = nb.input_stage(); + let Some((_, entry)) = self.stage_map.remove(&input_stage.num()) else { + return exec_err!( + "Failed to retrieve plan for stage {} for visualization purposes", + input_stage.num() + ); + }; + let (plan_for_viz, metrics_set) = entry; + + let plan_for_viz = nb.producer_head(tc).insert(plan_for_viz)?; + + let nb = nb.with_input_stage(Stage::Local(LocalStage { + query_id: input_stage.query_id(), + num: input_stage.num(), + plan: plan_for_viz, + tasks: input_stage.task_count(), + metrics_set, + }))?; + + Ok(Transformed::yes(nb)) + })?; + Ok(reconstructed.data) + } +} + +/// Estimates the bytes per second flowing through a stage by reading sample information. +async fn gather_runtime_statistics( + per_task_load_info_stream: Vec + Unpin>, + plan: &Arc, +) -> Result { + const ESTIMATED_QUERY_TIME_S: usize = 10; + const BYTES_READY_SAMPLE_PERCENTAGE: f32 = 0.2; + const BYTES_PER_SECOND_SAMPLE_PERCENTAGE: f32 = 0.2; + + let Some(sampler) = find_sampler(plan) else { + return plan_err!("Mising SamplerExec while gathering load report"); + }; + let n_cols = sampler.schema().fields.len(); + + fn apply_pct(value: usize, pct: f32) -> usize { + (value as f32 * pct).round() as usize + } + + let partitions_per_task = sampler.partition_samplers.len(); + let task_count = per_task_load_info_stream.len(); + let total_partitions = partitions_per_task * task_count; + + let mut partitions_with_bytes_per_second_done = 0; + let mut partitions_with_bytes_ready_done = 0; + let mut partitions_done = 0; + let mut rows_ready = 0; + let mut rows_per_second = 0; + let mut per_col_bytes_ready = vec![0usize; n_cols]; + let mut per_col_bytes_per_second = vec![0usize; n_cols]; + + let mut ndv_pct = vec![]; + let mut null_pct = vec![]; + + let mut load_info_stream = futures::stream::select_all(per_task_load_info_stream); + while let Some(load_info) = load_info_stream.next().await { + rows_per_second += load_info.rows_per_second as usize; + rows_ready += load_info.rows_ready as usize; + per_col_bytes_per_second = element_wise_sum( + per_col_bytes_per_second, + &load_info.per_column_bytes_per_second, + )?; + per_col_bytes_ready = + element_wise_sum(per_col_bytes_ready, &load_info.per_column_bytes_ready)?; + ndv_pct.push(load_info.per_column_ndv_percentage); + null_pct.push(load_info.per_column_null_percentage); + + partitions_with_bytes_per_second_done += + load_info.per_column_bytes_per_second.iter().any(|v| *v > 0) as usize; + partitions_with_bytes_ready_done += + load_info.per_column_bytes_ready.iter().any(|v| *v > 0) as usize; + partitions_done += 1; + + // Short circuit if we collected enough bytes_ready measurements. + if partitions_with_bytes_ready_done + >= apply_pct(total_partitions, BYTES_READY_SAMPLE_PERCENTAGE).max(1) + { + break; + } + + // Short circuit if we collected enough bytes_per_second measurements. + if partitions_with_bytes_per_second_done + >= apply_pct(total_partitions, BYTES_PER_SECOND_SAMPLE_PERCENTAGE).max(1) + { + break; + } + + // Short circuit if there are no further partitions remaining to sample from. + if partitions_done == total_partitions { + break; + } + } + + if partitions_done == 0 { + return Ok(zero_stats(plan.schema().fields.len())); + } + + let per_col_bytes_ready = vec_div( + vec_mul(per_col_bytes_ready, total_partitions), + partitions_done, + ); + let per_col_bytes_per_second = vec_div( + vec_mul(per_col_bytes_per_second, total_partitions), + partitions_done, + ); + + let rows_ready = rows_ready * total_partitions / partitions_done; + let rows_per_second = rows_per_second * total_partitions / partitions_done; + + let total_num_rows = rows_ready + rows_per_second * ESTIMATED_QUERY_TIME_S; + + if total_num_rows == 0 { + return Ok(zero_stats(n_cols)); + } + + let per_col_byte_size = element_wise_sum( + per_col_bytes_ready, + &vec_mul(per_col_bytes_per_second, ESTIMATED_QUERY_TIME_S), + )?; + let total_byte_size: usize = per_col_byte_size.iter().sum(); + + let ndv_pct = vec_avg_reduce(ndv_pct)?; + if ndv_pct.len() != n_cols { + return plan_err!("Expected {n_cols} ndv values, but got {}", ndv_pct.len()); + } + let null_pct = vec_avg_reduce(null_pct)?; + if null_pct.len() != n_cols { + return plan_err!("Expected {n_cols} null values, but got {}", null_pct.len()); + } + + Ok(Statistics { + num_rows: Precision::Inexact(total_num_rows), + total_byte_size: Precision::Inexact(total_byte_size), + column_statistics: ndv_pct + .into_iter() + .zip(null_pct) + .zip(per_col_byte_size) + .map(|((ndv, null), col_bytes)| ColumnStatistics { + null_count: Precision::Inexact((null * total_num_rows as f32) as usize), + distinct_count: Precision::Inexact((ndv * total_num_rows as f32) as usize), + byte_size: Precision::Inexact(col_bytes), + max_value: Precision::Absent, + min_value: Precision::Absent, + sum_value: Precision::Absent, + }) + .collect(), + }) +} + +fn find_sampler(plan: &Arc) -> Option<&SamplerExec> { + let mut sampler = None; + plan.apply(|plan| { + if let Some(node) = plan.downcast_ref::() { + sampler = Some(node); + return Ok(TreeNodeRecursion::Stop); + }; + Ok(TreeNodeRecursion::Continue) + }) + .expect("Cannot fail"); + sampler +} + +fn zero_stats(n_cols: usize) -> Statistics { + Statistics { + num_rows: Precision::Exact(0), + total_byte_size: Precision::Exact(0), + column_statistics: (0..n_cols) + .map(|_| ColumnStatistics { + null_count: Precision::Exact(0), + max_value: Precision::Absent, + min_value: Precision::Absent, + sum_value: Precision::Absent, + distinct_count: Precision::Exact(0), + byte_size: Precision::Exact(0), + }) + .collect(), + } +} diff --git a/src/coordinator/prepare_static_plan.rs b/src/coordinator/prepare_static_plan.rs index 65d74276..3bfc2d2f 100644 --- a/src/coordinator/prepare_static_plan.rs +++ b/src/coordinator/prepare_static_plan.rs @@ -50,6 +50,7 @@ pub(super) fn prepare_static_plan( query_id: stage.query_id, num: stage.num, workers, + runtime_stats: None, }, ))?)) })?; diff --git a/src/coordinator/query_coordinator.rs b/src/coordinator/query_coordinator.rs index 3d19c750..6f0010e6 100644 --- a/src/coordinator/query_coordinator.rs +++ b/src/coordinator/query_coordinator.rs @@ -12,17 +12,19 @@ use crate::worker::generated::worker::coordinator_to_worker_msg::Inner; use crate::worker::generated::worker::set_plan_request::WorkUnitFeedDeclaration; use crate::{ BytesCounterMetric, BytesMetricExt, DISTRIBUTED_DATAFUSION_TASK_ID_LABEL, DistributedCodec, - DistributedConfig, DistributedTaskContext, DistributedWorkUnitFeedContext, TaskEstimator, - TaskKey, TaskRoutingContext, get_distributed_channel_resolver, get_distributed_worker_resolver, + DistributedConfig, DistributedTaskContext, DistributedWorkUnitFeedContext, NetworkBoundaryExt, + Stage, TaskEstimator, TaskKey, TaskRoutingContext, get_distributed_channel_resolver, + get_distributed_worker_resolver, }; use datafusion::common::instant::Instant; use datafusion::common::runtime::JoinSet; -use datafusion::common::tree_node::{Transformed, TreeNodeRecursion}; +use datafusion::common::tree_node::{Transformed, TreeNode, TreeNodeRecursion}; use datafusion::common::{DataFusionError, exec_datafusion_err}; use datafusion::common::{Result, exec_err}; use datafusion::execution::TaskContext; use datafusion::physical_expr_common::metrics::{ExecutionPlanMetricsSet, Label, MetricBuilder}; use datafusion::physical_plan::ExecutionPlan; +use datafusion::prelude::SessionConfig; use datafusion_proto::physical_plan::AsExecutionPlan; use datafusion_proto::protobuf::PhysicalPlanNode; use futures::{Stream, StreamExt}; @@ -88,6 +90,11 @@ impl QueryCoordinator { } } + /// Returns the [SessionConfig] for the current query. + pub(super) fn session_config(&self) -> &SessionConfig { + self.task_ctx.session_config() + } + /// returns a guard that, when dropped, it signals all the coordinator->worker connections that /// the query is finished, ending them, and propagating the EOS to the workers so that they can /// clean up any remaining state. @@ -200,8 +207,8 @@ impl<'a> StageCoordinator<'a> { let mut worker_to_coordinator_stream = response.into_inner(); while let Some(msg_or_err) = worker_to_coordinator_stream.next().await { let msg = msg_or_err.map_err(|err| { - tonic_status_to_datafusion_error(err).unwrap_or_else(|| { - exec_datafusion_err!("Unknown error on worker to coordinator stream") + tonic_status_to_datafusion_error(&err).unwrap_or_else(|| { + exec_datafusion_err!("Unknown error on worker to coordinator stream: {err}") }) })?; if worker_to_coordinator_tx.send(msg).is_err() { @@ -221,13 +228,15 @@ impl<'a> StageCoordinator<'a> { &mut self, task_i: usize, mut worker_to_coordinator_rx: UnboundedReceiver, - ) { + ) -> UnboundedReceiver { let task_key = TaskKey { query_id: serialize_uuid(&self.query_id), stage_id: self.stage_id as u64, task_number: task_i as u64, }; let task_metrics = self.metrics_store.clone(); + let (load_info_tx, load_info_rx) = tokio::sync::mpsc::unbounded_channel(); + let mut load_info_tx_opt = Some(load_info_tx); // Cannot use self.join_set because that's tied to the lifetime of the query, and the // metrics collection process might outlive the query's lifetime. @@ -242,9 +251,18 @@ impl<'a> StageCoordinator<'a> { task_metrics.insert(task_key.clone(), pre_order_metrics); } } + pb::worker_to_coordinator_msg::Inner::LoadInfo(load_info) => { + if let Some(tx) = &load_info_tx_opt { + let _ = tx.send(load_info); + } + } + pb::worker_to_coordinator_msg::Inner::LoadInfoEos(_) => { + let _ = load_info_tx_opt.take(); + } } } }); + load_info_rx } /// Spawns a background task in charge of sending messages to workers. Some things that are sent @@ -401,6 +419,28 @@ impl<'a> StageCoordinator<'a> { } Ok(routed_urls) } + + pub(super) fn find_input_stage_with_single_url(&self) -> Option { + let mut single_stage_url = None; + self.plan + .apply(|plan| { + let Some(nb) = plan.as_network_boundary() else { + return Ok(TreeNodeRecursion::Continue); + }; + + if let Stage::Remote(remote) = nb.input_stage() + && remote.workers.len() == 1 + { + single_stage_url = Some(remote.workers[0].clone()); + return Ok(TreeNodeRecursion::Stop); + } + + Ok(TreeNodeRecursion::Jump) + }) + .expect("Cannot fail"); + + single_stage_url + } } fn keep_stream_alive(notify: Arc) -> impl Stream + 'static { diff --git a/src/distributed_ext.rs b/src/distributed_ext.rs index 17852a04..d33b18a6 100644 --- a/src/distributed_ext.rs +++ b/src/distributed_ext.rs @@ -577,6 +577,27 @@ pub trait DistributedExt: Sized { P: WorkUnitFeedProvider + 'static, P::WorkUnit: 'static, F: Fn(&T) -> Option<&WorkUnitFeed

> + Send + Sync + 'static; + + /// Dynamically allocates tasks to the different stages based on runtime statistics + /// collected during execution. + fn with_distributed_dynamic_task_count(self, enabled: bool) -> Result; + + /// Same as [DistributedExt::with_distributed_dynamic_task_count] but with an in-place mutation. + fn set_distributed_dynamic_task_count(&mut self, enabled: bool) -> Result<(), DataFusionError>; + + /// Target throughput in bytes per partition per second used by the dynamic task count + /// allocator to decide how many tasks to assign to each stage based on runtime statistics. + fn with_distributed_bytes_per_partition_per_second( + self, + bytes_per_partition_per_second: usize, + ) -> Result; + + /// Same as [DistributedExt::with_distributed_bytes_per_partition_per_second] but with an + /// in-place mutation. + fn set_distributed_bytes_per_partition_per_second( + &mut self, + bytes_per_partition_per_second: usize, + ) -> Result<(), DataFusionError>; } impl DistributedExt for SessionConfig { @@ -722,6 +743,21 @@ impl DistributedExt for SessionConfig { }) } + fn set_distributed_dynamic_task_count(&mut self, enabled: bool) -> Result<(), DataFusionError> { + let d_cfg = DistributedConfig::from_config_options_mut(self.options_mut())?; + d_cfg.dynamic_task_count = enabled; + Ok(()) + } + + fn set_distributed_bytes_per_partition_per_second( + &mut self, + bytes_per_partition_per_second: usize, + ) -> Result<(), DataFusionError> { + let d_cfg = DistributedConfig::from_config_options_mut(self.options_mut())?; + d_cfg.bytes_per_partition_per_second = bytes_per_partition_per_second; + Ok(()) + } + delegate! { to self { #[call(set_distributed_option_extension)] @@ -804,6 +840,14 @@ impl DistributedExt for SessionConfig { P: WorkUnitFeedProvider + 'static, P::WorkUnit: 'static, F: Fn(&T) -> Option<&WorkUnitFeed

> + Send + Sync + 'static; + + #[call(set_distributed_dynamic_task_count)] + #[expr($?;Ok(self))] + fn with_distributed_dynamic_task_count(mut self, enabled: bool) -> Result; + + #[call(set_distributed_bytes_per_partition_per_second)] + #[expr($?;Ok(self))] + fn with_distributed_bytes_per_partition_per_second(mut self, bytes_per_partition_per_second: usize) -> Result; } } } @@ -915,6 +959,16 @@ impl DistributedExt for SessionStateBuilder { P: WorkUnitFeedProvider + 'static, P::WorkUnit: 'static, F: Fn(&T) -> Option<&WorkUnitFeed

> + Send + Sync + 'static; + + fn set_distributed_dynamic_task_count(&mut self, enabled: bool) -> Result<(), DataFusionError>; + #[call(set_distributed_dynamic_task_count)] + #[expr($?;Ok(self))] + fn with_distributed_dynamic_task_count(mut self, enabled: bool) -> Result; + + fn set_distributed_bytes_per_partition_per_second(&mut self, bytes_per_partition_per_second: usize) -> Result<(), DataFusionError>; + #[call(set_distributed_bytes_per_partition_per_second)] + #[expr($?;Ok(self))] + fn with_distributed_bytes_per_partition_per_second(mut self, bytes_per_partition_per_second: usize) -> Result; } } } @@ -1026,6 +1080,16 @@ impl DistributedExt for SessionState { P: WorkUnitFeedProvider + 'static, P::WorkUnit: 'static, F: Fn(&T) -> Option<&WorkUnitFeed

> + Send + Sync + 'static; + + fn set_distributed_dynamic_task_count(&mut self, enabled: bool) -> Result<(), DataFusionError>; + #[call(set_distributed_dynamic_task_count)] + #[expr($?;Ok(self))] + fn with_distributed_dynamic_task_count(mut self, enabled: bool) -> Result; + + fn set_distributed_bytes_per_partition_per_second(&mut self, bytes_per_partition_per_second: usize) -> Result<(), DataFusionError>; + #[call(set_distributed_bytes_per_partition_per_second)] + #[expr($?;Ok(self))] + fn with_distributed_bytes_per_partition_per_second(mut self, bytes_per_partition_per_second: usize) -> Result; } } } @@ -1137,6 +1201,16 @@ impl DistributedExt for SessionContext { P: WorkUnitFeedProvider + 'static, P::WorkUnit: 'static, F: Fn(&T) -> Option<&WorkUnitFeed

> + Send + Sync + 'static; + + fn set_distributed_dynamic_task_count(&mut self, enabled: bool) -> Result<(), DataFusionError>; + #[call(set_distributed_dynamic_task_count)] + #[expr($?;Ok(self))] + fn with_distributed_dynamic_task_count(self, enabled: bool) -> Result; + + fn set_distributed_bytes_per_partition_per_second(&mut self, bytes_per_partition_per_second: usize) -> Result<(), DataFusionError>; + #[call(set_distributed_bytes_per_partition_per_second)] + #[expr($?;Ok(self))] + fn with_distributed_bytes_per_partition_per_second(self, bytes_per_partition_per_second: usize) -> Result; } } } diff --git a/src/distributed_planner/distributed_config.rs b/src/distributed_planner/distributed_config.rs index d6faee39..e01b5ff4 100644 --- a/src/distributed_planner/distributed_config.rs +++ b/src/distributed_planner/distributed_config.rs @@ -66,6 +66,15 @@ extensions_options! { /// budget will still be admitted (otherwise we would livelock), so the actual peak per /// connection is `worker_connection_buffer_budget_bytes + max_message_size`. pub worker_connection_buffer_budget_bytes: usize, default = 64 * 1024 * 1024 + /// Calculates the task count of the different stages at execution time, based on runtime + /// information collected by sampling at the head of the stages. + /// + /// With this option enabled, the shape of the distributed plan is only known after fully + /// executing it, as it's dynamically created on the fly during execution. + pub dynamic_task_count: bool, default = false + /// If `dynamic_task_count` is enabled, this value is the amount of bytes/second each + /// partition is expected to handle. Lower values will result in greater parallelism. + pub bytes_per_partition_per_second: usize, default = 16 * 1024 * 1024 /// Collection of [TaskEstimator]s that will be applied to leaf nodes in order to /// estimate how many tasks should be spawned for the [Stage] containing the leaf node. pub(crate) __private_task_estimator: CombinedTaskEstimator, default = CombinedTaskEstimator::default() diff --git a/src/distributed_planner/distributed_query_planner.rs b/src/distributed_planner/distributed_query_planner.rs index f5ac6168..8e2d8f2c 100644 --- a/src/distributed_planner/distributed_query_planner.rs +++ b/src/distributed_planner/distributed_query_planner.rs @@ -108,6 +108,14 @@ impl QueryPlanner for DistributedQueryPlanner { plan = insert_broadcast_execs(plan, cfg)?; + if d_cfg.dynamic_task_count { + // The task count will be decided dynamically at execution time. + return Ok(Arc::new( + DistributedExec::new(plan).with_metrics_collection(d_cfg.collect_metrics), + )); + } + + // Compute per-node task counts and inject `Network*Exec` nodes at the stage boundaries. plan = inject_network_boundaries(plan, CardinalityBasedNetworkBoundaryBuilder, cfg).await?; plan = prepare_network_boundaries(plan)?; diff --git a/src/distributed_planner/inject_network_boundaries.rs b/src/distributed_planner/inject_network_boundaries.rs index 37d5ee95..51bc4ab5 100644 --- a/src/distributed_planner/inject_network_boundaries.rs +++ b/src/distributed_planner/inject_network_boundaries.rs @@ -152,8 +152,9 @@ pub(crate) async fn inject_network_boundaries( #[derive(Clone)] pub(crate) struct InjectNetworkBoundaryContext<'a> { + pub(crate) d_cfg: &'a DistributedConfig, + cfg: &'a ConfigOptions, - d_cfg: &'a DistributedConfig, nb_builder: &'a (dyn NetworkBoundaryBuilder + Send + Sync), task_counts: &'a Mutex>, query_id: Uuid, @@ -161,7 +162,7 @@ pub(crate) struct InjectNetworkBoundaryContext<'a> { } impl<'a> InjectNetworkBoundaryContext<'a> { - fn max_tasks(&self) -> Result { + pub(crate) fn max_tasks(&self) -> Result { Ok(match self.d_cfg.max_tasks_per_stage { 0 => self .d_cfg @@ -190,7 +191,7 @@ impl<'a> InjectNetworkBoundaryContext<'a> { plan } - fn task_count(&self, plan: &Arc) -> Result { + pub(crate) fn task_count(&self, plan: &Arc) -> Result { let Some(task_count) = self .task_counts .lock() @@ -295,6 +296,7 @@ async fn _inject_network_boundaries( num: nb_ctx.fetch_add_stage_id(), plan: nb_ctx.plan_with_task_count(plan, task_count), tasks: task_count.as_usize(), + metrics_set: Default::default(), }; let result = nb_ctx .nb_builder @@ -313,6 +315,7 @@ async fn _inject_network_boundaries( num: nb_ctx.fetch_add_stage_id(), plan: nb_ctx.plan_with_task_count(plan, task_count), tasks: task_count.as_usize(), + metrics_set: Default::default(), }; let result = nb_ctx .nb_builder @@ -338,6 +341,7 @@ async fn _inject_network_boundaries( num: nb_ctx.fetch_add_stage_id(), plan: nb_ctx.plan_with_task_count(plan, task_count), tasks: task_count.as_usize(), + metrics_set: Default::default(), }; let result = nb_ctx .nb_builder @@ -405,7 +409,7 @@ async fn _inject_network_boundaries( /// - **Everything else**: recurse into children with the same `task_count`, then rebuild the /// node with the rebuilt children. impl InjectNetworkBoundaryContext<'_> { - fn propagate_task_count_until_network_boundaries( + pub(crate) fn propagate_task_count_until_network_boundaries( &self, plan: &Arc, task_count: TaskCountAnnotation, diff --git a/src/distributed_planner/mod.rs b/src/distributed_planner/mod.rs index f12c684c..18cfe6e0 100644 --- a/src/distributed_planner/mod.rs +++ b/src/distributed_planner/mod.rs @@ -11,8 +11,12 @@ mod statistics; mod task_estimator; pub use distributed_config::DistributedConfig; +pub(crate) use inject_network_boundaries::{ + InjectNetworkBoundaryContext, NetworkBoundaryBuilderResult, inject_network_boundaries, +}; +pub(crate) use network_boundary::ProducerHead; pub use network_boundary::{NetworkBoundary, NetworkBoundaryExt}; -pub(crate) use network_boundary::{ProducerHead, insert_producer_head}; pub use session_state_builder_ext::SessionStateBuilderExt; +pub(crate) use statistics::calculate_cost; pub(crate) use task_estimator::set_distributed_task_estimator; pub use task_estimator::{TaskCountAnnotation, TaskEstimation, TaskEstimator, TaskRoutingContext}; diff --git a/src/distributed_planner/network_boundary.rs b/src/distributed_planner/network_boundary.rs index 858a7e00..e6479e7e 100644 --- a/src/distributed_planner/network_boundary.rs +++ b/src/distributed_planner/network_boundary.rs @@ -1,3 +1,4 @@ +use crate::execution_plans::SamplerExec; use crate::{BroadcastExec, NetworkBroadcastExec, NetworkCoalesceExec, NetworkShuffleExec, Stage}; use datafusion::common::Result; use datafusion::physical_expr::Partitioning; @@ -13,7 +14,7 @@ pub trait NetworkBoundary: ExecutionPlan { /// information to perform any internal transformations necessary for distributed execution. /// /// Typically, [NetworkBoundary]s will use this call for transitioning from "Pending" to "ready". - fn with_input_stage(&self, input_stage: Stage) -> Result>; + fn with_input_stage(&self, input_stage: Stage) -> Result>; /// Returns the assigned input [Stage], if any. fn input_stage(&self) -> &Stage; @@ -59,28 +60,40 @@ impl NetworkBoundaryExt for dyn ExecutionPlan { } } -/// Ensures the head of the provided plan complies with the passed [ProducerHead] definition. This -/// can be called both during planning and lazily at runtime. -pub(crate) fn insert_producer_head( - input: Arc, - head: ProducerHead, -) -> Result> { - let input = if let Some(r_exec) = input.downcast_ref::() { - Arc::clone(r_exec.input()) - } else if let Some(b_exec) = input.downcast_ref::() { - Arc::clone(b_exec.input()) - } else { - input - }; - let plan = match head { - ProducerHead::None => input, - ProducerHead::BroadcastExec { output_partitions } => { - let partitions = input.output_partitioning().partition_count(); - Arc::new(BroadcastExec::new(input, output_partitions / partitions)) - } - ProducerHead::RepartitionExec { partitioning } => { - Arc::new(RepartitionExec::try_new(input, partitioning)?) +impl ProducerHead { + /// Ensures the head of the provided plan complies with the passed [ProducerHead] definition. This + /// can be called both during planning and lazily at runtime. + pub(crate) fn insert(self, input: Arc) -> Result> { + let input = if let Some(r_exec) = input.downcast_ref::() { + Arc::clone(r_exec.input()) + } else if let Some(b_exec) = input.downcast_ref::() { + Arc::clone(b_exec.input()) + } else { + input + }; + let plan = match self { + ProducerHead::None => input, + ProducerHead::BroadcastExec { output_partitions } => { + let partitions = input.output_partitioning().partition_count(); + Arc::new(BroadcastExec::new(input, output_partitions / partitions)) + } + ProducerHead::RepartitionExec { partitioning } => { + Arc::new(RepartitionExec::try_new(input, partitioning)?) + } + }; + Ok(plan) + } + + /// Injects a [SamplerExec] right below a [RepartitionExec] or [BroadcastExec]. + pub(crate) fn insert_sampler(input: Arc) -> Result> { + if let Some(r_exec) = input.downcast_ref::() { + let child = Arc::clone(r_exec.input()); + input.with_new_children(vec![Arc::new(SamplerExec::new(child))]) + } else if let Some(b_exec) = input.downcast_ref::() { + let child = Arc::clone(b_exec.input()); + input.with_new_children(vec![Arc::new(SamplerExec::new(child))]) + } else { + Ok(input) } - }; - Ok(plan) + } } diff --git a/src/distributed_planner/prepare_network_boundaries.rs b/src/distributed_planner/prepare_network_boundaries.rs index 1b6f1ac7..dd070793 100644 --- a/src/distributed_planner/prepare_network_boundaries.rs +++ b/src/distributed_planner/prepare_network_boundaries.rs @@ -1,5 +1,4 @@ use crate::common::TreeNodeExt; -use crate::distributed_planner::network_boundary::insert_producer_head; use crate::stage::LocalStage; use crate::{NetworkBoundaryExt, Stage}; use datafusion::common::Result; @@ -35,8 +34,9 @@ pub(crate) fn prepare_network_boundaries( // 2) Scale up the head node of the input stage in order to account for the amount of partition // and consumer count above it. - let plan = - insert_producer_head(Arc::clone(&input_stage.plan), nb.producer_head(task_count))?; + let plan = nb + .producer_head(task_count) + .insert(Arc::clone(&input_stage.plan))?; // 3) Make sure the input stage can be uniquely identified with a stage index and query id. // If there were already some `query_id` and `num` that's fine. @@ -45,6 +45,7 @@ pub(crate) fn prepare_network_boundaries( num: stage_id, plan, tasks: input_stage.tasks, + metrics_set: Default::default(), }))?; stage_id += 1; Ok(Transformed::yes(nb)) diff --git a/src/execution_plans/benchmarks/shuffle_bench.rs b/src/execution_plans/benchmarks/shuffle_bench.rs index 8406a052..4f46f1be 100644 --- a/src/execution_plans/benchmarks/shuffle_bench.rs +++ b/src/execution_plans/benchmarks/shuffle_bench.rs @@ -216,6 +216,7 @@ impl ShuffleFixture { query_id, num: 0, workers: self.input_stage_workers.clone(), + runtime_stats: None, }); let mut join_set = JoinSet::default(); diff --git a/src/execution_plans/benchmarks/transport_bench.rs b/src/execution_plans/benchmarks/transport_bench.rs index 847c307b..a386c7bd 100644 --- a/src/execution_plans/benchmarks/transport_bench.rs +++ b/src/execution_plans/benchmarks/transport_bench.rs @@ -266,6 +266,7 @@ impl TransportFixture { query_id, num: 0, workers: self.input_stage_tasks.clone(), + runtime_stats: None, }); let mut join_set = JoinSet::default(); diff --git a/src/execution_plans/mod.rs b/src/execution_plans/mod.rs index a1ea6316..ecdcbc35 100644 --- a/src/execution_plans/mod.rs +++ b/src/execution_plans/mod.rs @@ -6,6 +6,7 @@ mod metrics; mod network_broadcast; mod network_coalesce; mod network_shuffle; +mod sampler; #[cfg(any(test, feature = "integration"))] pub mod benchmarks; @@ -18,3 +19,4 @@ pub(crate) use metrics::MetricsWrapperExec; pub use network_broadcast::NetworkBroadcastExec; pub use network_coalesce::NetworkCoalesceExec; pub use network_shuffle::NetworkShuffleExec; +pub use sampler::SamplerExec; diff --git a/src/execution_plans/network_broadcast.rs b/src/execution_plans/network_broadcast.rs index f9dee080..251ed29c 100644 --- a/src/execution_plans/network_broadcast.rs +++ b/src/execution_plans/network_broadcast.rs @@ -9,7 +9,7 @@ use datafusion::execution::{SendableRecordBatchStream, TaskContext}; use datafusion::physical_expr_common::metrics::MetricsSet; use datafusion::physical_plan::stream::RecordBatchStreamAdapter; use datafusion::physical_plan::{ - DisplayAs, DisplayFormatType, ExecutionPlan, Partitioning, PlanProperties, + DisplayAs, DisplayFormatType, ExecutionPlan, Partitioning, PlanProperties, Statistics, }; use std::fmt::Formatter; use std::sync::Arc; @@ -153,6 +153,7 @@ impl NetworkBroadcastExec { num: 0, plan: input, tasks: producer_tasks, + metrics_set: Default::default(), }), input_properties, )) @@ -160,7 +161,7 @@ impl NetworkBroadcastExec { } impl NetworkBoundary for NetworkBroadcastExec { - fn with_input_stage(&self, input_stage: Stage) -> Result> { + fn with_input_stage(&self, input_stage: Stage) -> Result> { let mut self_clone = self.clone(); self_clone.worker_connections = WorkerConnectionPool::new(input_stage.task_count()); self_clone.input_stage = input_stage; @@ -268,4 +269,12 @@ impl ExecutionPlan for NetworkBroadcastExec { fn metrics(&self) -> Option { Some(self.worker_connections.metrics.clone_inner()) } + + fn partition_statistics(&self, partition: Option) -> Result> { + self.input_stage.partition_statistics( + partition, + self.properties.output_partitioning().partition_count(), + self.schema(), + ) + } } diff --git a/src/execution_plans/network_coalesce.rs b/src/execution_plans/network_coalesce.rs index 8fb06e74..1582d08c 100644 --- a/src/execution_plans/network_coalesce.rs +++ b/src/execution_plans/network_coalesce.rs @@ -12,7 +12,7 @@ use datafusion::physical_plan::limit::LocalLimitExec; use datafusion::physical_plan::stream::RecordBatchStreamAdapter; use datafusion::physical_plan::{ DisplayAs, DisplayFormatType, EmptyRecordBatchStream, ExecutionPlan, PlanProperties, - internal_err, + Statistics, internal_err, }; use std::fmt::{Debug, Formatter}; use std::sync::Arc; @@ -131,6 +131,7 @@ impl NetworkCoalesceExec { num: 0, plan: input, tasks: producer_tasks, + metrics_set: Default::default(), }), input_properties, consumer_tasks, @@ -157,6 +158,7 @@ impl NetworkCoalesceExec { num: local.num, plan: input_with_fetch, tasks: local.tasks, + metrics_set: Default::default(), }); Ok(Arc::new(self_clone)) } @@ -167,7 +169,7 @@ impl NetworkBoundary for NetworkCoalesceExec { &self.input_stage } - fn with_input_stage(&self, input_stage: Stage) -> Result> { + fn with_input_stage(&self, input_stage: Stage) -> Result> { let mut self_clone = self.clone(); self_clone.properties = scale_partitioning_props(self_clone.properties(), |p| { p * input_stage.task_count() / self_clone.input_stage.task_count().max(1) @@ -247,10 +249,8 @@ impl ExecutionPlan for NetworkCoalesceExec { ); } - let partitions_per_task = self - .properties() - .partitioning - .partition_count() + let out_partitions = self.properties().partitioning.partition_count(); + let partitions_per_task = out_partitions .checked_div( self.input_stage .task_count() @@ -311,6 +311,14 @@ impl ExecutionPlan for NetworkCoalesceExec { fn metrics(&self) -> Option { Some(self.worker_connections.metrics.clone_inner()) } + + fn partition_statistics(&self, partition: Option) -> Result> { + self.input_stage.partition_statistics( + partition, + self.properties.output_partitioning().partition_count(), + self.schema(), + ) + } } #[derive(Debug, Clone, Copy)] diff --git a/src/execution_plans/network_shuffle.rs b/src/execution_plans/network_shuffle.rs index 157cfd99..2a575b42 100644 --- a/src/execution_plans/network_shuffle.rs +++ b/src/execution_plans/network_shuffle.rs @@ -11,7 +11,9 @@ use datafusion::physical_expr::Partitioning; use datafusion::physical_expr_common::metrics::MetricsSet; use datafusion::physical_plan::repartition::RepartitionExec; use datafusion::physical_plan::stream::RecordBatchStreamAdapter; -use datafusion::physical_plan::{DisplayAs, DisplayFormatType, ExecutionPlan, PlanProperties}; +use datafusion::physical_plan::{ + DisplayAs, DisplayFormatType, ExecutionPlan, PlanProperties, Statistics, +}; use std::fmt::Formatter; use std::sync::Arc; use uuid::Uuid; @@ -133,6 +135,7 @@ impl NetworkShuffleExec { num: 0, plan: input, tasks: producer_tasks, + metrics_set: Default::default(), }), input_properties, )) @@ -144,7 +147,7 @@ impl NetworkBoundary for NetworkShuffleExec { &self.input_stage } - fn with_input_stage(&self, input_stage: Stage) -> Result> { + fn with_input_stage(&self, input_stage: Stage) -> Result> { let mut self_clone = self.clone(); self_clone.worker_connections = WorkerConnectionPool::new(input_stage.task_count()); self_clone.input_stage = input_stage; @@ -217,7 +220,8 @@ impl ExecutionPlan for NetworkShuffleExec { }; let task_context = DistributedTaskContext::from_ctx(&context); - let off = self.properties.partitioning.partition_count() * task_context.task_index; + let out_partitions = self.properties.partitioning.partition_count(); + let off = out_partitions * task_context.task_index; let mut streams = Vec::with_capacity(remote_stage.workers.len()); for input_task_index in 0..remote_stage.workers.len() { @@ -242,4 +246,12 @@ impl ExecutionPlan for NetworkShuffleExec { fn metrics(&self) -> Option { Some(self.worker_connections.metrics.clone_inner()) } + + fn partition_statistics(&self, partition: Option) -> Result> { + self.input_stage.partition_statistics( + partition, + self.properties.output_partitioning().partition_count(), + self.schema(), + ) + } } diff --git a/src/execution_plans/sampler.rs b/src/execution_plans/sampler.rs new file mode 100644 index 00000000..0e120219 --- /dev/null +++ b/src/execution_plans/sampler.rs @@ -0,0 +1,594 @@ +use crate::common::{require_one_child, vec_cast}; +use crate::worker::generated::worker as pb; +use crate::{ + BytesCounterMetric, BytesMetricExt, GaugeMetricExt, LatencyMetricExt, MaxGaugeMetric, + MaxLatencyMetric, P50LatencyMetric, +}; +use datafusion::arrow::array::Array; +use datafusion::arrow::array::ArrayRef; +use datafusion::arrow::record_batch::RecordBatch; +use datafusion::common::runtime::SpawnedTask; +use datafusion::common::tree_node::{TreeNode, TreeNodeRecursion}; +use datafusion::common::{DataFusionError, Result, exec_err}; +use datafusion::common::{HashSet, ScalarValue}; +use datafusion::execution::memory_pool::{MemoryConsumer, MemoryReservation}; +use datafusion::execution::{SendableRecordBatchStream, TaskContext}; +use datafusion::physical_expr_common::metrics::{Gauge, MetricValue, MetricsSet}; +use datafusion::physical_plan::metrics::{ExecutionPlanMetricsSet, MetricBuilder, Time}; +use datafusion::physical_plan::stream::RecordBatchStreamAdapter; +use datafusion::physical_plan::{DisplayAs, DisplayFormatType, ExecutionPlan, PlanProperties}; +use futures::{FutureExt, Stream, StreamExt, TryFutureExt, TryStreamExt}; +use std::collections::VecDeque; +use std::fmt::{Debug, Formatter}; +use std::pin::Pin; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::{Arc, LazyLock, Mutex, OnceLock}; +use std::task::{Context, Poll}; +use std::time::Instant; +use tokio::sync::oneshot; + +/// How many [RecordBatch]s to allow the input stream to yield synchronously (without yielding back +/// to tokio) before short-circuiting buffering. +const READY_CHUNK_LIMIT: usize = 256; +/// Maximum read of bytes per second allowed to be emitted. Reads greater than this will be +/// truncated to this max value, as it's assumed that [READY_CHUNK_LIMIT] was hit and no useful +/// measurement can actually be emitted. +const MAX_BYTES_PER_SECOND: usize = 512 * 1024 * 1024; +/// Maximum number of rows per second allowed to be emitted. Reads greater than this will be +/// truncated to this max value, as it's assumed that [READY_CHUNK_LIMIT] was hit and no useful +/// measurement can actually be emitted. +const MAX_ROWS_PER_SECOND: usize = 1024 * 1024; +/// Maximum number of rows sampled from the peek queue when estimating per-column NDV. +const NDV_MAX_ROWS_SAMPLE: usize = 1000; + +#[derive(Debug)] +pub struct SamplerExec { + pub(crate) input: Arc, + pub(crate) metric_set: ExecutionPlanMetricsSet, + pub(crate) partition_samplers: Vec, + pub(crate) execution_started: Arc, +} + +/// Metrics that quantify how long the sampler held data in memory before the consumer +/// (real execution) attached, plus the peak accumulated size reached. All metrics are shared +/// across the partition samplers; the latency metrics aggregate per-partition observations. +#[derive(Debug, Clone)] +pub(crate) struct SamplerExecMetrics { + /// Time since [SamplerExec::kick_off_first_sampler] was called until the first batch from + /// the input arrived + kick_off_to_fist_batch_p50: P50LatencyMetric, + kick_off_to_fist_batch_max: MaxLatencyMetric, + /// Time since [SamplerExec::kick_off_first_sampler] was called until the [pb::LoadInfo] message + /// was sent. + kick_off_to_load_info_sent_p50: P50LatencyMetric, + kick_off_to_load_info_sent_max: MaxLatencyMetric, + /// Time since [SamplerExec::kick_off_first_sampler] was called until the node was properly + /// executed with [SamplerExec::execute]. + kick_off_to_execution_p50: P50LatencyMetric, + kick_off_to_execution_max: MaxLatencyMetric, + /// Maximum number of record batches peeked by a sampler. + max_batches_peeked: MaxGaugeMetric, + /// Peak memory accumulated by any partition sampler during the sampling phase. + max_mem_used: Gauge, + /// Bytes per second flowing through the sampler node. + bytes_per_sec: BytesCounterMetric, + /// Bytes ready at the moment of reporting load info. + bytes_ready: BytesCounterMetric, + /// Elapsed compute while sampling. + elapsed_compute: Time, +} + +impl SamplerExecMetrics { + fn new(metric_set: &ExecutionPlanMetricsSet) -> Self { + let bdr = || MetricBuilder::new(metric_set); + Self { + kick_off_to_fist_batch_p50: bdr().p50_latency("kick_off_to_first_batch_p50"), + kick_off_to_fist_batch_max: bdr().max_latency("kick_off_to_first_batch_max"), + kick_off_to_load_info_sent_p50: bdr().p50_latency("kick_off_to_load_info_sent_p50"), + kick_off_to_load_info_sent_max: bdr().max_latency("kick_off_to_load_info_sent_max"), + kick_off_to_execution_p50: bdr().p50_latency("kick_off_to_execution_p50"), + kick_off_to_execution_max: bdr().max_latency("kick_off_to_execution_max"), + max_batches_peeked: bdr().max_gauge("max_batches_peeked"), + max_mem_used: bdr().global_gauge("max_mem_used"), + bytes_per_sec: bdr().bytes_counter("bytes_per_sec"), + bytes_ready: bdr().bytes_counter("bytes_ready"), + elapsed_compute: { + let time = Time::new(); + bdr().build(MetricValue::ElapsedCompute(time.clone())); + time + }, + } + } +} + +impl SamplerExec { + pub(crate) fn new(input: Arc) -> Self { + let metric_set = ExecutionPlanMetricsSet::new(); + let metric_set_clone = metric_set.clone(); + // Metrics need to be lazily initialized, otherwise the coordinator side will register + // them when they are never relevant there, they are just relevant in workers. + // + // If we don't do this, the [SamplerExec] constructed during planning will register its + // own zeroed SamplerExecMetrics in the ExecutionPlanMetricsSet, even if the metrics we care + // about are just the ones collected in workers during execution. + let metrics: Arc SamplerExecMetrics + Send>>> = + Arc::new(LazyLock::new(Box::new(move || { + SamplerExecMetrics::new(&metric_set_clone) + }))); + let partitions = input.properties().partitioning.partition_count(); + let execution_started = Arc::new(AtomicBool::new(false)); + let mut samplers = Vec::with_capacity(partitions); + for i in 0..partitions { + samplers.push(PartitionSampler { + partition_idx: i, + input: Arc::clone(&input), + stream: Mutex::new(None), + metrics: Arc::clone(&metrics), + kick_off_at: Arc::new(OnceLock::new()), + first_batch_at: Arc::new(OnceLock::new()), + load_info_sent_at: Arc::new(OnceLock::new()), + execution_started: Arc::clone(&execution_started), + }); + } + Self { + input, + metric_set, + partition_samplers: samplers, + execution_started, + } + } + + pub(crate) fn kick_off_first_sampler( + plan: Arc, + ctx: Arc, + ) -> Result>> { + let mut receivers = vec![]; + plan.apply(|plan| { + let Some(sampler) = plan.downcast_ref::() else { + return Ok(TreeNodeRecursion::Continue); + }; + receivers.reserve(sampler.partition_samplers.len()); + for partition_sampler in &sampler.partition_samplers { + let rx = partition_sampler.kick_off(Arc::clone(&ctx))?; + receivers.push(rx); + } + Ok(TreeNodeRecursion::Stop) + })?; + Ok(receivers) + } +} + +pub(crate) struct PartitionSampler { + partition_idx: usize, + input: Arc, + stream: Mutex>, + execution_started: Arc, + + // Metrics state. + metrics: Arc SamplerExecMetrics + Send>>>, + /// Set when `kick_off` is invoked. Used at `execute()` time to record how long the + /// sampler sampled data before the consumer attached. + kick_off_at: Arc>, + /// Set the first time the producer task emits a `LoadInfo`. Used at `execute()` time + /// to record the gap between the first sample and the consumer starting. + first_batch_at: Arc>, + /// Set immediately after `sampling_tx.send()` succeeds. Used to measure the full + /// round-trip: LoadInfo sent → coordinator collects votes → downstream plan dispatched + /// → consumer calls execute(). + load_info_sent_at: Arc>, +} + +impl Debug for PartitionSampler { + fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { + f.debug_struct("PartitionSampler").finish() + } +} + +impl PartitionSampler { + fn start_stream(&self) -> Option { + let Some(kick_off_at) = self.kick_off_at.get() else { + return self.stream.lock().unwrap().take(); + }; + + // Time since this sampler was kicked off until the first batch arrived. + if let Some(t) = self.first_batch_at.get() { + let delay = t.saturating_duration_since(*kick_off_at); + self.metrics.kick_off_to_fist_batch_p50.add_duration(delay); + self.metrics.kick_off_to_fist_batch_max.add_duration(delay); + } + + // Time since the sampler was kicked off until the pb::LoadInfo message was sent. + if let Some(t) = self.load_info_sent_at.get() { + let delay = t.saturating_duration_since(*kick_off_at); + self.metrics + .kick_off_to_load_info_sent_p50 + .add_duration(delay); + self.metrics + .kick_off_to_load_info_sent_max + .add_duration(delay); + } + + // Time since the sampler was kicked off until it started executing. + let delay = kick_off_at.elapsed(); + self.metrics.kick_off_to_execution_p50.add_duration(delay); + self.metrics.kick_off_to_execution_max.add_duration(delay); + + self.stream.lock().unwrap().take() + } + + fn kick_off(&self, ctx: Arc) -> Result> { + let _ = self.kick_off_at.set(Instant::now()); + let (sampling_tx, sampling_rx) = oneshot::channel(); + + let input = Arc::clone(&self.input); + let partition_idx = self.partition_idx; + let schema = input.schema(); + let elapsed_compute = self.metrics.elapsed_compute.clone(); + let first_batch_at = Arc::clone(&self.first_batch_at); + let n_cols = self.input.schema().fields.len(); + + let reporter = LoadInfoDropHandler { + load_info: zero_load_info(partition_idx, n_cols), + sampling_tx: Some(sampling_tx), + bytes_per_second_metric: self.metrics.bytes_per_sec.clone(), + load_info_sent_at: Arc::clone(&self.load_info_sent_at), + bytes_ready_metric: self.metrics.bytes_ready.clone(), + omit: Arc::clone(&self.execution_started), + }; + + let mut peek = RecordBatchPeek { + peek: VecDeque::new(), + n_cols, + max_mem_used: self.metrics.max_mem_used.clone(), + max_batches_peeked: self.metrics.max_batches_peeked.clone(), + memory_reservation: Arc::new( + MemoryConsumer::new(format!("PartitionSampler[{partition_idx}]")) + .register(ctx.memory_pool()), + ), + first_batch_at: Arc::clone(&self.first_batch_at), + }; + + // Execute the input synchronously so any setup error surfaces before we + // spawn the producer task. + let mut input_stream = input.execute(partition_idx, ctx)?.fuse(); + + let task = SpawnedTask::spawn(async move { + // First, read at once all the RecordBatches that are ready to be yielded synchronously. + // Some downstream nodes will accumulate data in-memory, and will then yield several + // RecordBatches at once synchronously (without Poll::Pending gaps in between). + let mut chunked = (&mut input_stream).ready_chunks(READY_CHUNK_LIMIT); + let Some(batches) = chunked.next().await else { + // Not a single RecordBatch was produced, so let bytes_per_second=0 be sent as-is. + return Ok(peek.chain(input_stream).boxed()); + }; + let _elapsed_compute_timer = elapsed_compute.timer(); + for batch in batches { + let _ = first_batch_at.set(Instant::now()); + peek.push(batch?); + } + + // Peek whether there is more data to be produced. + if let Some(result) = input_stream.next().now_or_never() { + return if let Some(batch) = result { + // A batch was immediately available without hitting an async gap (the input is + // still yielding synchronously). store it so its rows are not lost. We cannot + // measure a meaningful arrival velocity in this case, so as before, assume the + // worst. + peek.push(batch?); + reporter.report(&peek, MAX_BYTES_PER_SECOND, MAX_ROWS_PER_SECOND); + Ok(peek.chain(input_stream).boxed()) + } else { + // No more batches to read, so no velocity measurement. + reporter.report(&peek, 0, 0); + Ok(peek.chain(input_stream).boxed()) + }; + } + + drop(_elapsed_compute_timer); + + // Wait for an async gap in order to measure data velocity. + let poll_start = Instant::now(); + let Some(batch) = input_stream.try_next().await? else { + let _elapsed_compute_timer = elapsed_compute.timer(); + // The last message was somehow the last message in the stream, but the stream did + // not end immediately. This is an unlikely scenario. + reporter.report(&peek, 0, 0); + return Ok(peek.chain(input_stream).boxed()); + }; + let _elapsed_compute_timer = elapsed_compute.timer(); + + let bytes_per_second = + (record_batch_size(&batch) as f32 / poll_start.elapsed().as_secs_f32()) as usize; + let rows_per_second = + (batch.num_rows() as f32 / poll_start.elapsed().as_secs_f32()) as usize; + + peek.push(batch); + + // Some RecordBatches where buffered, but there's more to be yielded, so both + // bytes_per_second and bytes_ready can be reported. + reporter.report(&peek, bytes_per_second, rows_per_second); + + Ok(peek.chain(input_stream).boxed()) + }); + + let stream = async move { + task.await + .map_err(|err| DataFusionError::Internal(err.to_string()))? + } + .try_flatten_stream(); + + self.stream + .lock() + .expect("poisoned lock") + .replace(Box::pin(RecordBatchStreamAdapter::new(schema, stream))); + + Ok(sampling_rx) + } +} + +/// Wraps a [pb::LoadInfo] and emits it on [Drop] through the provided [oneshot] channel. +/// +/// Emitting on drop ensures that it's always emitted. +struct LoadInfoDropHandler { + omit: Arc, + + load_info: pb::LoadInfo, + bytes_ready_metric: BytesCounterMetric, + bytes_per_second_metric: BytesCounterMetric, + sampling_tx: Option>, + load_info_sent_at: Arc>, +} + +impl LoadInfoDropHandler { + fn report(mut self, peek: &RecordBatchPeek, bps: usize, rps: usize) { + if self.omit.load(Ordering::Relaxed) { + return; + } + + self.set_per_col_bytes_ready(peek.per_col_bytes_ready()); + self.set_rows_ready(peek.rows_ready()); + self.set_per_col_ndv(peek.per_col_ndv()); + self.set_per_col_null_pct(peek.per_col_null_pct()); + self.set_per_col_bytes_per_second(bps); + self.set_rows_per_second(rps) + } + + fn set_per_col_bytes_ready(&mut self, bytes_ready: Vec) { + self.load_info.per_column_bytes_ready = vec_cast(&bytes_ready); + self.bytes_ready_metric.add_bytes(bytes_ready.iter().sum()); + } + + fn set_per_col_bytes_per_second(&mut self, total_bytes_per_second: usize) { + let per_col_ready: &[u64] = &self.load_info.per_column_bytes_ready; + let total_ready: u64 = per_col_ready.iter().sum(); + let per_col: Vec = if total_ready == 0 { + vec![total_bytes_per_second / per_col_ready.len().max(1); per_col_ready.len()] + } else { + per_col_ready + .iter() + .map(|&ready| { + (ready.saturating_mul(total_bytes_per_second as u64) / total_ready) as usize + }) + .collect() + }; + self.load_info.per_column_bytes_per_second = vec_cast(&per_col); + self.bytes_per_second_metric + .add_bytes(total_bytes_per_second); + } + + fn set_rows_ready(&mut self, rows_ready: usize) { + self.load_info.rows_ready = rows_ready as u64; + } + + fn set_rows_per_second(&mut self, rows_per_second: usize) { + self.load_info.rows_per_second = rows_per_second as u64; + } + + fn set_per_col_ndv(&mut self, per_column_ndv: Vec) { + self.load_info.per_column_ndv_percentage = per_column_ndv; + } + + fn set_per_col_null_pct(&mut self, per_column_null_pct: Vec) { + self.load_info.per_column_null_percentage = per_column_null_pct; + } +} + +impl Drop for LoadInfoDropHandler { + fn drop(&mut self) { + if self.omit.load(Ordering::Relaxed) { + return; + } + if let Some(sampling_tx) = self.sampling_tx.take() { + let _ = sampling_tx.send(std::mem::take(&mut self.load_info)); + let _ = self.load_info_sent_at.set(Instant::now()); + } + } +} + +fn zero_load_info(partition_idx: usize, n_cols: usize) -> pb::LoadInfo { + pb::LoadInfo { + partition: partition_idx as u64, + rows_per_second: 0, + rows_ready: 0, + per_column_bytes_per_second: vec![0; n_cols], + per_column_bytes_ready: vec![0; n_cols], + per_column_ndv_percentage: vec![0.0; n_cols], + per_column_null_percentage: vec![0.0; n_cols], + } +} + +struct RecordBatchPeek { + peek: VecDeque, + n_cols: usize, + max_batches_peeked: MaxGaugeMetric, + max_mem_used: Gauge, + memory_reservation: Arc, + first_batch_at: Arc>, +} + +impl RecordBatchPeek { + fn push(&mut self, batch: RecordBatch) { + let batch_size = record_batch_size(&batch); + if self.peek.is_empty() { + let _ = self.first_batch_at.set(Instant::now()); + } + self.max_mem_used.add(batch_size); + self.memory_reservation.grow(batch_size); + self.peek.push_back(batch); + self.max_batches_peeked.set_max(self.peek.len()); + } + + fn per_col_bytes_ready(&self) -> Vec { + let mut result = vec![0; self.n_cols]; + for batch in self.peek.iter() { + for (i, col) in batch.columns().iter().enumerate() { + result[i] += column_size(col) + } + } + result + } + + fn rows_ready(&self) -> usize { + self.peek.iter().map(|batch| batch.num_rows()).sum() + } + + fn per_col_ndv(&self) -> Vec { + let total_rows: usize = self.peek.iter().map(|b| b.num_rows()).sum(); + if total_rows == 0 { + return vec![0.0; self.n_cols]; + } + + // Build the list of flat row indices to sample, sorted for cache-friendly access. + let sampled_indices: Vec = if total_rows <= NDV_MAX_ROWS_SAMPLE { + (0..total_rows).collect() + } else { + let mut indices = + rand::seq::index::sample(&mut rand::rng(), total_rows, NDV_MAX_ROWS_SAMPLE) + .into_vec(); + indices.sort_unstable(); + indices + }; + let rows_sampled = sampled_indices.len(); + + let mut sets: Vec> = vec![HashSet::new(); self.n_cols]; + let mut flat_base = 0usize; + let mut sample_pos = 0usize; + + for batch in &self.peek { + let batch_end = flat_base + batch.num_rows(); + while sample_pos < sampled_indices.len() && sampled_indices[sample_pos] < batch_end { + let row = sampled_indices[sample_pos] - flat_base; + for (col_idx, set) in sets.iter_mut().enumerate() { + let col = batch.column(col_idx); + if !col.is_null(row) + && let Ok(v) = ScalarValue::try_from_array(col, row) + { + set.insert(v); + } + } + sample_pos += 1; + } + if sample_pos >= sampled_indices.len() { + break; + } + flat_base = batch_end; + } + + sets.into_iter() + .map(|s| s.len() as f32 / rows_sampled as f32) + .collect() + } + + fn per_col_null_pct(&self) -> Vec { + let total_rows: usize = self.peek.iter().map(|b| b.num_rows()).sum(); + if total_rows == 0 { + return vec![0.0; self.n_cols]; + } + let mut counts = vec![0usize; self.n_cols]; + for batch in &self.peek { + for (col_idx, count) in counts.iter_mut().enumerate() { + *count += batch.column(col_idx).null_count(); + } + } + counts + .into_iter() + .map(|c| c as f32 / total_rows as f32) + .collect() + } +} + +impl Stream for RecordBatchPeek { + type Item = Result; + + fn poll_next(mut self: Pin<&mut Self>, _cx: &mut Context<'_>) -> Poll> { + match self.as_mut().peek.pop_front() { + None => Poll::Ready(None), + Some(batch) => { + self.memory_reservation.shrink(record_batch_size(&batch)); + Poll::Ready(Some(Ok(batch))) + } + } + } + + fn size_hint(&self) -> (usize, Option) { + (self.peek.len(), Some(self.peek.len())) + } +} + +fn column_size(arr: &ArrayRef) -> usize { + arr.to_data().get_slice_memory_size().unwrap_or(0) +} + +fn record_batch_size(batch: &RecordBatch) -> usize { + batch.columns().iter().map(column_size).sum() +} + +impl DisplayAs for SamplerExec { + fn fmt_as(&self, _t: DisplayFormatType, f: &mut Formatter) -> std::fmt::Result { + write!( + f, + "SamplerExec: partitions={}", + self.partition_samplers.len() + ) + } +} + +impl ExecutionPlan for SamplerExec { + fn name(&self) -> &str { + "SamplerExec" + } + + fn properties(&self) -> &Arc { + self.input.properties() + } + + fn children(&self) -> Vec<&Arc> { + vec![&self.input] + } + + fn with_new_children( + self: Arc, + children: Vec>, + ) -> Result> { + Ok(Arc::new(Self::new(require_one_child(children)?))) + } + + fn execute( + &self, + partition: usize, + _context: Arc, + ) -> Result { + self.execution_started.store(true, Ordering::Relaxed); + let Some(partition_sampler) = self.partition_samplers.get(partition) else { + return exec_err!("Partition {partition} not available in SamplerExec"); + }; + let Some(stream) = partition_sampler.start_stream() else { + return exec_err!("SamplerExec[{partition}] was not kicked off"); + }; + Ok(stream) + } + + fn metrics(&self) -> Option { + Some(self.metric_set.clone_inner()) + } +} diff --git a/src/metrics/bytes_metric.rs b/src/metrics/bytes_metric.rs index 3bdd7f5a..5d8c7e6c 100644 --- a/src/metrics/bytes_metric.rs +++ b/src/metrics/bytes_metric.rs @@ -5,6 +5,7 @@ use std::{ sync::{Arc, atomic::AtomicUsize}, }; +use datafusion::physical_plan::Metric; use datafusion::{ common::human_readable_size, physical_plan::metrics::{CustomMetricValue, MetricBuilder, MetricValue}, @@ -50,6 +51,16 @@ impl Default for BytesCounterMetric { } impl BytesCounterMetric { + pub fn new_metric(name: impl Into>, bytes: usize) -> Arc { + Arc::new(Metric::new( + MetricValue::Custom { + name: name.into(), + value: Arc::new(BytesCounterMetric::from_value(bytes)), + }, + None, + )) + } + pub fn from_value(bytes: usize) -> Self { Self { bytes: Arc::new(AtomicUsize::new(bytes)), diff --git a/src/metrics/task_metrics_rewriter.rs b/src/metrics/task_metrics_rewriter.rs index 3ba5c88c..87d93c96 100644 --- a/src/metrics/task_metrics_rewriter.rs +++ b/src/metrics/task_metrics_rewriter.rs @@ -81,6 +81,7 @@ pub async fn rewrite_distributed_plan_with_metrics( num: stage.num, plan: plan_with_metrics, tasks: stage.tasks, + metrics_set: stage.metrics_set.clone(), }))?; let network_boundary = MetricsWrapperExec::new(network_boundary, plan.metrics().unwrap_or_default()); @@ -415,6 +416,7 @@ mod tests { num: 2, plan, tasks: 4, + metrics_set: Default::default(), } } diff --git a/src/protobuf/distributed_codec.rs b/src/protobuf/distributed_codec.rs index 3cfec30a..1ea27541 100644 --- a/src/protobuf/distributed_codec.rs +++ b/src/protobuf/distributed_codec.rs @@ -1,9 +1,9 @@ use super::get_distributed_user_codecs; use crate::NetworkShuffleExec; -use crate::common::{deserialize_uuid, serialize_uuid}; +use crate::common::{deserialize_uuid, require_one_child, serialize_uuid}; use crate::execution_plans::{ BroadcastExec, ChildWeight, ChildrenIsolatorUnionExec, NetworkBroadcastExec, - NetworkCoalesceExec, + NetworkCoalesceExec, SamplerExec, }; use crate::stage::{LocalStage, RemoteStage, Stage}; use crate::worker::WorkerConnectionPool; @@ -74,6 +74,7 @@ impl PhysicalExtensionCodec for DistributedCodec { num: proto.num as usize, plan: input, tasks: proto.tasks.len(), + metrics_set: Default::default(), })) } else { let mut worker_urls = Vec::with_capacity(proto.tasks.len()); @@ -90,6 +91,7 @@ impl PhysicalExtensionCodec for DistributedCodec { query_id: deserialize_uuid(proto.query_id.as_ref())?, num: proto.num as usize, workers: worker_urls, + runtime_stats: None, })) } } @@ -233,6 +235,9 @@ impl PhysicalExtensionCodec for DistributedCodec { .collect(), })) } + DistributedExecNode::Sampler(SamplerExecProto {}) => { + Ok(Arc::new(SamplerExec::new(require_one_child(inputs)?))) + } } } @@ -349,6 +354,14 @@ impl PhysicalExtensionCodec for DistributedCodec { node: Some(DistributedExecNode::ChildrenIsolatorUnion(inner)), }; + wrapper.encode(buf).map_err(|e| proto_error(format!("{e}"))) + } else if let Some(_node) = node.downcast_ref::() { + let inner = SamplerExecProto {}; + + let wrapper = DistributedExecProto { + node: Some(DistributedExecNode::Sampler(inner)), + }; + wrapper.encode(buf).map_err(|e| proto_error(format!("{e}"))) } else { Err(proto_error(format!("Unexpected plan {}", node.name()))) @@ -380,7 +393,7 @@ pub struct ExecutionTaskProto { #[derive(Clone, PartialEq, ::prost::Message)] pub struct DistributedExecProto { - #[prost(oneof = "DistributedExecNode", tags = "1, 2, 3, 4, 5, 6")] + #[prost(oneof = "DistributedExecNode", tags = "1, 2, 3, 4, 5, 6, 7")] pub node: Option, } @@ -397,6 +410,8 @@ pub enum DistributedExecNode { NetworkBroadcast(NetworkBroadcastExecProto), #[prost(message, tag = "6")] Broadcast(BroadcastExecProto), + #[prost(message, tag = "7")] + Sampler(SamplerExecProto), } /// Protobuf representation of the [NetworkShuffleExec] physical node. It serves as @@ -509,6 +524,9 @@ pub struct BroadcastExecProto { pub consumer_task_count: u64, } +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct SamplerExecProto {} + fn new_network_broadcast_exec( partitioning: Partitioning, schema: SchemaRef, @@ -547,6 +565,7 @@ mod tests { query_id: Default::default(), num: 0, workers: vec![], + runtime_stats: None, }) } @@ -556,6 +575,7 @@ mod tests { num: 0, plan: empty_exec(), tasks: 1, + metrics_set: Default::default(), }) } diff --git a/src/stage.rs b/src/stage.rs index 0545d718..3ac39e7a 100644 --- a/src/stage.rs +++ b/src/stage.rs @@ -1,13 +1,15 @@ use crate::coordinator::{DistributedExec, MetricsStore}; use crate::execution_plans::{DistributedLeafExec, NetworkCoalesceExec}; use crate::metrics::DISTRIBUTED_DATAFUSION_TASK_ID_LABEL; -use datafusion::common::{HashMap, config_err}; +use datafusion::common::{HashMap, Statistics, config_err}; use datafusion::common::{exec_err, plan_err}; use datafusion::error::Result; use datafusion::execution::{SendableRecordBatchStream, TaskContext}; use datafusion::physical_plan::display::DisplayableExecutionPlan; use datafusion::physical_plan::metrics::{Label, Metric, MetricsSet}; -use datafusion::physical_plan::{ExecutionPlan, ExecutionPlanProperties, displayable}; +use datafusion::physical_plan::{ + ColumnStatistics, ExecutionPlan, ExecutionPlanProperties, displayable, +}; use itertools::Either; use std::collections::VecDeque; use std::sync::Arc; @@ -84,6 +86,8 @@ pub struct LocalStage { pub plan: Arc, /// The number of tasks the stage has. pub tasks: usize, + /// Metrics collected by the coordinator + pub metrics_set: MetricsSet, } impl LocalStage { @@ -107,6 +111,8 @@ pub struct RemoteStage { pub num: usize, /// The worker URLs to which queries should be issued. pub workers: Vec, + /// Statistics collected at runtime, if any. + pub runtime_stats: Option>, } impl Stage { @@ -137,6 +143,63 @@ impl Stage { Self::Remote(_) => None, } } + + pub fn metrics(&self) -> MetricsSet { + match &self { + Self::Local(v) => v.metrics_set.clone(), + Self::Remote(_) => MetricsSet::new(), + } + } + + pub fn partition_statistics( + &self, + partition: Option, + partition_count: usize, + schema: SchemaRef, + ) -> Result> { + match self { + Stage::Local(local) => local.plan.partition_statistics(partition), + Stage::Remote(remote) => { + let Some(runtime_stats) = &remote.runtime_stats else { + return Ok(Arc::new(Statistics::new_unknown(&schema))); + }; + match partition { + None => Ok(Arc::clone(runtime_stats)), + Some(_) => Ok(Arc::new(multiply_stats( + runtime_stats, + 1.0 / partition_count as f32, + ))), + } + } + } + } +} + +fn multiply_stats(stats: &Statistics, f: f32) -> Statistics { + Statistics { + num_rows: multiply_precision(stats.num_rows, f), + total_byte_size: multiply_precision(stats.total_byte_size, f), + column_statistics: stats + .column_statistics + .iter() + .map(|col| ColumnStatistics { + null_count: multiply_precision(col.null_count, f), + max_value: Precision::Absent, + min_value: Precision::Absent, + sum_value: Precision::Absent, + distinct_count: multiply_precision(col.distinct_count, f), + byte_size: multiply_precision(col.byte_size, f), + }) + .collect(), + } +} + +fn multiply_precision(p: Precision, f: f32) -> Precision { + match p { + Precision::Exact(v) => Precision::Exact((v as f32 * f) as usize), + Precision::Inexact(v) => Precision::Inexact((v as f32 * f) as usize), + Precision::Absent => Precision::Absent, + } } #[derive(Debug, Clone, Copy, PartialEq)] @@ -161,7 +224,9 @@ use crate::metrics::proto::metric_proto_to_df; use crate::worker::generated::worker as pb; use crate::{DistributedMetricsFormat, NetworkShuffleExec, rewrite_distributed_plan_with_metrics}; use crate::{NetworkBoundary, NetworkBoundaryExt}; +use datafusion::arrow::datatypes::SchemaRef; use datafusion::common::DataFusionError; +use datafusion::common::stats::Precision; use datafusion::physical_expr::Partitioning; /// Be able to display a nice tree for stages. /// @@ -373,7 +438,7 @@ fn gather_stage_header_metrics(stage: &Stage, metrics_store: &MetricsStore) -> M stage_id: stage.num() as u64, task_number: 0, }; - let mut all_metrics = MetricsSet::new(); + let mut all_metrics = stage.metrics(); while let Some(metrics_set) = metrics_store.get(&task_key).and_then(|v| v.task_metrics) { for mut metric in metrics_set.metrics { metric.labels.push(pb::Label { @@ -573,6 +638,7 @@ pub fn display_plan_graphviz(plan: Arc) -> Result { num: max_num + 1, plan: plan.clone(), tasks: 1, + metrics_set: MetricsSet::new(), }); all_stages.insert(0, &head_stage); diff --git a/src/work_unit_feed/remote_work_unit_feed.rs b/src/work_unit_feed/remote_work_unit_feed.rs index f914f228..1526508c 100644 --- a/src/work_unit_feed/remote_work_unit_feed.rs +++ b/src/work_unit_feed/remote_work_unit_feed.rs @@ -38,8 +38,18 @@ pub(crate) struct RemoteWorkUnitFeedRegistry { impl RemoteWorkUnitFeedRegistry { /// Creates all the receivers and senders for a specific [WorkUnit] Feed id. One feed per /// partition is created. + /// + /// Calling this twice with the same `id` is a coordinator bug — duplicate declarations + /// mean two plan nodes share a UUID, which would cause "already consumed" when both + /// nodes call `feed()`. We skip rather than overwrite so the coordinator-side duplicate + /// detection in `task_specialized_plan` surfaces the real error first. pub(crate) fn add(&mut self, id: Uuid, partitions: usize) { for partition in 0..partitions { + // Skip if already registered; overwriting would silently drop the existing + // receiver and cause a confusing "already consumed" error at execution time. + if self.receivers.contains_key(&(id, partition)) { + continue; + } let (tx, rx) = tokio::sync::mpsc::unbounded_channel(); self.receivers.insert((id, partition), Mutex::new(Some(rx))); self.senders.insert((id, partition), tx); diff --git a/src/worker/generated/worker.rs b/src/worker/generated/worker.rs index fe7a0137..290261ed 100644 --- a/src/worker/generated/worker.rs +++ b/src/worker/generated/worker.rs @@ -24,7 +24,7 @@ pub mod coordinator_to_worker_msg { } #[derive(Clone, PartialEq, ::prost::Message)] pub struct WorkerToCoordinatorMsg { - #[prost(oneof = "worker_to_coordinator_msg::Inner", tags = "1")] + #[prost(oneof = "worker_to_coordinator_msg::Inner", tags = "1, 2, 3")] pub inner: ::core::option::Option, } /// Nested message and enum types in `WorkerToCoordinatorMsg`. @@ -37,6 +37,12 @@ pub mod worker_to_coordinator_msg { /// metrics\[i\] is the set of metrics for plan node i in pre-order traversal order. #[prost(message, tag = "1")] TaskMetrics(super::TaskMetrics), + /// Load information reported by a task. This information is used for dynamically + /// sizing the number of workers involved in a query. + #[prost(message, tag = "2")] + LoadInfo(super::LoadInfo), + #[prost(bool, tag = "3")] + LoadInfoEos(bool), } } #[derive(Clone, PartialEq, ::prost::Message)] @@ -52,6 +58,34 @@ pub struct TaskMetrics { #[prost(message, optional, tag = "2")] pub task_metrics: ::core::option::Option, } +/// Load information reported for a specific partition with information about this +/// amount of data flowing through the plan. +#[derive(Clone, PartialEq, ::prost::Message)] +pub struct LoadInfo { + /// The partition index to which this message belongs to. + #[prost(uint64, tag = "1")] + pub partition: u64, + /// The amount of rows ready to be returned. + #[prost(uint64, tag = "2")] + pub rows_ready: u64, + /// The estimated velocity at which rows will flow through the node. If all the rows were + /// already accumulated, they will be reported by `rows_ready`, and this field will be 0. + #[prost(uint64, tag = "3")] + pub rows_per_second: u64, + /// The amount of bytes ready to be returned per column. + #[prost(uint64, repeated, tag = "4")] + pub per_column_bytes_ready: ::prost::alloc::vec::Vec, + /// The estimated velocity at which data will flow through each column. If all the bytes were + /// already accumulated, they will be reported by `bytes_ready`, and this field will be 0. + #[prost(uint64, repeated, tag = "5")] + pub per_column_bytes_per_second: ::prost::alloc::vec::Vec, + /// Approximate ratio of NDV for each column. + #[prost(float, repeated, tag = "6")] + pub per_column_ndv_percentage: ::prost::alloc::vec::Vec, + /// Approximate ratio of null count for each column. + #[prost(float, repeated, tag = "7")] + pub per_column_null_percentage: ::prost::alloc::vec::Vec, +} #[derive(Clone, Copy, PartialEq, Eq, Hash, ::prost::Message)] pub struct GetWorkerInfoRequest {} #[derive(Clone, PartialEq, Eq, Hash, ::prost::Message)] diff --git a/src/worker/impl_coordinator_channel.rs b/src/worker/impl_coordinator_channel.rs index d1c2097f..fcb3944a 100644 --- a/src/worker/impl_coordinator_channel.rs +++ b/src/worker/impl_coordinator_channel.rs @@ -1,4 +1,5 @@ use crate::common::deserialize_uuid; +use crate::execution_plans::SamplerExec; use crate::work_unit_feed::{RemoteWorkUnitFeedRegistry, set_work_unit_received_time}; use crate::worker::LocalWorkerContext; use crate::worker::generated::worker::coordinator_to_worker_msg::Inner; @@ -17,6 +18,7 @@ use datafusion::execution::SessionStateBuilder; use datafusion::prelude::SessionConfig; use datafusion_proto::physical_plan::AsExecutionPlan; use datafusion_proto::protobuf::PhysicalPlanNode; +use futures::stream::FuturesUnordered; use futures::{FutureExt, StreamExt, TryStreamExt}; use std::sync::atomic::AtomicUsize; use std::sync::{Arc, OnceLock}; @@ -55,6 +57,7 @@ impl Worker { } let (metrics_tx, metrics_rx) = oneshot::channel(); + let mut load_info_rxs = vec![]; let task_data = || async { let headers = grpc_headers.into_headers(); @@ -98,6 +101,8 @@ impl Worker { for hook in self.hooks.on_plan.iter() { plan = hook(plan, session_state.config())?; } + load_info_rxs = + SamplerExec::kick_off_first_sampler(Arc::clone(&plan), Arc::clone(&task_ctx))?; // Initialize partition count to the number of partitions in the stage let total_partitions = plan.properties().partitioning.partition_count(); @@ -172,19 +177,34 @@ impl Worker { tokio::spawn(async move { task_data_entries.invalidate(&key).await }); }); + let load_info_stream = FuturesUnordered::from_iter(load_info_rxs) + .filter_map(async |load_info_or_channel_dropped| { + // This error can only happen if the pb::LoadInfo sender was dropped, which is fine. + let load_info = load_info_or_channel_dropped.ok()?; + Some(Ok(WorkerToCoordinatorMsg { + inner: Some(worker_to_coordinator_msg::Inner::LoadInfo(load_info)), + })) + }) + .chain(futures::stream::once(async move { + Ok(WorkerToCoordinatorMsg { + inner: Some(worker_to_coordinator_msg::Inner::LoadInfoEos(true)), + }) + })); + // Stream back the metrics once the task finishes executing. // The oneshot receiver resolves when impl_execute_task sends the collected // metrics after all partitions have finished or been dropped. let metrics_stream = metrics_rx.into_stream(); - let metrics_stream = metrics_stream.filter_map(|task_metrics| async move { - match task_metrics { - Ok(task_metrics) => Some(WorkerToCoordinatorMsg { - inner: Some(worker_to_coordinator_msg::Inner::TaskMetrics(task_metrics)), - }), - Err(_) => None, // channel dropped without sending any message - } + let metrics_stream = metrics_stream.filter_map(async |task_metrics_or_channel_dropped| { + let task_metrics = task_metrics_or_channel_dropped.ok()?; + Some(Ok(WorkerToCoordinatorMsg { + inner: Some(worker_to_coordinator_msg::Inner::TaskMetrics(task_metrics)), + })) }); - Ok(Response::new(metrics_stream.map(Ok).boxed())) + + Ok(Response::new( + futures::stream::select(load_info_stream, metrics_stream).boxed(), + )) } } diff --git a/src/worker/task_data.rs b/src/worker/task_data.rs index 28f5ca5d..97b2e806 100644 --- a/src/worker/task_data.rs +++ b/src/worker/task_data.rs @@ -1,6 +1,7 @@ use crate::MaxLatencyMetric; -use crate::common::{OnceLockResult, now_ns}; -use crate::distributed_planner::{ProducerHead, insert_producer_head}; +use crate::common::OnceLockResult; +use crate::common::now_ns; +use crate::distributed_planner::ProducerHead; use crate::worker::generated::worker as pb; use datafusion::common::{DataFusionError, Result}; use datafusion::execution::TaskContext; @@ -134,7 +135,7 @@ impl TaskData { let producer_head = ProducerHead::from_proto(producer_head, &self.base_plan.schema(), &self.task_ctx)?; - let plan = insert_producer_head(Arc::clone(&self.base_plan), producer_head)?; + let plan = producer_head.insert(Arc::clone(&self.base_plan))?; self.num_partitions_remaining.store( plan.output_partitioning().partition_count(), diff --git a/src/worker/worker.proto b/src/worker/worker.proto index bc1e3412..ef691b59 100644 --- a/src/worker/worker.proto +++ b/src/worker/worker.proto @@ -33,6 +33,12 @@ message WorkerToCoordinatorMsg { // ensuring metrics are never lost due to early stream termination. // metrics[i] is the set of metrics for plan node i in pre-order traversal order. TaskMetrics task_metrics = 1; + + // Load information reported by a task. This information is used for dynamically + // sizing the number of workers involved in a query. + LoadInfo load_info = 2; + + bool load_info_eos = 3; } } @@ -47,6 +53,27 @@ message TaskMetrics { MetricsSet task_metrics = 2; } +// Load information reported for a specific partition with information about this +// amount of data flowing through the plan. +message LoadInfo { + // The partition index to which this message belongs to. + uint64 partition = 1; + // The amount of rows ready to be returned. + uint64 rows_ready = 2; + // The estimated velocity at which rows will flow through the node. If all the rows were + // already accumulated, they will be reported by `rows_ready`, and this field will be 0. + uint64 rows_per_second = 3; + // The amount of bytes ready to be returned per column. + repeated uint64 per_column_bytes_ready = 4; + // The estimated velocity at which data will flow through each column. If all the bytes were + // already accumulated, they will be reported by `bytes_ready`, and this field will be 0. + repeated uint64 per_column_bytes_per_second = 5; + // Approximate ratio of NDV for each column. + repeated float per_column_ndv_percentage = 6; + // Approximate ratio of null count for each column. + repeated float per_column_null_percentage = 7; +} + message GetWorkerInfoRequest {} message GetWorkerInfoResponse { diff --git a/tests/clickbench_correctness_test.rs b/tests/clickbench_correctness_test.rs index 9df2a8d3..acf3daa8 100644 --- a/tests/clickbench_correctness_test.rs +++ b/tests/clickbench_correctness_test.rs @@ -18,6 +18,7 @@ mod tests { use std::sync::Arc; use tokio::sync::OnceCell; + const ADAPTIVE_ENV_VAR: &str = "ADAPTIVE"; const NUM_WORKERS: usize = 4; const PARTITIONS: usize = 3; const FILE_SCAN_CONFIG_BYTES_PER_PARTITION: usize = 1; @@ -289,12 +290,15 @@ mod tests { .options_mut() .execution .target_partitions = PARTITIONS; - let d_ctx = d_ctx + let mut d_ctx = d_ctx .with_distributed_file_scan_config_bytes_per_partition( FILE_SCAN_CONFIG_BYTES_PER_PARTITION, )? .with_distributed_cardinality_effect_task_scale_factor(CARDINALITY_TASK_COUNT_FACTOR)? .with_distributed_broadcast_joins(true)?; + if std::env::var(ADAPTIVE_ENV_VAR).unwrap_or_default() == "true" { + d_ctx.set_distributed_dynamic_task_count(true)?; + } register_tables(&s_ctx, &data_dir).await?; register_tables(&d_ctx, &data_dir).await?; diff --git a/tests/metrics_collection.rs b/tests/metrics_collection.rs index ccb43a57..40d05532 100644 --- a/tests/metrics_collection.rs +++ b/tests/metrics_collection.rs @@ -6,6 +6,7 @@ mod tests { use datafusion::common::{Result, assert_contains}; use datafusion::execution::SessionState; use datafusion::physical_plan::display::DisplayableExecutionPlan; + use datafusion::physical_plan::sorts::sort_preserving_merge::SortPreservingMergeExec; use datafusion::physical_plan::{ExecutionPlan, execute_stream}; use datafusion::prelude::SessionContext; use datafusion_distributed::test_utils::localhost::start_localhost_context; @@ -341,6 +342,37 @@ mod tests { Ok(()) } + #[tokio::test] + async fn test_metrics_collection_dynamic() -> Result<(), Box> { + let (mut d_ctx, _guard, _) = start_localhost_context(3, DefaultSessionBuilder).await; + d_ctx.set_distributed_dynamic_task_count(true)?; + + let query = + r#"SELECT count(*), "RainToday" FROM weather GROUP BY "RainToday" ORDER BY count(*)"#; + + let s_ctx = SessionContext::default(); + let (s_physical, mut d_physical) = execute(&s_ctx, &d_ctx, query).await?; + d_physical = rewrite_with_metrics(d_physical, DistributedMetricsFormat::Aggregated).await; + println!("{}", display_plan_ascii(s_physical.as_ref(), true)); + println!("{}", display_plan_ascii(d_physical.as_ref(), true)); + + assert_metrics_equal::( + ["output_rows", "output_bytes"], + &s_physical, + &d_physical, + 0, + ); + + assert_metrics_equal::( + ["output_rows", "output_bytes"], + &s_physical, + &d_physical, + 0, + ); + + Ok(()) + } + /// Looks for an [ExecutionPlan] that matches the provided type parameter `T1` in /// the left node and `T2` in the right node and compares its metrics. /// There might be more than one, so `index` determines which one is compared. diff --git a/tests/stateful_data_cleanup.rs b/tests/stateful_data_cleanup.rs index a3fe7bca..fae892d2 100644 --- a/tests/stateful_data_cleanup.rs +++ b/tests/stateful_data_cleanup.rs @@ -20,13 +20,18 @@ mod tests { const TPCH_DATA_PARTS: usize = 16; const CARDINALITY_TASK_COUNT_FACTOR: f64 = 1.0; - #[test_case(false; "metrics_disabled")] - #[test_case(true; "metrics_enabled")] + #[test_case((false, false); "metrics_disabled_static_planner")] + #[test_case((true, false); "metrics_enabled_static_planner")] + #[test_case((false, true); "metrics_disabled_dynamic_planner")] + #[test_case((true, true); "metrics_enabled_dynamic_planner")] #[tokio::test(flavor = "multi_thread")] - async fn no_pending_tasks_if_dynamic_query_completes(collect_metrics: bool) -> Result<()> { + async fn no_pending_tasks_if_dynamic_query_completes( + (collect_metrics, adaptive): (bool, bool), + ) -> Result<()> { let (mut d_ctx, _guard, workers) = start_localhost_context(NUM_WORKERS, DefaultSessionBuilder).await; d_ctx.set_distributed_metrics_collection(collect_metrics)?; + d_ctx.set_distributed_dynamic_task_count(adaptive)?; run_tpch_query(d_ctx, "q1").await?; @@ -35,10 +40,18 @@ mod tests { Ok(()) } + #[test_case((false, false); "metrics_disabled_static_planner")] + #[test_case((true, false); "metrics_enabled_static_planner")] + #[test_case((false, true); "metrics_disabled_dynamic_planner")] + #[test_case((true, true); "metrics_enabled_dynamic_planner")] #[tokio::test(flavor = "multi_thread")] - async fn no_pending_tasks_if_query_aborts() -> Result<()> { - let (d_ctx, _guard, workers) = + async fn no_pending_tasks_if_query_aborts( + (collect_metrics, adaptive): (bool, bool), + ) -> Result<()> { + let (mut d_ctx, _guard, workers) = start_localhost_context(NUM_WORKERS, DefaultSessionBuilder).await; + d_ctx.set_distributed_metrics_collection(collect_metrics)?; + d_ctx.set_distributed_dynamic_task_count(adaptive)?; let _ = timeout(Duration::from_millis(100), run_tpch_query(d_ctx, "q1")).await; diff --git a/tests/tpcds_correctness_test.rs b/tests/tpcds_correctness_test.rs index bb6011a7..e4baeba9 100644 --- a/tests/tpcds_correctness_test.rs +++ b/tests/tpcds_correctness_test.rs @@ -18,6 +18,7 @@ mod tests { use std::sync::Arc; use tokio::sync::OnceCell; + const ADAPTIVE_ENV_VAR: &str = "ADAPTIVE"; const NUM_WORKERS: usize = 4; const PARTITIONS: usize = 3; const FILE_SCAN_CONFIG_BYTES_PER_PARTITION: usize = 1; @@ -575,12 +576,15 @@ mod tests { .options_mut() .execution .target_partitions = PARTITIONS; - let d_ctx = d_ctx + let mut d_ctx = d_ctx .with_distributed_file_scan_config_bytes_per_partition( FILE_SCAN_CONFIG_BYTES_PER_PARTITION, )? .with_distributed_cardinality_effect_task_scale_factor(CARDINALITY_TASK_COUNT_FACTOR)? .with_distributed_broadcast_joins(true)?; + if std::env::var(ADAPTIVE_ENV_VAR).unwrap_or_default() == "true" { + d_ctx.set_distributed_dynamic_task_count(true)?; + } register_tables(&s_ctx, &data_dir).await?; register_tables(&d_ctx, &data_dir).await?; diff --git a/tests/tpch_correctness_test.rs b/tests/tpch_correctness_test.rs index 3b6bc5a4..3ae089dc 100644 --- a/tests/tpch_correctness_test.rs +++ b/tests/tpch_correctness_test.rs @@ -12,6 +12,7 @@ mod tests { use std::path::Path; use tokio::sync::OnceCell; + const ADAPTIVE_ENV_VAR: &str = "ADAPTIVE"; const NUM_WORKERS: usize = 4; const PARTITIONS: usize = 6; const FILE_SCAN_CONFIG_BYTES_PER_PARTITION: usize = 1; @@ -139,7 +140,10 @@ mod tests { // in a non-distributed manner. For each query, it asserts that the results are identical. async fn test_tpch_query(sql: String) -> Result<(), Box> { let d_ctx = start_in_memory_context(NUM_WORKERS, DefaultSessionBuilder).await; - let d_ctx = d_ctx.with_distributed_broadcast_joins(true)?; + let mut d_ctx = d_ctx.with_distributed_broadcast_joins(true)?; + if std::env::var(ADAPTIVE_ENV_VAR).unwrap_or_default() == "true" { + d_ctx.set_distributed_dynamic_task_count(true)?; + } let d_ctx = d_ctx .with_distributed_file_scan_config_bytes_per_partition( From def4700acaacb9032baf7b30330d59e0d5225e60 Mon Sep 17 00:00:00 2001 From: Gabriel <45515538+gabotechs@users.noreply.github.com> Date: Thu, 2 Jul 2026 14:15:05 +0200 Subject: [PATCH 05/12] Fix precision sums in cost based planner (#526) Just some small fix + a test in how precision sums are handled --- src/distributed_planner/statistics/cost.rs | 41 +++++++++++++++++++--- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/src/distributed_planner/statistics/cost.rs b/src/distributed_planner/statistics/cost.rs index 9382ce09..dbb76e56 100644 --- a/src/distributed_planner/statistics/cost.rs +++ b/src/distributed_planner/statistics/cost.rs @@ -8,7 +8,7 @@ use datafusion::physical_plan::{ExecutionPlan, Statistics}; use std::ops::AddAssign; use std::sync::Arc; -#[derive(Default)] +#[derive(Default, Debug)] pub(crate) struct Cost { pub(crate) cpu: Precision, pub(crate) memory: Precision, @@ -17,9 +17,18 @@ pub(crate) struct Cost { impl AddAssign for Cost { fn add_assign(&mut self, rhs: Self) { - self.cpu = self.cpu.add(&rhs.cpu); - self.memory = self.memory.add(&rhs.memory); - self.network = self.network.add(&rhs.network); + self.cpu = sum_precision(self.cpu, rhs.cpu); + self.memory = sum_precision(self.memory, rhs.memory); + self.network = sum_precision(self.network, rhs.network); + } +} + +fn sum_precision(one: Precision, other: Precision) -> Precision { + match (one.get_value(), other.get_value()) { + (Some(one), Some(other)) => Precision::Inexact(one + other), + (Some(one), None) => Precision::Inexact(*one), + (None, Some(other)) => Precision::Inexact(*other), + (None, None) => Precision::Absent, } } @@ -53,3 +62,27 @@ fn inexact_or_absent(value: Option) -> Precision { Some(v) => Precision::Inexact(v), } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::assert_snapshot; + use crate::test_utils::plans::TestPlanBuilder; + + #[tokio::test] + async fn smoke_test() -> Result<()> { + let plan = TestPlanBuilder::new() + .target_partitions(4) + .physical_plan(r#"SELECT * FROM weather WHERE "MinTemp" > 5"#) + .await; + let cost = calculate_cost(&plan)?; + assert_snapshot!(format!("{cost:#?}"), @r" + Cost { + cpu: Inexact(154841), + memory: Inexact(0), + network: Inexact(0), + } + "); + Ok(()) + } +} From 60c91cc721d13d70804ced049abbe9de34036024 Mon Sep 17 00:00:00 2001 From: Jayant Shrivastava Date: Mon, 29 Jun 2026 19:49:13 +0000 Subject: [PATCH 06/12] update datafusion to 01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b introduces the proto converter to the PhysicalExtensionCodec trait which helps dedupe dynamic filters --- Cargo.lock | 328 ++++++++---------- Cargo.toml | 18 +- benchmarks/Cargo.toml | 8 +- cli/Cargo.toml | 2 +- cli/src/main.rs | 4 +- console/Cargo.toml | 2 +- examples/custom_execution_plan.rs | 10 +- examples/custom_worker_url_routing.rs | 14 +- examples/work_unit_feed.rs | 10 +- src/distributed_ext.rs | 6 +- .../distributed_query_planner.rs | 74 ++-- .../inject_network_boundaries.rs | 4 +- src/distributed_planner/insert_broadcast.rs | 24 +- .../statistics/complexity_cpu.rs | 53 ++- .../statistics/complexity_memory.rs | 4 +- .../statistics/plan_statistics.rs | 7 +- src/execution_plans/common.rs | 1 + src/execution_plans/distributed_leaf.rs | 7 +- src/metrics/proto.rs | 8 + src/protobuf/distributed_codec.rs | 71 ++-- src/test_utils/routing.rs | 13 +- src/test_utils/test_work_unit_feed.rs | 10 +- src/test_utils/work_unit_file_scan.rs | 27 +- src/worker/session_builder.rs | 6 +- tests/custom_config_extension.rs | 6 +- tests/custom_extension_codec.rs | 6 +- tests/distributed_unions.rs | 14 +- tests/error_propagation.rs | 6 +- tests/stateful_execution_plan.rs | 6 +- 29 files changed, 424 insertions(+), 325 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 7044adaa..b1c0b1f9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -170,6 +170,15 @@ dependencies = [ "derive_arbitrary", ] +[[package]] +name = "arc-swap" +version = "1.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c049c0be4daef0b145cb3555416b3b8ef5b7888a38aea1a3a155801fe7b0810b" +dependencies = [ + "rustversion", +] + [[package]] name = "arrayref" version = "0.3.9" @@ -184,9 +193,9 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" [[package]] name = "arrow" -version = "58.3.0" +version = "59.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "378530e55cd479eda3c14eb345310799717e6f76d0c332041e8487022166b471" +checksum = "ffaaa3e009861fd829d0a24dd6f115aa8e4634324bb092147d43baafe69ca4a7" dependencies = [ "arrow-arith", "arrow-array", @@ -207,9 +216,9 @@ dependencies = [ [[package]] name = "arrow-arith" -version = "58.3.0" +version = "59.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0ab212d2c1886e802f51c5212d78ebbcbb0bec980fff9dadc1eb8d45cd0b738" +checksum = "3ac95125e1d71c4a252b5a9c729aef111e80418f08aaa6dbabd1ba66918247fc" dependencies = [ "arrow-array", "arrow-buffer", @@ -221,9 +230,9 @@ dependencies = [ [[package]] name = "arrow-array" -version = "58.3.0" +version = "59.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfd33d3e92f207444098c75b42de99d329562be0cf686b307b097cc52b4e999e" +checksum = "0c60c79628e9a97cb90d7a0dc3e944f216a902f837d4ecabc14d524bddbbc137" dependencies = [ "ahash", "arrow-buffer", @@ -240,9 +249,9 @@ dependencies = [ [[package]] name = "arrow-avro" -version = "58.3.0" +version = "59.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "049230728cd6e093088c8d231b4beede184e35cad7777c1505c0d5a8571f4376" +checksum = "2835d67df2b69bf5de251ee6d289f85650d41b8169dcee0f950ea88747812c32" dependencies = [ "arrow-array", "arrow-buffer", @@ -264,9 +273,9 @@ dependencies = [ [[package]] name = "arrow-buffer" -version = "58.3.0" +version = "59.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c6cd424c2693bcdbc150d843dc9d4d137dd2de4782ce6df491ad11a3a0416c0" +checksum = "6026f638c400e9878c1b1cc05c3cfd46fbf381285916ab408678701c1df46c1a" dependencies = [ "bytes", "half", @@ -276,9 +285,9 @@ dependencies = [ [[package]] name = "arrow-cast" -version = "58.3.0" +version = "59.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c5aefb56a2c02e9e2b30746241058b85f8983f0fcff2ba0c6d09006e1cded7f" +checksum = "c82c236c3caf8df5664284f3f1fbe89938852163998c3fdbf37e84ac220445e9" dependencies = [ "arrow-array", "arrow-buffer", @@ -298,9 +307,9 @@ dependencies = [ [[package]] name = "arrow-csv" -version = "58.3.0" +version = "59.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e94e8cf7e517657a52b91ea1263acf38c4ca62a84655d72458a3359b12ab97de" +checksum = "12714e5fb7954159af1e26d4e0d37108bcf1a2ad5ee5c5bf02a944d564d588b7" dependencies = [ "arrow-array", "arrow-cast", @@ -313,9 +322,9 @@ dependencies = [ [[package]] name = "arrow-data" -version = "58.3.0" +version = "59.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3c88210023a2bfee1896af366309a3028fc3bcbd6515fa29a7990ee1baa08ee0" +checksum = "7bd568aa70c4ec5947027b0d5caee94877433b661a0bb9e8ddceeeb5f0c9b1ab" dependencies = [ "arrow-buffer", "arrow-schema", @@ -326,9 +335,9 @@ dependencies = [ [[package]] name = "arrow-flight" -version = "58.3.0" +version = "59.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28abfe8bf9f124e5fc83b334af4fa58f8d0323ad25312ccb2d1da50178415704" +checksum = "68365401e834743d708094927e2ca727a32d639fe900df04b936e07a36701b74" dependencies = [ "arrow-array", "arrow-buffer", @@ -346,9 +355,9 @@ dependencies = [ [[package]] name = "arrow-ipc" -version = "58.3.0" +version = "59.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "238438f0834483703d88896db6fe5a7138b2230debc31b34c0336c2996e3c64f" +checksum = "e57ee4d470eab1a021bc4b63fa2b2c15d572892bf227b0a982d3b755a6c662b5" dependencies = [ "arrow-array", "arrow-buffer", @@ -362,9 +371,9 @@ dependencies = [ [[package]] name = "arrow-json" -version = "58.3.0" +version = "59.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "205ca2119e6d679d5c133c6f30e68f027738d95ed948cf77677ea69c7800036b" +checksum = "38f47e0e7a284e1f3707a780dc8cd5451b1614e9e398ea2d9ca03c7a2fe9a9ed" dependencies = [ "arrow-array", "arrow-buffer", @@ -387,9 +396,9 @@ dependencies = [ [[package]] name = "arrow-ord" -version = "58.3.0" +version = "59.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bffd8fd2579286a5d63bac898159873e5094a79009940bcb42bbfce4f19f1d0" +checksum = "a79cf73ad2eba8686ec2aa9bbf8671208e509025f166afc040cedbd94ffe4983" dependencies = [ "arrow-array", "arrow-buffer", @@ -400,9 +409,9 @@ dependencies = [ [[package]] name = "arrow-row" -version = "58.3.0" +version = "59.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bab5994731204603c73ba69267616c50f80780774c6bb0476f1f830625115e0c" +checksum = "cea0f7d8ed6182f14952761e2c0f989852d5aa334fcbc49f73a9f2247c25b879" dependencies = [ "arrow-array", "arrow-buffer", @@ -413,9 +422,9 @@ dependencies = [ [[package]] name = "arrow-schema" -version = "58.3.0" +version = "59.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f633dbfdf39c039ada1bf9e34c694816eb71fbb7dc78f613993b7245e078a1ed" +checksum = "80b3e786a0dd9103acd583a6fb486dbf2f3268466cc0bd571dcf34cef231c1f1" dependencies = [ "serde_core", "serde_json", @@ -423,9 +432,9 @@ dependencies = [ [[package]] name = "arrow-select" -version = "58.3.0" +version = "59.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd065c54172ac787cf3f2f8d4107e0d3fdc26edba76fdf4f4cc170258942222" +checksum = "067a67e0361f6c31f4a7248759f36ca4ca71b187a941ed4d49da1c7d3d4db624" dependencies = [ "ahash", "arrow-array", @@ -437,9 +446,9 @@ dependencies = [ [[package]] name = "arrow-string" -version = "58.3.0" +version = "59.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29dd7cda3ab9692f43a2e4acc444d760cc17b12bb6d8232ddf64e9bab7c06b42" +checksum = "99bc95847f3ff62a2b03d6f8ce2e3e78f01362060549a2a311898dd442f6256d" dependencies = [ "arrow-array", "arrow-buffer", @@ -529,9 +538,9 @@ checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" [[package]] name = "aws-config" -version = "1.8.17" +version = "1.8.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "517aa062d8bd9015ee23d6daa5e1c1372328412fdae4e6c4c1be9b69c6ad37a2" +checksum = "e33f815b73a3899c03b380d543532e5865f230dce9678d108dc10732a8682275" dependencies = [ "aws-credential-types", "aws-runtime", @@ -644,10 +653,11 @@ dependencies = [ [[package]] name = "aws-sdk-sso" -version = "1.99.0" +version = "1.101.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f4055e6099b2ec264abdc0d9bbfffce306c1601809275c861594779a0b04b45" +checksum = "b647baea49ff551960b904f905681e9b4765a6c4ea08631e89dc52d8bd3f5896" dependencies = [ + "arc-swap", "aws-credential-types", "aws-runtime", "aws-smithy-async", @@ -668,10 +678,11 @@ dependencies = [ [[package]] name = "aws-sdk-ssooidc" -version = "1.101.0" +version = "1.103.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02f009ba0284c5d696425fd7b4dcc5b189f5726f4041b7a5794daecb3a68d598" +checksum = "7ae401c65ff288aa7873117fe535cd32b7b1bb0bc43751d28901a1d5f20636b9" dependencies = [ + "arc-swap", "aws-credential-types", "aws-runtime", "aws-smithy-async", @@ -692,10 +703,11 @@ dependencies = [ [[package]] name = "aws-sdk-sts" -version = "1.104.0" +version = "1.106.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6aa6622798e19e6a76b690562085dd4771c736cd48343464a53ab4ae2f2c9f84" +checksum = "4c80de7bb7d03e9ca8c9fd7b489f20f3948d3f3be91a7953591347d238115408" dependencies = [ + "arc-swap", "aws-credential-types", "aws-runtime", "aws-smithy-async", @@ -801,9 +813,9 @@ dependencies = [ [[package]] name = "aws-smithy-json" -version = "0.62.6" +version = "0.62.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "517089205f18ab4adc5a3e02888cb139bbbbb2e168eac9f396216925d1fbeaf5" +checksum = "701a947f4797e52a911e114a898667c746c39feea467bbd1abd7b3721f702ffa" dependencies = [ "aws-smithy-runtime-api", "aws-smithy-schema", @@ -857,9 +869,9 @@ dependencies = [ [[package]] name = "aws-smithy-runtime-api" -version = "1.12.1" +version = "1.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc117c179ecf39a62a0a3f49f600e9ac26a7ad7dd172177999f83933af776c32" +checksum = "9db177daa6ba8afb9ee1aefcf548c907abcf52065e394ee11a92780057fe0e8c" dependencies = [ "aws-smithy-async", "aws-smithy-runtime-api-macros", @@ -897,9 +909,9 @@ dependencies = [ [[package]] name = "aws-smithy-types" -version = "1.4.8" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "056b66dbce2f81cc0c1e2b05bb402eb58f8a3530479d650efadd5bbae9a4050b" +checksum = "32b42fcf341259d85ca10fac9a2f6448a8ec691c6955a18e45bc3b71a85fab85" dependencies = [ "base64-simd", "bytes", @@ -1207,12 +1219,6 @@ version = "1.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c8efb64bd706a16a1bdde310ae86b351e4d21550d98d056f22f8a7f7a2183fec" -[[package]] -name = "byteorder" -version = "1.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" - [[package]] name = "bytes" version = "1.11.1" @@ -1290,9 +1296,9 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.44" +version = "0.4.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c673075a2e0e5f4a1dde27ce9dee1ea4558c7ffe648f576438a20ca1d2acc4b0" +checksum = "1aa79e62e7697b8e29b513a68abacf485adcd1fe8284a4316c5ae868e6633327" dependencies = [ "iana-time-zone", "js-sys", @@ -1863,8 +1869,7 @@ dependencies = [ [[package]] name = "datafusion" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "997a31e15872606a49478e670c58302094c97cb96abb0a7d60720f8e92170040" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "arrow-schema", @@ -1900,7 +1905,7 @@ dependencies = [ "flate2", "futures", "indexmap", - "itertools 0.14.0", + "itertools 0.15.0", "liblzma", "log", "object_store", @@ -1917,8 +1922,7 @@ dependencies = [ [[package]] name = "datafusion-catalog" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7dd61161508f8f5fa1107774ea687bd753c22d83a32eebf963549f89de14139" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "async-trait", @@ -1932,7 +1936,7 @@ dependencies = [ "datafusion-physical-plan", "datafusion-session", "futures", - "itertools 0.14.0", + "itertools 0.15.0", "log", "object_store", "parking_lot", @@ -1942,8 +1946,7 @@ dependencies = [ [[package]] name = "datafusion-catalog-listing" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897c70f871277f9ce99aa38347be0d679bbe3e617156c4d2a8378cec8a2a0891" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "async-trait", @@ -1957,7 +1960,7 @@ dependencies = [ "datafusion-physical-expr-common", "datafusion-physical-plan", "futures", - "itertools 0.14.0", + "itertools 0.15.0", "log", "object_store", ] @@ -1965,8 +1968,7 @@ dependencies = [ [[package]] name = "datafusion-cli" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a9533845ab888508718c2ad540cff205d1111525a9952def8b0e584b6453784" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "async-trait", @@ -1993,8 +1995,7 @@ dependencies = [ [[package]] name = "datafusion-common" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "121c9ded5d87d9172319e006f2afdb9928d72dbacd6a90a458d8acb1e3b43a65" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "arrow-ipc", @@ -2005,9 +2006,10 @@ dependencies = [ "hashbrown 0.17.1", "hex", "indexmap", - "itertools 0.14.0", + "itertools 0.15.0", "libc", "log", + "num-traits", "object_store", "parquet", "recursive", @@ -2020,8 +2022,7 @@ dependencies = [ [[package]] name = "datafusion-common-runtime" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "981b9dae74f78ee3d9f714fb49b01919eab975461b56149510c3ba9ea11287d1" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "futures", "log", @@ -2031,8 +2032,7 @@ dependencies = [ [[package]] name = "datafusion-datasource" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffd7d295b2ec7c00d8a56562f41ed41062cf0af75549ed891c12a0a09eddfefe" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "async-compression", @@ -2052,7 +2052,7 @@ dependencies = [ "flate2", "futures", "glob", - "itertools 0.14.0", + "itertools 0.15.0", "liblzma", "log", "object_store", @@ -2067,8 +2067,7 @@ dependencies = [ [[package]] name = "datafusion-datasource-arrow" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "552b0b3f342f7ec41b3fbd70f6339dc82a30cfd0349e7f280e7852528085349f" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "arrow-ipc", @@ -2083,7 +2082,7 @@ dependencies = [ "datafusion-physical-plan", "datafusion-session", "futures", - "itertools 0.14.0", + "itertools 0.15.0", "object_store", "tokio", ] @@ -2091,8 +2090,7 @@ dependencies = [ [[package]] name = "datafusion-datasource-avro" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb517d08967d536284ce70afb5fe8583133779249f2d7b90587d339741a7f195" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "arrow-avro", @@ -2110,8 +2108,7 @@ dependencies = [ [[package]] name = "datafusion-datasource-csv" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68850aa426b897e879c8b87e512ea8124f1d0a2869a4e51808ddaaddf1bc0ada" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "async-trait", @@ -2133,8 +2130,7 @@ dependencies = [ [[package]] name = "datafusion-datasource-json" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "402f93242ae08ef99139ee2c528a49d087efe88d5c7b2c3ff5480855a40ce54f" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "async-trait", @@ -2156,10 +2152,10 @@ dependencies = [ [[package]] name = "datafusion-datasource-parquet" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffd2499c1bee0eeccf6a57156105700eeeb17bc701899ac719183c4e74231450" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", + "arrow-schema", "async-trait", "bytes", "datafusion-common", @@ -2176,7 +2172,7 @@ dependencies = [ "datafusion-pruning", "datafusion-session", "futures", - "itertools 0.14.0", + "itertools 0.15.0", "log", "object_store", "parking_lot", @@ -2298,18 +2294,17 @@ dependencies = [ [[package]] name = "datafusion-doc" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb9e7e5d11130c48c8bd4e80c79a9772dd28ce6dc330baca9246205d245b9e2e" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" [[package]] name = "datafusion-execution" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37a8643ab852eb68864e1b72ae789e8066282dce48eea6347ffb0aee33d1ccc0" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "arrow-buffer", "async-trait", + "bytes", "dashmap", "datafusion-common", "datafusion-expr", @@ -2321,14 +2316,15 @@ dependencies = [ "parquet", "rand 0.9.4", "tempfile", + "tokio", + "tokio-util", "url", ] [[package]] name = "datafusion-expr" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6932f4d71eed9c8d9341476a2b845aadfabde5495d08dbcd8fc23881f49fa7a0" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "arrow-schema", @@ -2341,7 +2337,7 @@ dependencies = [ "datafusion-functions-window-common", "datafusion-physical-expr-common", "indexmap", - "itertools 0.14.0", + "itertools 0.15.0", "recursive", "serde_json", "sqlparser", @@ -2350,20 +2346,18 @@ dependencies = [ [[package]] name = "datafusion-expr-common" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0225491839a31b1f7d2cb8092c2d50792e2fe1c1724e4e6d08e011f5feaf4ed2" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "datafusion-common", "indexmap", - "itertools 0.14.0", + "itertools 0.15.0", ] [[package]] name = "datafusion-functions" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14872c47bfc3d21e53ec82f57074e6987a15941c1e2f43cde4ac6ae2746634e3" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "arrow-buffer", @@ -2380,7 +2374,7 @@ dependencies = [ "datafusion-macros", "datafusion-physical-expr-common", "hex", - "itertools 0.14.0", + "itertools 0.15.0", "log", "md-5 0.11.0", "memchr", @@ -2394,8 +2388,7 @@ dependencies = [ [[package]] name = "datafusion-functions-aggregate" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75a2ca14e1b609be21e657e2d3130b2f446456b08393b377bb721a33952d2e09" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "datafusion-common", @@ -2406,7 +2399,6 @@ dependencies = [ "datafusion-macros", "datafusion-physical-expr", "datafusion-physical-expr-common", - "foldhash 0.2.0", "half", "log", "num-traits", @@ -2415,8 +2407,7 @@ dependencies = [ [[package]] name = "datafusion-functions-aggregate-common" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ece74ba09092d2ef9c9b54a38445450aea292a1f8b04faf531936b723a24b3c" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "datafusion-common", @@ -2427,8 +2418,7 @@ dependencies = [ [[package]] name = "datafusion-functions-nested" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f3e3f9ee8ca59bf70518802107de6f1b88a9509efdc629fadc5de9d6b2d5ef5" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "arrow-ord", @@ -2443,7 +2433,7 @@ dependencies = [ "datafusion-macros", "datafusion-physical-expr-common", "hashbrown 0.17.1", - "itertools 0.14.0", + "itertools 0.15.0", "itoa", "log", "memchr", @@ -2452,8 +2442,7 @@ dependencies = [ [[package]] name = "datafusion-functions-table" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89161dffc22cf2b50f9f4b1bee83b5221d3b4ed7c2e37fd7aa2b22a5297b3a26" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "async-trait", @@ -2468,8 +2457,7 @@ dependencies = [ [[package]] name = "datafusion-functions-window" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7339345b226b3874037708bf5023ba1c2de705128f8457a095aae5ae9cb9c78" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "datafusion-common", @@ -2485,8 +2473,7 @@ dependencies = [ [[package]] name = "datafusion-functions-window-common" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa84836dc2392df6f43d6a29d37fb56a8ebdc8b3f4e10ae8dc15861fd20278fb" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "datafusion-common", "datafusion-physical-expr-common", @@ -2495,8 +2482,7 @@ dependencies = [ [[package]] name = "datafusion-macros" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "587164e03ad68732aa9e7bfe5686e3f25970d4c64fd4bd80790749840892dae5" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "datafusion-doc", "quote", @@ -2506,8 +2492,7 @@ dependencies = [ [[package]] name = "datafusion-optimizer" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77f20e8cf9e8654d92f4c16b24c487353ee5bf153ffc12d5772cd399ab8cd281" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "chrono", @@ -2516,7 +2501,7 @@ dependencies = [ "datafusion-expr-common", "datafusion-physical-expr", "indexmap", - "itertools 0.14.0", + "itertools 0.15.0", "log", "recursive", "regex", @@ -2526,8 +2511,7 @@ dependencies = [ [[package]] name = "datafusion-physical-expr" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f015a4a82f6f7ff7e1d8d4bf3870a936752fa38b17705dfcc14adef95aa8922c" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "datafusion-common", @@ -2535,10 +2519,11 @@ dependencies = [ "datafusion-expr-common", "datafusion-functions-aggregate-common", "datafusion-physical-expr-common", + "datafusion-proto-models", "half", "hashbrown 0.17.1", "indexmap", - "itertools 0.14.0", + "itertools 0.15.0", "parking_lot", "petgraph", "recursive", @@ -2548,8 +2533,7 @@ dependencies = [ [[package]] name = "datafusion-physical-expr-adapter" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51e6ffff8acdfe54e0ea15ccf38115c4a9184433b0439f42907637928d00a235" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "datafusion-common", @@ -2557,22 +2541,22 @@ dependencies = [ "datafusion-functions", "datafusion-physical-expr", "datafusion-physical-expr-common", - "itertools 0.14.0", + "itertools 0.15.0", ] [[package]] name = "datafusion-physical-expr-common" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7967a3e171c6a4bf09474b3f7a14f1a3db13ed1714ba12156f33fcce2bba54e8" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "chrono", "datafusion-common", "datafusion-expr-common", + "datafusion-proto-models", "hashbrown 0.17.1", "indexmap", - "itertools 0.14.0", + "itertools 0.15.0", "parking_lot", "pin-project", ] @@ -2580,8 +2564,7 @@ dependencies = [ [[package]] name = "datafusion-physical-optimizer" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59ff803e2a96054cb6d83f35f9e60fd4f42eac515e1932bd1b2dbc91d5fcbf36" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "datafusion-common", @@ -2592,15 +2575,14 @@ dependencies = [ "datafusion-physical-expr-common", "datafusion-physical-plan", "datafusion-pruning", - "itertools 0.14.0", + "itertools 0.15.0", "recursive", ] [[package]] name = "datafusion-physical-plan" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "776ee54d47d15bdb126452f9ca17b03761e3b004682914beaedd3f86eb507fbc" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "arrow-data", @@ -2608,6 +2590,7 @@ dependencies = [ "arrow-ord", "arrow-schema", "async-trait", + "bytes", "datafusion-common", "datafusion-common-runtime", "datafusion-execution", @@ -2617,23 +2600,25 @@ dependencies = [ "datafusion-functions-window-common", "datafusion-physical-expr", "datafusion-physical-expr-common", + "datafusion-proto-common", + "datafusion-proto-models", "futures", "half", "hashbrown 0.17.1", "indexmap", - "itertools 0.14.0", + "itertools 0.15.0", "log", "num-traits", "parking_lot", "pin-project-lite", + "serde_json", "tokio", ] [[package]] name = "datafusion-proto" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9dd15a1ba5d3af93808241065c6c44dbca8296a189845e8a587c45c07bf0ffae" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "chrono", @@ -2652,6 +2637,7 @@ dependencies = [ "datafusion-physical-expr-common", "datafusion-physical-plan", "datafusion-proto-common", + "datafusion-proto-models", "object_store", "prost", ] @@ -2659,19 +2645,26 @@ dependencies = [ [[package]] name = "datafusion-proto-common" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90042982cf9462eb06a0b81f92efa4188dae871e7ea3ab8dc61aa9c9349b2530" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "datafusion-common", "prost", ] +[[package]] +name = "datafusion-proto-models" +version = "54.0.0" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" +dependencies = [ + "datafusion-proto-common", + "prost", +] + [[package]] name = "datafusion-pruning" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fb9e5774660aa69c3ba93c610f175f75b65cb8c3776edb3626de8f3a4f4ee3" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "datafusion-common", @@ -2686,8 +2679,7 @@ dependencies = [ [[package]] name = "datafusion-session" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "15ce715fa2a61f4623cc234bcc14a3ef6a91f189128d5b14b468a6a17cdfc417" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "async-trait", "datafusion-common", @@ -2700,8 +2692,7 @@ dependencies = [ [[package]] name = "datafusion-sql" version = "54.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6094ad36a3ed6d7ac87b20b479b2d0b118250f66cf997603829fdc65b44a7099" +source = "git+https://github.com/apache/datafusion.git?rev=01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b#01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" dependencies = [ "arrow", "bigdecimal", @@ -3818,12 +3809,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "integer-encoding" -version = "3.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bb03732005da905c88227371639bf1ad885cc712789c011c31c5fb3ab3ccf02" - [[package]] name = "ipnet" version = "2.12.0" @@ -3865,6 +3850,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.18" @@ -4203,9 +4197,9 @@ dependencies = [ [[package]] name = "memchr" -version = "2.8.0" +version = "2.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +checksum = "88904434abc2901f197fe8cc55f0445e7ded921dba5911dad2e2b39b48e663c4" [[package]] name = "memmem" @@ -4544,15 +4538,6 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" -[[package]] -name = "ordered-float" -version = "2.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68f19d67e5a2795c94e73e0bb1cc1a7edeb2e28efd39e2e1c9b7a40c1108b11c" -dependencies = [ - "num-traits", -] - [[package]] name = "ordered-float" version = "4.6.0" @@ -4605,9 +4590,9 @@ dependencies = [ [[package]] name = "parquet" -version = "58.3.0" +version = "59.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dafa7d01085b62a47dd0c1829550a0a36710ea9c4fe358a05a85477cec8a908" +checksum = "970dff83e97d953c827ae8176f6bf4e9f77bf62daacc01ec5df348ec5eacd913" dependencies = [ "ahash", "arrow-array", @@ -4634,7 +4619,6 @@ dependencies = [ "seq-macro", "simdutf8", "snap", - "thrift", "tokio", "twox-hash", "zstd", @@ -5644,6 +5628,7 @@ version = "1.0.150" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e8014e44b4736ed0538adeecded0fce2a272f22dc9578a7eb6b2d9993c74cfb9" dependencies = [ + "indexmap", "itoa", "memchr", "serde", @@ -6085,7 +6070,7 @@ dependencies = [ "nix 0.29.0", "num-derive", "num-traits", - "ordered-float 4.6.0", + "ordered-float", "pest", "pest_derive", "phf 0.11.3", @@ -6197,17 +6182,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "thrift" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e54bc85fc7faa8bc175c4bab5b92ba8d9a3ce893d0e9f42cc455c8ab16a9e09" -dependencies = [ - "byteorder", - "integer-encoding", - "ordered-float 2.10.1", -] - [[package]] name = "time" version = "0.3.47" @@ -6459,12 +6433,12 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tpchgen" version = "2.0.2" -source = "git+https://github.com/clflushopt/tpchgen-rs?rev=438e9c2dbc25b2fff82c0efc08b3f13b5707874f#438e9c2dbc25b2fff82c0efc08b3f13b5707874f" +source = "git+https://github.com/clflushopt/tpchgen-rs?rev=f42708c32e7fd816b8ad8d2a880c1802a71b669f#f42708c32e7fd816b8ad8d2a880c1802a71b669f" [[package]] name = "tpchgen-arrow" version = "2.0.2" -source = "git+https://github.com/clflushopt/tpchgen-rs?rev=438e9c2dbc25b2fff82c0efc08b3f13b5707874f#438e9c2dbc25b2fff82c0efc08b3f13b5707874f" +source = "git+https://github.com/clflushopt/tpchgen-rs?rev=f42708c32e7fd816b8ad8d2a880c1802a71b669f#f42708c32e7fd816b8ad8d2a880c1802a71b669f" dependencies = [ "arrow", "tpchgen", @@ -6883,7 +6857,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f2ab60e120fd6eaa68d9567f3226e876684639d22a4219b313ff69ec0ccd5ac" dependencies = [ "log", - "ordered-float 4.6.0", + "ordered-float", "strsim 0.11.1", "thiserror 1.0.69", "wezterm-dynamic-derive", diff --git a/Cargo.toml b/Cargo.toml index fd5ceab2..7f71d930 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,8 +2,8 @@ members = ["benchmarks", "cli", "console"] [workspace.dependencies] -datafusion = { version = "54.0.0", default-features = false } -datafusion-proto = { version = "54.0.0" } +datafusion = { git = "https://github.com/apache/datafusion.git", rev = "01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b", default-features = false } +datafusion-proto = { git = "https://github.com/apache/datafusion.git", rev = "01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b" } [package] name = "datafusion-distributed" @@ -23,9 +23,9 @@ datafusion = { workspace = true, features = [ "datetime_expressions", ] } datafusion-proto = { workspace = true } -arrow-flight = "58" -arrow-select = "58" -arrow-ipc = { version = "58", features = ["zstd"] } +arrow-flight = "59" +arrow-select = "59" +arrow-ipc = { version = "59", features = ["zstd"] } async-trait = "0.1.89" tokio = { version = "1.48", features = ["full"] } tonic = { version = "0.14.1", features = ["transport"] } @@ -54,8 +54,8 @@ tonic-prost = "0.14.2" # integration_tests deps insta = { version = "1.46.0", features = ["filters"], optional = true } -parquet = { version = "58", optional = true } -arrow = { version = "58", optional = true, features = ["test_utils"] } +parquet = { version = "59", optional = true } +arrow = { version = "59", optional = true, features = ["test_utils"] } hyper-util = { version = "0.1.16", optional = true } [features] @@ -74,8 +74,8 @@ sysinfo = ["dep:sysinfo"] datafusion-distributed-benchmarks = { path = "benchmarks" } structopt = "0.3" insta = { version = "1.46.0", features = ["filters"] } -parquet = "58" -arrow = { version = "58", features = ["test_utils"] } +parquet = "59" +arrow = { version = "59", features = ["test_utils"] } tokio-stream = { version = "0.1.17", features = ["sync"] } hyper-util = "0.1.16" pretty_assertions = "1.4" diff --git a/benchmarks/Cargo.toml b/benchmarks/Cargo.toml index 0a03ead0..a40f7359 100644 --- a/benchmarks/Cargo.toml +++ b/benchmarks/Cargo.toml @@ -11,7 +11,7 @@ datafusion-distributed = { path = "..", features = [ "system-metrics", ] } tokio = { version = "1.48", features = ["full"] } -parquet = { version = "58" } +parquet = { version = "59" } structopt = { version = "0.3.26" } log = "0.4.27" serde = "1.0.219" @@ -20,10 +20,10 @@ env_logger = "0.11.8" async-trait = "0.1.89" futures = "0.3.31" url = "2.5.7" -arrow = { version = "58", features = ["test_utils"] } +arrow = { version = "59", features = ["test_utils"] } tonic = { version = "0.14.1", features = ["transport"] } -tpchgen = { git = "https://github.com/clflushopt/tpchgen-rs", rev = "438e9c2dbc25b2fff82c0efc08b3f13b5707874f" } -tpchgen-arrow = { git = "https://github.com/clflushopt/tpchgen-rs", rev = "438e9c2dbc25b2fff82c0efc08b3f13b5707874f" } +tpchgen = { git = "https://github.com/clflushopt/tpchgen-rs", rev = "f42708c32e7fd816b8ad8d2a880c1802a71b669f" } +tpchgen-arrow = { git = "https://github.com/clflushopt/tpchgen-rs", rev = "f42708c32e7fd816b8ad8d2a880c1802a71b669f" } reqwest = "0.12" zip = "6.0" axum = "0.7" diff --git a/cli/Cargo.toml b/cli/Cargo.toml index 66c85565..fd8b0c0a 100644 --- a/cli/Cargo.toml +++ b/cli/Cargo.toml @@ -6,7 +6,7 @@ edition = "2024" [dependencies] datafusion = { workspace = true } datafusion-distributed = { path = "..", features = ["avro", "integration"] } -datafusion-cli = { version = "54", default-features = false } +datafusion-cli = { git = "https://github.com/apache/datafusion.git", rev = "01bf68cdc46ffbf4c226e760b0ba8a63fdb89a6b", default-features = false } tokio = { version = "1.48", features = ["full"] } clap = { version = "4", features = ["derive"] } env_logger = "0.11" diff --git a/cli/src/main.rs b/cli/src/main.rs index f3a10491..e3bea80e 100644 --- a/cli/src/main.rs +++ b/cli/src/main.rs @@ -18,7 +18,7 @@ // File mainly copied from https://github.com/apache/datafusion/blob/main/datafusion-cli/src/main.rs use clap::Parser; -use datafusion::common::config_err; +use datafusion::common::{config::ConfigNonZeroUsize, config_err}; use datafusion::config::ConfigOptions; use datafusion::error::{DataFusionError, Result}; use datafusion::execution::SessionStateBuilder; @@ -214,7 +214,7 @@ fn get_session_config(args: &Args) -> Result { if batch_size == 0 { return config_err!("batch_size must be greater than 0"); } - config_options.execution.batch_size = batch_size; + config_options.execution.batch_size = ConfigNonZeroUsize::try_new(batch_size)?; }; // use easier to understand "tree" mode by default diff --git a/console/Cargo.toml b/console/Cargo.toml index 5267842e..5f043375 100644 --- a/console/Cargo.toml +++ b/console/Cargo.toml @@ -17,7 +17,7 @@ url = "2.5.7" tokio-stream = "0.1.18" [dev-dependencies] -arrow = "58" +arrow = "59" async-trait = "0.1.89" datafusion-distributed-benchmarks = { path = "../benchmarks" } futures = "0.3.31" diff --git a/examples/custom_execution_plan.rs b/examples/custom_execution_plan.rs index e322139c..76d4d941 100644 --- a/examples/custom_execution_plan.rs +++ b/examples/custom_execution_plan.rs @@ -42,7 +42,7 @@ use datafusion_distributed::{ DistributedExt, DistributedTaskContext, SessionStateBuilderExt, TaskEstimation, TaskEstimator, WorkerQueryContext, display_plan_ascii, }; -use datafusion_proto::physical_plan::PhysicalExtensionCodec; +use datafusion_proto::physical_plan::{PhysicalExtensionCodec, PhysicalProtoConverterExtension}; use datafusion_proto::protobuf; use datafusion_proto::protobuf::proto_error; use futures::{TryStreamExt, stream}; @@ -241,6 +241,7 @@ impl PhysicalExtensionCodec for NumbersExecCodec { buf: &[u8], inputs: &[Arc], _ctx: &TaskContext, + _proto_converter: &dyn PhysicalProtoConverterExtension, ) -> Result> { if !inputs.is_empty() { return internal_err!("NumbersExec should have no children, got {}", inputs.len()); @@ -261,7 +262,12 @@ impl PhysicalExtensionCodec for NumbersExecCodec { ))) } - fn try_encode(&self, node: Arc, buf: &mut Vec) -> Result<()> { + fn try_encode( + &self, + node: Arc, + buf: &mut Vec, + _proto_converter: &dyn PhysicalProtoConverterExtension, + ) -> Result<()> { let Some(exec) = node.downcast_ref::() else { return internal_err!("Expected plan to be NumbersExec, but was {}", node.name()); }; diff --git a/examples/custom_worker_url_routing.rs b/examples/custom_worker_url_routing.rs index 4ae9735f..2cb6b9a9 100644 --- a/examples/custom_worker_url_routing.rs +++ b/examples/custom_worker_url_routing.rs @@ -44,8 +44,8 @@ use datafusion_distributed::{ DistributedConfig, DistributedExt, DistributedLeafExec, SessionStateBuilderExt, TaskEstimation, TaskEstimator, TaskRoutingContext, WorkerQueryContext, display_plan_ascii, }; -use datafusion_proto::physical_plan::PhysicalExtensionCodec; -use datafusion_proto::protobuf; +use datafusion_proto::physical_plan::{PhysicalExtensionCodec, PhysicalProtoConverterExtension}; +use datafusion_proto::{TryFromProto, protobuf}; use futures::TryStreamExt; use prost::Message; use std::error::Error; @@ -151,7 +151,7 @@ impl ExecutionPlan for CacheExec { fn hash_key(file_group: &FileGroup) -> usize { let mut hasher = DefaultHasher::new(); for file in file_group.files() { - let serialized: protobuf::PartitionedFile = file.try_into().unwrap(); + let serialized = protobuf::PartitionedFile::try_from_proto(file).unwrap(); hasher.write(&serialized.encode_to_vec()); } hasher.finish() as usize @@ -255,6 +255,7 @@ impl PhysicalExtensionCodec for CachedFileScanCodec { _buf: &[u8], inputs: &[Arc], _ctx: &TaskContext, + _proto_converter: &dyn PhysicalProtoConverterExtension, ) -> Result> { let [child] = inputs else { return internal_err!("CacheExec expects exactly 1 child, got {}", inputs.len()); @@ -262,7 +263,12 @@ impl PhysicalExtensionCodec for CachedFileScanCodec { Ok(CacheExec::new(Arc::clone(child))) } - fn try_encode(&self, node: Arc, _buf: &mut Vec) -> Result<()> { + fn try_encode( + &self, + node: Arc, + _buf: &mut Vec, + _proto_converter: &dyn PhysicalProtoConverterExtension, + ) -> Result<()> { if node.downcast_ref::().is_none() { return internal_err!("Expected CacheExec, got {}", node.name()); } diff --git a/examples/work_unit_feed.rs b/examples/work_unit_feed.rs index 790c32d4..8b70b314 100644 --- a/examples/work_unit_feed.rs +++ b/examples/work_unit_feed.rs @@ -33,7 +33,7 @@ use datafusion_distributed::{ DistributedExt, DistributedTaskContext, SessionStateBuilderExt, TaskEstimation, TaskEstimator, WorkUnitFeed, WorkUnitFeedProto, WorkUnitFeedProvider, WorkerQueryContext, display_plan_ascii, }; -use datafusion_proto::physical_plan::PhysicalExtensionCodec; +use datafusion_proto::physical_plan::{PhysicalExtensionCodec, PhysicalProtoConverterExtension}; use datafusion_proto::protobuf::proto_error; use futures::stream::BoxStream; use futures::{StreamExt, TryStreamExt}; @@ -209,6 +209,7 @@ impl PhysicalExtensionCodec for RemoteScanExecCodec { buf: &[u8], _inputs: &[Arc], _ctx: &TaskContext, + _proto_converter: &dyn PhysicalProtoConverterExtension, ) -> Result> { let p = RemoteScanProto::decode(buf).map_err(|e| proto_error(format!("{e}")))?; let feed = WorkUnitFeed::::from_proto( @@ -223,7 +224,12 @@ impl PhysicalExtensionCodec for RemoteScanExecCodec { ))) } - fn try_encode(&self, node: Arc, buf: &mut Vec) -> Result<()> { + fn try_encode( + &self, + node: Arc, + buf: &mut Vec, + _proto_converter: &dyn PhysicalProtoConverterExtension, + ) -> Result<()> { let exec = node .downcast_ref::() .ok_or_else(|| proto_error(format!("expected RemoteScanExec, got {}", node.name())))?; diff --git a/src/distributed_ext.rs b/src/distributed_ext.rs index d33b18a6..fb7c479e 100644 --- a/src/distributed_ext.rs +++ b/src/distributed_ext.rs @@ -145,18 +145,18 @@ pub trait DistributedExt: Sized { /// # use datafusion::execution::{SessionState, FunctionRegistry, SessionStateBuilder, TaskContext}; /// # use datafusion::physical_plan::ExecutionPlan; /// # use datafusion::prelude::SessionConfig; - /// # use datafusion_proto::physical_plan::PhysicalExtensionCodec; + /// # use datafusion_proto::physical_plan::{PhysicalExtensionCodec, PhysicalProtoConverterExtension}; /// # use datafusion_distributed::{DistributedExt, WorkerQueryContext}; /// /// #[derive(Debug)] /// struct CustomExecCodec; /// /// impl PhysicalExtensionCodec for CustomExecCodec { - /// fn try_decode(&self, buf: &[u8], inputs: &[Arc], ctx: &TaskContext) -> datafusion::common::Result> { + /// fn try_decode(&self, buf: &[u8], inputs: &[Arc], ctx: &TaskContext, proto_converter: &dyn PhysicalProtoConverterExtension) -> datafusion::common::Result> { /// todo!() /// } /// - /// fn try_encode(&self, node: Arc, buf: &mut Vec) -> datafusion::common::Result<()> { + /// fn try_encode(&self, node: Arc, buf: &mut Vec, proto_converter: &dyn PhysicalProtoConverterExtension) -> datafusion::common::Result<()> { /// todo!() /// } /// } diff --git a/src/distributed_planner/distributed_query_planner.rs b/src/distributed_planner/distributed_query_planner.rs index 8e2d8f2c..55676756 100644 --- a/src/distributed_planner/distributed_query_planner.rs +++ b/src/distributed_planner/distributed_query_planner.rs @@ -339,11 +339,11 @@ mod tests { let physical_plan_ascii = TestPlanBuilder::default() .physical_plan_as_ascii(query, false) .await; - assert_snapshot!(physical_plan_ascii, @r" + assert_snapshot!(physical_plan_ascii, @" HashJoinExec: mode=CollectLeft, join_type=Left, on=[(RainToday@1, RainToday@1)], projection=[MinTemp@0, MaxTemp@2] CoalescePartitionsExec DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MinTemp, RainToday], file_type=parquet - DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] + DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible "); } @@ -375,7 +375,7 @@ mod tests { let physical_plan_ascii = TestPlanBuilder::default() .physical_plan_as_ascii(query, false) .await; - assert_snapshot!(physical_plan_ascii, @r" + assert_snapshot!(physical_plan_ascii, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ CoalescePartitionsExec │ HashJoinExec: mode=CollectLeft, join_type=Left, on=[(RainTomorrow@1, RainTomorrow@1)], projection=[MinTemp@0, MaxTemp@2] @@ -406,9 +406,9 @@ mod tests { │ FilterExec: RainToday@1 = no, projection=[MaxTemp@0, RainTomorrow@2] │ RepartitionExec: partitioning=RoundRobinBatch(4), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000000.parquet:.., /testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday, RainTomorrow], file_type=parquet, predicate=RainToday@19 = no AND DynamicFilter [ empty ], pruning_predicate=RainToday_null_count@2 != row_count@3 AND RainToday_min@0 <= no AND no <= RainToday_max@1, required_guarantees=[RainToday in (no)] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday, RainTomorrow], file_type=parquet, predicate=RainToday@19 = no AND DynamicFilter [ empty ], pruning_predicate=RainToday_null_count@2 != row_count@3 AND RainToday_min@0 <= no AND no <= RainToday_max@1, required_guarantees=[RainToday in (no)] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:.., /testdata/weather/result-000002.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday, RainTomorrow], file_type=parquet, predicate=RainToday@19 = no AND DynamicFilter [ empty ], pruning_predicate=RainToday_null_count@2 != row_count@3 AND RainToday_min@0 <= no AND no <= RainToday_max@1, required_guarantees=[RainToday in (no)] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000000.parquet:.., /testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday, RainTomorrow], file_type=parquet, predicate=RainToday@19 = no AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=RainToday_null_count@2 != row_count@3 AND RainToday_min@0 <= no AND no <= RainToday_max@1, required_guarantees=[RainToday in (no)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday, RainTomorrow], file_type=parquet, predicate=RainToday@19 = no AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=RainToday_null_count@2 != row_count@3 AND RainToday_min@0 <= no AND no <= RainToday_max@1, required_guarantees=[RainToday in (no)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:.., /testdata/weather/result-000002.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday, RainTomorrow], file_type=parquet, predicate=RainToday@19 = no AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=RainToday_null_count@2 != row_count@3 AND RainToday_min@0 <= no AND no <= RainToday_max@1, required_guarantees=[RainToday in (no)] └────────────────────────────────────────────────── "); } @@ -522,7 +522,7 @@ mod tests { .num_workers(2) .physical_plan_as_ascii(query, false) .await; - assert_snapshot!(physical_plan_ascii, @r" + assert_snapshot!(physical_plan_ascii, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ CoalescePartitionsExec │ [Stage 1] => NetworkCoalesceExec: output_partitions=4, input_tasks=2 @@ -532,7 +532,7 @@ mod tests { │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/weather/result-000000.parquet:.., /testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000001.parquet:.., /testdata/weather/result-000002.parquet:..]]}, projection=[1 as Int64(1)], file_type=parquet │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={1 group: [[/testdata/flights-1m.parquet:..]]}, projection=[1 as Int64(1)], file_type=parquet + │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/flights-1m.parquet:..], [/testdata/flights-1m.parquet:..]]}, projection=[1 as Int64(1)], file_type=parquet └────────────────────────────────────────────────── "); } @@ -548,17 +548,17 @@ mod tests { .distributed_max_tasks_per_stage(2) .physical_plan_as_ascii(query, false) .await; - assert_snapshot!(physical_plan_ascii, @r" + assert_snapshot!(physical_plan_ascii, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ CoalescePartitionsExec - │ [Stage 1] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 + │ [Stage 1] => NetworkCoalesceExec: output_partitions=8, input_tasks=2 └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p2] t1:[p3..p5] + ┌───── Stage 1 ── Tasks: t0:[p0..p3] t1:[p4..p7] │ DistributedUnionExec: t0:[c0] t1:[c1] │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000000.parquet:.., /testdata/weather/result-000001.parquet:.., /testdata/weather/result-000002.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[1 as Int64(1)], file_type=parquet │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={1 group: [[/testdata/flights-1m.parquet:..]]}, projection=[1 as Int64(1)], file_type=parquet + │ t0: DataSourceExec: file_groups={4 groups: [[/testdata/flights-1m.parquet:..], [/testdata/flights-1m.parquet:..], [/testdata/flights-1m.parquet:..], [/testdata/flights-1m.parquet:..]]}, projection=[1 as Int64(1)], file_type=parquet └────────────────────────────────────────────────── "); } @@ -728,7 +728,7 @@ mod tests { .broadcast_joins(true) .physical_plan_as_ascii(query, false) .await; - assert_snapshot!(physical_plan_ascii, @r" + assert_snapshot!(physical_plan_ascii, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ CoalescePartitionsExec │ [Stage 2] => NetworkCoalesceExec: output_partitions=9, input_tasks=3 @@ -738,9 +738,9 @@ mod tests { │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=9, input_tasks=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000000.parquet:.., /testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:.., /testdata/weather/result-000002.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000000.parquet:.., /testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:.., /testdata/weather/result-000002.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p8] t1:[p9..p17] t2:[p18..p26] │ BroadcastExec: input_partitions=3, consumer_tasks=3, output_partitions=9 @@ -764,7 +764,7 @@ mod tests { .broadcast_joins(true) .physical_plan_as_ascii(query, false) .await; - assert_snapshot!(physical_plan_ascii, @r" + assert_snapshot!(physical_plan_ascii, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ CoalescePartitionsExec │ [Stage 3] => NetworkCoalesceExec: output_partitions=9, input_tasks=3 @@ -774,9 +774,9 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=9, input_tasks=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000000.parquet:.., /testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[Rainfall, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[Rainfall, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:.., /testdata/weather/result-000002.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[Rainfall, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000000.parquet:.., /testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[Rainfall, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[Rainfall, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:.., /testdata/weather/result-000002.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[Rainfall, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p8] t1:[p9..p17] t2:[p18..p26] │ BroadcastExec: input_partitions=3, consumer_tasks=3, output_partitions=9 @@ -784,9 +784,9 @@ mod tests { │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=9, input_tasks=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000000.parquet:.., /testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:.., /testdata/weather/result-000002.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000000.parquet:.., /testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:.., /testdata/weather/result-000002.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p8] t1:[p9..p17] t2:[p18..p26] │ BroadcastExec: input_partitions=3, consumer_tasks=3, output_partitions=9 @@ -808,18 +808,18 @@ mod tests { let physical_plan_ascii = TestPlanBuilder::default() .physical_plan_as_ascii(query, false) .await; - assert_snapshot!(physical_plan_ascii, @r" + assert_snapshot!(physical_plan_ascii, @" HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(RainToday@1, RainToday@1)], projection=[MinTemp@0, MaxTemp@2] CoalescePartitionsExec DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MinTemp, RainToday], file_type=parquet - DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] + DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible "); let physical_plan_ascii = TestPlanBuilder::default() .broadcast_joins(true) .physical_plan_as_ascii(query, false) .await; - assert_snapshot!(physical_plan_ascii, @r" + assert_snapshot!(physical_plan_ascii, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ CoalescePartitionsExec │ [Stage 2] => NetworkCoalesceExec: output_partitions=9, input_tasks=3 @@ -829,9 +829,9 @@ mod tests { │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=9, input_tasks=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000000.parquet:.., /testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:.., /testdata/weather/result-000002.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000000.parquet:.., /testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:.., /testdata/weather/result-000002.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p8] t1:[p9..p17] t2:[p18..p26] │ BroadcastExec: input_partitions=3, consumer_tasks=3, output_partitions=9 @@ -862,7 +862,7 @@ mod tests { .broadcast_joins(true) .physical_plan_as_ascii(query, false) .await; - assert_snapshot!(physical_plan_ascii, @r" + assert_snapshot!(physical_plan_ascii, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ CoalescePartitionsExec │ [Stage 4] => NetworkCoalesceExec: output_partitions=9, input_tasks=3 @@ -873,17 +873,17 @@ mod tests { │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000000.parquet:.., /testdata/weather/result-000001.parquet:.., /testdata/weather/result-000002.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000000.parquet:.., /testdata/weather/result-000001.parquet:.., /testdata/weather/result-000002.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(RainToday@1, RainToday@1)], projection=[MinTemp@0, MaxTemp@2] │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000000.parquet:.., /testdata/weather/result-000001.parquet:.., /testdata/weather/result-000002.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000000.parquet:.., /testdata/weather/result-000001.parquet:.., /testdata/weather/result-000002.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(RainToday@1, RainToday@1)], projection=[MinTemp@0, MaxTemp@2] │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000000.parquet:.., /testdata/weather/result-000001.parquet:.., /testdata/weather/result-000002.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000000.parquet:.., /testdata/weather/result-000001.parquet:.., /testdata/weather/result-000002.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 @@ -921,7 +921,7 @@ mod tests { .distributed_task_estimator(BuildSideOneTaskEstimator) .physical_plan_as_ascii(query, false) .await; - assert_snapshot!(physical_plan_ascii, @r" + assert_snapshot!(physical_plan_ascii, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ CoalescePartitionsExec │ [Stage 2] => NetworkCoalesceExec: output_partitions=9, input_tasks=3 @@ -931,9 +931,9 @@ mod tests { │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=9, input_tasks=1 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000000.parquet:.., /testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:.., /testdata/weather/result-000002.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000000.parquet:.., /testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:.., /testdata/weather/result-000002.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p8] │ BroadcastExec: input_partitions=3, consumer_tasks=3, output_partitions=9 diff --git a/src/distributed_planner/inject_network_boundaries.rs b/src/distributed_planner/inject_network_boundaries.rs index 51bc4ab5..15419c9b 100644 --- a/src/distributed_planner/inject_network_boundaries.rs +++ b/src/distributed_planner/inject_network_boundaries.rs @@ -1013,10 +1013,10 @@ mod tests { .await .physical_plan_as_string(query) .await; - assert_snapshot!(physical_plan_string, @r" + assert_snapshot!(physical_plan_string, @" HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(RainToday@1, RainToday@1)], projection=[MinTemp@0, MaxTemp@2] DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MinTemp, RainToday], file_type=parquet - DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] + DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible "); // With target_partitions=1, there is no CoalescePartitionsExec initially diff --git a/src/distributed_planner/insert_broadcast.rs b/src/distributed_planner/insert_broadcast.rs index 33381936..9fe63d27 100644 --- a/src/distributed_planner/insert_broadcast.rs +++ b/src/distributed_planner/insert_broadcast.rs @@ -194,19 +194,19 @@ mod tests { .num_workers(4) .physical_plan_as_string(query) .await; - assert_snapshot!(physical_plan_string, @r" + assert_snapshot!(physical_plan_string, @" HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(RainToday@1, RainToday@1)], projection=[MinTemp@0, MaxTemp@2] CoalescePartitionsExec DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MinTemp, RainToday], file_type=parquet - DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] + DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible "); let plan = sql_to_plan_with_broadcast(query, true, 4).await; - assert_snapshot!(plan, @r" + assert_snapshot!(plan, @" HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(RainToday@1, RainToday@1)], projection=[MinTemp@0, MaxTemp@2] CoalescePartitionsExec BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MinTemp, RainToday], file_type=parquet - DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] + DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible "); } @@ -222,18 +222,18 @@ mod tests { .num_workers(4) .physical_plan_as_string(query) .await; - assert_snapshot!(physical_plan_string, @r" + assert_snapshot!(physical_plan_string, @" HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(RainToday@1, RainToday@1)], projection=[MinTemp@0, MaxTemp@2] DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MinTemp, RainToday], file_type=parquet - DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] + DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible "); let plan = sql_to_plan_with_broadcast(query, true, 1).await; - assert_snapshot!(plan, @r" + assert_snapshot!(plan, @" HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(RainToday@1, RainToday@1)], projection=[MinTemp@0, MaxTemp@2] CoalescePartitionsExec BroadcastExec: input_partitions=1, consumer_tasks=1, output_partitions=1 DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MinTemp, RainToday], file_type=parquet - DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] + DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible "); } @@ -245,11 +245,11 @@ mod tests { ON a."RainToday" = b."RainToday" "#; let plan = sql_to_plan_with_broadcast(query, true, 4).await; - assert_snapshot!(plan, @r" + assert_snapshot!(plan, @" HashJoinExec: mode=CollectLeft, join_type=Left, on=[(RainToday@1, RainToday@1)], projection=[MinTemp@0, MaxTemp@2] CoalescePartitionsExec DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MinTemp, RainToday], file_type=parquet - DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] + DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible "); } @@ -261,11 +261,11 @@ mod tests { ON a."RainToday" = b."RainToday" "#; let plan = sql_to_plan_with_broadcast(query, false, 4).await; - assert_snapshot!(plan, @r" + assert_snapshot!(plan, @" HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(RainToday@1, RainToday@1)], projection=[MinTemp@0, MaxTemp@2] CoalescePartitionsExec DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MinTemp, RainToday], file_type=parquet - DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] + DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible "); } diff --git a/src/distributed_planner/statistics/complexity_cpu.rs b/src/distributed_planner/statistics/complexity_cpu.rs index 49ed6e77..6ac27b9c 100644 --- a/src/distributed_planner/statistics/complexity_cpu.rs +++ b/src/distributed_planner/statistics/complexity_cpu.rs @@ -216,19 +216,24 @@ pub(super) fn complexity_cpu(node: &Arc) -> Complexity { return n.unwrap_or(Complexity::Constant(1.)); } - // RepartitionExec with Hash: computes hash per row + take_arrays + // RepartitionExec copies rows into output partitions and may evaluate repartition keys. // https://github.com/apache/datafusion/blob/branch-52/datafusion/physical-plan/src/repartition/mod.rs if let Some(node) = node.downcast_ref::() { // It needs to copy all the data for chunking it to the different output partitions... let mut n = Complexity::Linear(LinearComplexity::AllColumns); - // And it might need to compute a hash per row based on the provided expressions; hashing a - // plain column key still costs its bytes. + // Hash/range partitioning reads the partition keys. A plain column key still costs its + // bytes because the operator hashes or compares it. match node.partitioning() { Partitioning::Hash(expressions, _) => { for expr in expressions { n = n.plus(hashed_or_sorted_key_complexity(expr)) } } + Partitioning::Range(range) => { + for expr in range.ordering() { + n = n.plus(hashed_or_sorted_key_complexity(&expr.expr)) + } + } Partitioning::RoundRobinBatch(_) => {} Partitioning::UnknownPartitioning(_) => {} }; @@ -429,8 +434,14 @@ mod tests { use crate::assert_snapshot; use crate::distributed_planner::statistics::complexity_cpu::complexity_cpu; use crate::test_utils::plans::TestPlanBuilder; + use arrow::datatypes::{DataType, Field, Schema}; use datafusion::common::tree_node::{Transformed, TreeNode}; - use datafusion::physical_plan::{ExecutionPlan, displayable}; + use datafusion::common::{ScalarValue, SplitPoint}; + use datafusion::physical_expr::{LexOrdering, PhysicalSortExpr, RangePartitioning}; + use datafusion::physical_plan::empty::EmptyExec; + use datafusion::physical_plan::expressions::Column; + use datafusion::physical_plan::repartition::RepartitionExec; + use datafusion::physical_plan::{ExecutionPlan, Partitioning, displayable}; use std::cell::RefCell; use std::sync::Arc; /* schema for the "weather" table @@ -565,7 +576,7 @@ mod tests { assert_snapshot!(plan_costs(plan), @r" O(((2*left_Cols)+left_Col1+right_Cols+right_Col1)) | HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(RainToday@1, RainToday@1)], projection=[MinTemp@0, MaxTemp@2] O(out_Cols) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MinTemp, RainToday], file_type=parquet - O(out_Cols) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] + O(out_Cols) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible "); } @@ -589,7 +600,7 @@ mod tests { assert_snapshot!(plan_costs(plan), @r" O(((2*left_Cols)+left_Col1+right_Cols+right_Col1+(left_Col0+right_Col0))) | HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(RainToday@1, RainToday@1)], filter=MinTemp@0 > MaxTemp@1, projection=[MinTemp@0, MaxTemp@2] O(out_Cols) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MinTemp, RainToday], file_type=parquet - O(out_Cols) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] + O(out_Cols) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible "); } @@ -771,6 +782,34 @@ mod tests { "); } + #[test] + fn range_repartition_exec() { + let schema = Arc::new(Schema::new(vec![Field::new( + "range_key", + DataType::Int64, + false, + )])); + let input = Arc::new(EmptyExec::new(schema).with_partitions(2)); + let ordering = LexOrdering::new([PhysicalSortExpr::new_default(Arc::new(Column::new( + "range_key", + 0, + )))]) + .expect("non-empty ordering"); + let partitioning = Partitioning::Range( + RangePartitioning::try_new( + ordering, + vec![SplitPoint::new(vec![ScalarValue::Int64(Some(10))])], + ) + .expect("valid range partitioning"), + ); + let plan = Arc::new(RepartitionExec::try_new(input, partitioning).unwrap()); + + assert_snapshot!(plan_costs(plan), @r" + O((Cols+Col0)) | RepartitionExec: partitioning=Range([range_key@0 ASC], [(10)], 2), input_partitions=2 + O(1) | EmptyExec + "); + } + // HashJoinExec in Partitioned mode: a distinct planner path from CollectLeft. The cost formula // is the same (build 2x read + key hash, probe read + key hash), now over hash-repartitioned // inputs rather than a collected left side. @@ -795,7 +834,7 @@ mod tests { O((Cols+Col1)) | RepartitionExec: partitioning=Hash([RainToday@1], 4), input_partitions=3 O(out_Cols) | DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MinTemp, RainToday], file_type=parquet O((Cols+Col1)) | RepartitionExec: partitioning=Hash([RainToday@1], 4), input_partitions=3 - O(out_Cols) | DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] + O(out_Cols) | DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet], [/testdata/weather/result-000001.parquet], [/testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible "); } diff --git a/src/distributed_planner/statistics/complexity_memory.rs b/src/distributed_planner/statistics/complexity_memory.rs index f7e2a0c6..e473a849 100644 --- a/src/distributed_planner/statistics/complexity_memory.rs +++ b/src/distributed_planner/statistics/complexity_memory.rs @@ -119,7 +119,7 @@ mod tests { assert_snapshot!(plan_memory(plan), @r" M(left_Cols) | HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(RainToday@1, RainToday@1)], projection=[MinTemp@0, MaxTemp@2] M(0) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MinTemp, RainToday], file_type=parquet - M(0) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ] + M(0) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible "); } @@ -168,7 +168,7 @@ mod tests { .await; assert_snapshot!(plan_memory(topk), @r" M(out_Cols) | SortExec: TopK(fetch=10), expr=[WindGustDir@5 ASC NULLS LAST], preserve_partitioning=[false] - M(0) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MinTemp, MaxTemp, Rainfall, Evaporation, Sunshine, WindGustDir, WindGustSpeed, WindDir9am, WindDir3pm, WindSpeed9am, WindSpeed3pm, Humidity9am, Humidity3pm, Pressure9am, Pressure3pm, Cloud9am, Cloud3pm, Temp9am, Temp3pm, RainToday, RISK_MM, RainTomorrow], file_type=parquet, predicate=DynamicFilter [ empty ], sort_order_for_reorder=[WindGustDir@5 ASC NULLS LAST] + M(0) | DataSourceExec: file_groups={1 group: [[/testdata/weather/result-000000.parquet, /testdata/weather/result-000001.parquet, /testdata/weather/result-000002.parquet]]}, projection=[MinTemp, MaxTemp, Rainfall, Evaporation, Sunshine, WindGustDir, WindGustSpeed, WindDir9am, WindDir3pm, WindSpeed9am, WindSpeed3pm, Humidity9am, Humidity3pm, Pressure9am, Pressure3pm, Cloud9am, Cloud3pm, Temp9am, Temp3pm, RainToday, RISK_MM, RainTomorrow], file_type=parquet, predicate=DynamicFilter [ empty ], sort_order_for_reorder=[WindGustDir@5 ASC NULLS LAST], dynamic_rg_pruning=eligible "); } diff --git a/src/distributed_planner/statistics/plan_statistics.rs b/src/distributed_planner/statistics/plan_statistics.rs index d3d54b8e..9f0e363b 100644 --- a/src/distributed_planner/statistics/plan_statistics.rs +++ b/src/distributed_planner/statistics/plan_statistics.rs @@ -5,6 +5,7 @@ use datafusion::config::ConfigOptions; use datafusion::error::Result; use datafusion::execution::{SendableRecordBatchStream, TaskContext}; use datafusion::physical_plan::execution_plan::CardinalityEffect; +use datafusion::physical_plan::statistics::StatisticsArgs; use datafusion::physical_plan::{DisplayAs, DisplayFormatType, ExecutionPlan, PlanProperties}; use delegate::delegate; use itertools::Itertools; @@ -102,7 +103,7 @@ fn partition_statistics_with_children_override( let stats = Arc::clone(node) .with_new_children(statistics_wrapped_children)? - .partition_statistics(partition)?; + .statistics_with_args(&StatisticsArgs::new().with_partition(partition))?; Ok(stats.as_ref().clone()) } @@ -122,8 +123,8 @@ impl DisplayAs for StatisticsWrapper { } impl ExecutionPlan for StatisticsWrapper { - fn partition_statistics(&self, partition: Option) -> Result> { - if partition.is_some() { + fn statistics_with_args(&self, args: &StatisticsArgs) -> Result> { + if args.partition().is_some() { return plan_err!("StatisticsWrapper not prepared for partition-specific stats"); } Ok(Arc::clone(&self.stats)) diff --git a/src/execution_plans/common.rs b/src/execution_plans/common.rs index 8ea0e4af..8af615d9 100644 --- a/src/execution_plans/common.rs +++ b/src/execution_plans/common.rs @@ -22,5 +22,6 @@ pub(super) fn scale_partitioning( Partitioning::RoundRobinBatch(p) => Partitioning::RoundRobinBatch(f(*p)), Partitioning::Hash(hash, p) => Partitioning::Hash(hash.clone(), f(*p)), Partitioning::UnknownPartitioning(p) => Partitioning::UnknownPartitioning(f(*p)), + Partitioning::Range(range) => Partitioning::Range(range.clone()), } } diff --git a/src/execution_plans/distributed_leaf.rs b/src/execution_plans/distributed_leaf.rs index b9ab4d35..2d8eb6f1 100644 --- a/src/execution_plans/distributed_leaf.rs +++ b/src/execution_plans/distributed_leaf.rs @@ -2,6 +2,7 @@ use crate::DistributedTaskContext; use datafusion::common::{Result, Statistics, exec_err, not_impl_err, plan_err}; use datafusion::execution::{SendableRecordBatchStream, TaskContext}; use datafusion::physical_expr_common::metrics::MetricsSet; +use datafusion::physical_plan::statistics::StatisticsArgs; use datafusion::physical_plan::{DisplayAs, DisplayFormatType, ExecutionPlan, PlanProperties}; use std::fmt::Formatter; use std::sync::Arc; @@ -185,6 +186,10 @@ impl ExecutionPlan for DistributedLeafExec { } fn partition_statistics(&self, partition: Option) -> Result> { - self.original.partition_statistics(partition) + self.statistics_with_args(&StatisticsArgs::new().with_partition(partition)) + } + + fn statistics_with_args(&self, args: &StatisticsArgs) -> Result> { + self.original.statistics_with_args(args) } } diff --git a/src/metrics/proto.rs b/src/metrics/proto.rs index c114a41c..1dcfd5d2 100644 --- a/src/metrics/proto.rs +++ b/src/metrics/proto.rs @@ -123,6 +123,14 @@ pub fn df_metric_to_proto(metric: Arc) -> Result Ok(pb::Metric { + value: Some(pb::metric::Value::Gauge(pb::NamedGauge { + name: name.to_string(), + value: gauge.value() as u64 + })), + partition, + labels, + }), MetricValue::Time { name, time } => Ok(pb::Metric { value: Some(pb::metric::Value::Time(pb::NamedTime { name: name.to_string(), diff --git a/src/protobuf/distributed_codec.rs b/src/protobuf/distributed_codec.rs index 1ea27541..df41889c 100644 --- a/src/protobuf/distributed_codec.rs +++ b/src/protobuf/distributed_codec.rs @@ -22,8 +22,8 @@ use datafusion::prelude::SessionConfig; use datafusion_proto::physical_plan::from_proto::parse_protobuf_partitioning; use datafusion_proto::physical_plan::to_proto::serialize_partitioning; use datafusion_proto::physical_plan::{ - ComposedPhysicalExtensionCodec, DefaultPhysicalProtoConverter, PhysicalExtensionCodec, - PhysicalPlanDecodeContext, + ComposedPhysicalExtensionCodec, PhysicalExtensionCodec, PhysicalPlanDecodeContext, + PhysicalProtoConverterExtension, }; use datafusion_proto::protobuf; use datafusion_proto::protobuf::proto_error; @@ -51,6 +51,7 @@ impl PhysicalExtensionCodec for DistributedCodec { buf: &[u8], inputs: &[Arc], ctx: &TaskContext, + proto_converter: &dyn PhysicalProtoConverterExtension, ) -> datafusion::common::Result> { let DistributedExecProto { node: Some(distributed_exec_node), @@ -107,12 +108,12 @@ impl PhysicalExtensionCodec for DistributedCodec { .map(|s| s.try_into()) .ok_or(proto_error("NetworkShuffleExec is missing schema"))??; - let decode_ctx = PhysicalPlanDecodeContext::new(ctx, &DistributedCodec {}); + let decode_ctx = PhysicalPlanDecodeContext::new(ctx, self); let partitioning = parse_protobuf_partitioning( partitioning.as_ref(), &decode_ctx, &schema, - &DefaultPhysicalProtoConverter {}, + proto_converter, )? .ok_or(proto_error("NetworkShuffleExec is missing partitioning"))?; @@ -132,12 +133,12 @@ impl PhysicalExtensionCodec for DistributedCodec { .map(|s| s.try_into()) .ok_or(proto_error("NetworkCoalesceExec is missing schema"))??; - let decode_ctx = PhysicalPlanDecodeContext::new(ctx, &DistributedCodec {}); + let decode_ctx = PhysicalPlanDecodeContext::new(ctx, self); let partitioning = parse_protobuf_partitioning( partitioning.as_ref(), &decode_ctx, &schema, - &DefaultPhysicalProtoConverter {}, + proto_converter, )? .ok_or(proto_error("NetworkCoalesceExec is missing partitioning"))?; @@ -157,12 +158,12 @@ impl PhysicalExtensionCodec for DistributedCodec { .map(|s| s.try_into()) .ok_or(proto_error("NetworkBroadcastExec is missing schema"))??; - let decode_ctx = PhysicalPlanDecodeContext::new(ctx, &DistributedCodec {}); + let decode_ctx = PhysicalPlanDecodeContext::new(ctx, self); let partitioning = parse_protobuf_partitioning( partitioning.as_ref(), &decode_ctx, &schema, - &DefaultPhysicalProtoConverter {}, + proto_converter, )? .ok_or(proto_error("NetworkBroadcastExec is missing partitioning"))?; @@ -241,7 +242,12 @@ impl PhysicalExtensionCodec for DistributedCodec { } } - fn try_encode(&self, node: Arc, buf: &mut Vec) -> Result<()> { + fn try_encode( + &self, + node: Arc, + buf: &mut Vec, + proto_converter: &dyn PhysicalProtoConverterExtension, + ) -> Result<()> { fn encode_stage_proto(stage: &Stage) -> Result { Ok(match stage { Stage::Local(local) => StageProto { @@ -271,7 +277,7 @@ impl PhysicalExtensionCodec for DistributedCodec { partitioning: Some(serialize_partitioning( node.properties().output_partitioning(), &DistributedCodec {}, - &DefaultPhysicalProtoConverter {}, + proto_converter, )?), input_stage: Some(encode_stage_proto(node.input_stage())?), }; @@ -287,7 +293,7 @@ impl PhysicalExtensionCodec for DistributedCodec { partitioning: Some(serialize_partitioning( node.properties().output_partitioning(), &DistributedCodec {}, - &DefaultPhysicalProtoConverter {}, + proto_converter, )?), input_stage: Some(encode_stage_proto(node.input_stage())?), }; @@ -303,7 +309,7 @@ impl PhysicalExtensionCodec for DistributedCodec { partitioning: Some(serialize_partitioning( node.properties().output_partitioning(), &DistributedCodec {}, - &DefaultPhysicalProtoConverter {}, + proto_converter, )?), input_stage: Some(encode_stage_proto(node.input_stage())?), }; @@ -555,6 +561,11 @@ mod tests { physical_expr::{Partitioning, PhysicalSortExpr, expressions::Column, expressions::col}, physical_plan::{ExecutionPlan, displayable, sorts::sort::SortExec, union::UnionExec}, }; + use datafusion_proto::physical_plan::DefaultPhysicalProtoConverter; + + fn default_proto_converter() -> DefaultPhysicalProtoConverter { + DefaultPhysicalProtoConverter {} + } fn empty_exec() -> Arc { Arc::new(EmptyExec::new(SchemaRef::new(Schema::empty()))) @@ -602,9 +613,9 @@ mod tests { Arc::new(new_network_hash_shuffle_exec(part, schema, dummy_stage())); let mut buf = Vec::new(); - codec.try_encode(plan.clone(), &mut buf)?; + codec.try_encode(plan.clone(), &mut buf, &default_proto_converter())?; - let decoded = codec.try_decode(&buf, &[], &ctx)?; + let decoded = codec.try_decode(&buf, &[], &ctx, &default_proto_converter())?; assert_eq!(repr(&plan), repr(&decoded)); Ok(()) @@ -632,9 +643,9 @@ mod tests { Arc::new(NetworkCoalesceExec::try_new(union.clone(), 1, 1)?); let mut buf = Vec::new(); - codec.try_encode(plan.clone(), &mut buf)?; + codec.try_encode(plan.clone(), &mut buf, &default_proto_converter())?; - let decoded = codec.try_decode(&buf, &[union], &ctx)?; + let decoded = codec.try_decode(&buf, &[union], &ctx, &default_proto_converter())?; assert_eq!(repr(&plan), repr(&decoded)); Ok(()) @@ -665,9 +676,9 @@ mod tests { Arc::new(NetworkCoalesceExec::try_new(sort.clone(), 1, 1)?); let mut buf = Vec::new(); - codec.try_encode(plan.clone(), &mut buf)?; + codec.try_encode(plan.clone(), &mut buf, &default_proto_converter())?; - let decoded = codec.try_decode(&buf, &[sort], &ctx)?; + let decoded = codec.try_decode(&buf, &[sort], &ctx, &default_proto_converter())?; assert_eq!(repr(&plan), repr(&decoded)); Ok(()) @@ -686,9 +697,9 @@ mod tests { )); let mut buf = Vec::new(); - codec.try_encode(plan.clone(), &mut buf)?; + codec.try_encode(plan.clone(), &mut buf, &default_proto_converter())?; - let decoded = codec.try_decode(&buf, &[], &ctx)?; + let decoded = codec.try_decode(&buf, &[], &ctx, &default_proto_converter())?; assert_eq!(repr(&plan), repr(&decoded)); Ok(()) @@ -708,9 +719,9 @@ mod tests { )); let mut buf = Vec::new(); - codec.try_encode(plan.clone(), &mut buf)?; + codec.try_encode(plan.clone(), &mut buf, &default_proto_converter())?; - let decoded = codec.try_decode(&buf, &[empty_exec()], &ctx)?; + let decoded = codec.try_decode(&buf, &[empty_exec()], &ctx, &default_proto_converter())?; assert_eq!(repr(&plan), repr(&decoded)); Ok(()) @@ -729,9 +740,9 @@ mod tests { )); let mut buf = Vec::new(); - codec.try_encode(plan.clone(), &mut buf)?; + codec.try_encode(plan.clone(), &mut buf, &default_proto_converter())?; - let decoded = codec.try_decode(&buf, &[empty_exec()], &ctx)?; + let decoded = codec.try_decode(&buf, &[empty_exec()], &ctx, &default_proto_converter())?; assert_eq!(repr(&plan), repr(&decoded)); Ok(()) @@ -753,9 +764,9 @@ mod tests { Arc::new(NetworkCoalesceExec::try_new(flight.clone(), 1, 1)?); let mut buf = Vec::new(); - codec.try_encode(plan.clone(), &mut buf)?; + codec.try_encode(plan.clone(), &mut buf, &default_proto_converter())?; - let decoded = codec.try_decode(&buf, &[flight], &ctx)?; + let decoded = codec.try_decode(&buf, &[flight], &ctx, &default_proto_converter())?; assert_eq!(repr(&plan), repr(&decoded)); Ok(()) @@ -783,9 +794,9 @@ mod tests { Arc::new(NetworkCoalesceExec::try_new(union.clone(), 1, 1)?); let mut buf = Vec::new(); - codec.try_encode(plan.clone(), &mut buf)?; + codec.try_encode(plan.clone(), &mut buf, &default_proto_converter())?; - let decoded = codec.try_decode(&buf, &[union], &ctx)?; + let decoded = codec.try_decode(&buf, &[union], &ctx, &default_proto_converter())?; assert_eq!(repr(&plan), repr(&decoded)); Ok(()) @@ -816,9 +827,9 @@ mod tests { )?); let mut buf = Vec::new(); - codec.try_encode(plan.clone(), &mut buf)?; + codec.try_encode(plan.clone(), &mut buf, &default_proto_converter())?; - let decoded = codec.try_decode(&buf, &[left, right], &ctx)?; + let decoded = codec.try_decode(&buf, &[left, right], &ctx, &default_proto_converter())?; assert_eq!(repr(&plan), repr(&decoded)); Ok(()) diff --git a/src/test_utils/routing.rs b/src/test_utils/routing.rs index 26dc6c10..af8339c7 100644 --- a/src/test_utils/routing.rs +++ b/src/test_utils/routing.rs @@ -15,7 +15,10 @@ use datafusion::{ }, prelude::Expr, }; -use datafusion_proto::{physical_plan::PhysicalExtensionCodec, protobuf::proto_error}; +use datafusion_proto::{ + physical_plan::{PhysicalExtensionCodec, PhysicalProtoConverterExtension}, + protobuf::proto_error, +}; use futures::stream; use prost::Message; use std::{fmt::Formatter, sync::Arc}; @@ -324,6 +327,7 @@ impl PhysicalExtensionCodec for URLEmitterExtensionCodec { buf: &[u8], inputs: &[Arc], _ctx: &TaskContext, + _proto_converter: &dyn PhysicalProtoConverterExtension, ) -> Result> { if !inputs.is_empty() { return internal_err!( @@ -352,7 +356,12 @@ impl PhysicalExtensionCodec for URLEmitterExtensionCodec { )) } - fn try_encode(&self, node: Arc, buf: &mut Vec) -> Result<()> { + fn try_encode( + &self, + node: Arc, + buf: &mut Vec, + _proto_converter: &dyn PhysicalProtoConverterExtension, + ) -> Result<()> { let Some(exec) = node.downcast_ref::() else { return internal_err!("Expected URLEmitterExec, but was {}", node.name()); }; diff --git a/src/test_utils/test_work_unit_feed.rs b/src/test_utils/test_work_unit_feed.rs index ce82e5c3..88d48cdb 100644 --- a/src/test_utils/test_work_unit_feed.rs +++ b/src/test_utils/test_work_unit_feed.rs @@ -21,7 +21,7 @@ use datafusion::physical_plan::execution_plan::{Boundedness, EmissionType}; use datafusion::physical_plan::metrics::{Count, ExecutionPlanMetricsSet, MetricBuilder}; use datafusion::physical_plan::stream::RecordBatchStreamAdapter; use datafusion::physical_plan::{DisplayAs, DisplayFormatType, ExecutionPlan, PlanProperties}; -use datafusion_proto::physical_plan::PhysicalExtensionCodec; +use datafusion_proto::physical_plan::{PhysicalExtensionCodec, PhysicalProtoConverterExtension}; use datafusion_proto::protobuf::proto_error; use futures::StreamExt; use futures::stream::BoxStream; @@ -502,6 +502,7 @@ impl PhysicalExtensionCodec for TestWorkUnitFeedExecCodec { buf: &[u8], inputs: &[Arc], _ctx: &TaskContext, + _proto_converter: &dyn PhysicalProtoConverterExtension, ) -> Result> { if !inputs.is_empty() { return internal_err!( @@ -530,7 +531,12 @@ impl PhysicalExtensionCodec for TestWorkUnitFeedExecCodec { ))) } - fn try_encode(&self, node: Arc, buf: &mut Vec) -> Result<()> { + fn try_encode( + &self, + node: Arc, + buf: &mut Vec, + _proto_converter: &dyn PhysicalProtoConverterExtension, + ) -> Result<()> { let Some(exec) = node.downcast_ref::() else { return internal_err!("Expected RowGeneratorExec, but was {}", node.name()); }; diff --git a/src/test_utils/work_unit_file_scan.rs b/src/test_utils/work_unit_file_scan.rs index df3d8de3..1336bbce 100644 --- a/src/test_utils/work_unit_file_scan.rs +++ b/src/test_utils/work_unit_file_scan.rs @@ -21,8 +21,10 @@ use datafusion::physical_plan::execution_plan::SchedulingType; use datafusion::physical_plan::metrics::ExecutionPlanMetricsSet; use datafusion::physical_plan::stream::RecordBatchStreamAdapter; use datafusion::physical_plan::{DisplayFormatType, ExecutionPlan, Partitioning}; +use datafusion_proto::TryFromProto; use datafusion_proto::physical_plan::{ - AsExecutionPlan, DefaultPhysicalExtensionCodec, PhysicalExtensionCodec, + DefaultPhysicalExtensionCodec, PhysicalExtensionCodec, PhysicalPlanNodeExt, + PhysicalProtoConverterExtension, }; use datafusion_proto::protobuf as df_proto; use datafusion_proto::protobuf::proto_error; @@ -73,8 +75,7 @@ impl WorkUnitFeedProvider for FileScanWorkUnitProvider { return Ok(futures::stream::empty().boxed()); }; let stream = futures::stream::iter(file_group.files().to_vec()).map(|file| { - let file_proto: df_proto::PartitionedFile = (&file) - .try_into() + let file_proto = df_proto::PartitionedFile::try_from_proto(&file) .map_err(|e| internal_datafusion_err!("{e}"))?; Ok(FileScanWorkUnit { file: Some(file_proto), @@ -129,7 +130,7 @@ impl DataSource for WorkUnitFileScanConfig { let file = work_unit?.file.expect("missing file"); let single_file_group = df_proto::FileGroup { files: vec![file] }; - let single_file_group = FileGroup::try_from(&single_file_group)?; + let single_file_group = FileGroup::try_from_proto(&single_file_group)?; let new_config = FileScanConfigBuilder::from(inner.clone()) .with_file_groups(vec![single_file_group]) @@ -237,6 +238,7 @@ impl PhysicalExtensionCodec for WorkUnitFileScanCodec { buf: &[u8], inputs: &[Arc], ctx: &TaskContext, + proto_converter: &dyn PhysicalProtoConverterExtension, ) -> Result> { if !inputs.is_empty() { return internal_err!( @@ -249,8 +251,11 @@ impl PhysicalExtensionCodec for WorkUnitFileScanCodec { let plan_node = df_proto::PhysicalPlanNode::decode(&proto.inner[..]) .map_err(|e| proto_error(format!("Failed to decode template plan: {e}")))?; - let template_plan = - plan_node.try_into_physical_plan(ctx, &DefaultPhysicalExtensionCodec {})?; + let template_plan = plan_node.try_into_physical_plan_with_converter( + ctx, + &DefaultPhysicalExtensionCodec {}, + proto_converter, + )?; let Some(dse) = template_plan.downcast_ref::() else { return Err(proto_error( "Expected the WorkUnitFileScan template plan to be a DataSourceExec", @@ -271,7 +276,12 @@ impl PhysicalExtensionCodec for WorkUnitFileScanCodec { })) } - fn try_encode(&self, node: Arc, buf: &mut Vec) -> Result<()> { + fn try_encode( + &self, + node: Arc, + buf: &mut Vec, + proto_converter: &dyn PhysicalProtoConverterExtension, + ) -> Result<()> { let Some(dse) = node.downcast_ref::() else { return internal_err!( "Expected DataSourceExec wrapping a WorkUnitFileScanConfig, got {}", @@ -284,9 +294,10 @@ impl PhysicalExtensionCodec for WorkUnitFileScanCodec { // Encode the template DataSourceExec(FileScanConfig) as a regular // PhysicalPlanNode using DataFusion's default codec. - let plan_node = df_proto::PhysicalPlanNode::try_from_physical_plan( + let plan_node = df_proto::PhysicalPlanNode::try_from_physical_plan_with_converter( DataSourceExec::from_data_source(wfs.fsc.clone()), &DefaultPhysicalExtensionCodec {}, + proto_converter, )?; let mut inner_bytes = Vec::new(); plan_node.encode(&mut inner_bytes).map_err(|e| { diff --git a/src/worker/session_builder.rs b/src/worker/session_builder.rs index c0f0bf41..7c62c520 100644 --- a/src/worker/session_builder.rs +++ b/src/worker/session_builder.rs @@ -25,18 +25,18 @@ pub trait WorkerSessionBuilder { /// # use datafusion::error::DataFusionError; /// # use datafusion::execution::{FunctionRegistry, SessionState, SessionStateBuilder, TaskContext}; /// # use datafusion::physical_plan::ExecutionPlan; - /// # use datafusion_proto::physical_plan::PhysicalExtensionCodec; + /// # use datafusion_proto::physical_plan::{PhysicalExtensionCodec, PhysicalProtoConverterExtension}; /// # use datafusion_distributed::{DistributedExt, WorkerSessionBuilder, WorkerQueryContext}; /// /// #[derive(Debug)] /// struct CustomExecCodec; /// /// impl PhysicalExtensionCodec for CustomExecCodec { - /// fn try_decode(&self, buf: &[u8], inputs: &[Arc], ctx: &TaskContext) -> datafusion::common::Result> { + /// fn try_decode(&self, buf: &[u8], inputs: &[Arc], ctx: &TaskContext, proto_converter: &dyn PhysicalProtoConverterExtension) -> datafusion::common::Result> { /// todo!() /// } /// - /// fn try_encode(&self, node: Arc, buf: &mut Vec) -> datafusion::common::Result<()> { + /// fn try_encode(&self, node: Arc, buf: &mut Vec, proto_converter: &dyn PhysicalProtoConverterExtension) -> datafusion::common::Result<()> { /// todo!() /// } /// } diff --git a/tests/custom_config_extension.rs b/tests/custom_config_extension.rs index 0f4502fa..50ccb0fe 100644 --- a/tests/custom_config_extension.rs +++ b/tests/custom_config_extension.rs @@ -14,7 +14,9 @@ mod tests { use datafusion_distributed::test_utils::localhost::start_localhost_context; use datafusion_distributed::test_utils::parquet::register_parquet_tables; use datafusion_distributed::{DistributedExt, WorkerQueryContext}; - use datafusion_proto::physical_plan::PhysicalExtensionCodec; + use datafusion_proto::physical_plan::{ + PhysicalExtensionCodec, PhysicalProtoConverterExtension, + }; use futures::TryStreamExt; use prost::Message; use std::fmt::Formatter; @@ -201,6 +203,7 @@ mod tests { buf: &[u8], inputs: &[Arc], _ctx: &TaskContext, + _proto_converter: &dyn PhysicalProtoConverterExtension, ) -> datafusion::common::Result> { let _node = CustomConfigExtensionRequiredExecProto::decode(buf) .map_err(|err| internal_datafusion_err!("{err}"))?; @@ -221,6 +224,7 @@ mod tests { &self, _node: Arc, buf: &mut Vec, + _proto_converter: &dyn PhysicalProtoConverterExtension, ) -> datafusion::common::Result<()> { CustomConfigExtensionRequiredExecProto::default() .encode(buf) diff --git a/tests/custom_extension_codec.rs b/tests/custom_extension_codec.rs index a3eb3d9f..7c23c8d8 100644 --- a/tests/custom_extension_codec.rs +++ b/tests/custom_extension_codec.rs @@ -13,7 +13,9 @@ mod tests { use datafusion_distributed::test_utils::localhost::start_localhost_context; use datafusion_distributed::test_utils::parquet::register_parquet_tables; use datafusion_distributed::{DistributedExt, WorkerQueryContext, assert_snapshot}; - use datafusion_proto::physical_plan::PhysicalExtensionCodec; + use datafusion_proto::physical_plan::{ + PhysicalExtensionCodec, PhysicalProtoConverterExtension, + }; use datafusion_proto::protobuf::proto_error; use futures::TryStreamExt; use prost::Message; @@ -139,6 +141,7 @@ mod tests { buf: &[u8], inputs: &[Arc], _ctx: &TaskContext, + _proto_converter: &dyn PhysicalProtoConverterExtension, ) -> datafusion::common::Result> { let _node = CustomPassThroughExecProto::decode(buf) .map_err(|err| proto_error(format!("{err}")))?; @@ -157,6 +160,7 @@ mod tests { &self, node: Arc, buf: &mut Vec, + _proto_converter: &dyn PhysicalProtoConverterExtension, ) -> datafusion::common::Result<()> { let Some(_plan) = node.downcast_ref::() else { return Err(proto_error(format!( diff --git a/tests/distributed_unions.rs b/tests/distributed_unions.rs index 2843dec7..915477f5 100644 --- a/tests/distributed_unions.rs +++ b/tests/distributed_unions.rs @@ -226,7 +226,7 @@ mod tests { let physical_distributed_str = display_plan_ascii(physical_distributed.as_ref(), false); assert_snapshot!(physical_distributed_str, - @r" + @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [MinTemp@0 ASC NULLS LAST, RainToday@1 ASC NULLS LAST] │ [Stage 7] => NetworkCoalesceExec: output_partitions=2, input_tasks=2 @@ -252,16 +252,16 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] │ FilterExec: MinTemp@0 > 10, fetch=1000000 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000000.parquet:.., /testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MinTemp, RainToday], file_type=parquet, predicate=MinTemp@0 > 10 AND DynamicFilter [ empty ], pruning_predicate=MinTemp_null_count@1 != row_count@2 AND MinTemp_max@0 > 10, required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MinTemp, RainToday], file_type=parquet, predicate=MinTemp@0 > 10 AND DynamicFilter [ empty ], pruning_predicate=MinTemp_null_count@1 != row_count@2 AND MinTemp_max@0 > 10, required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:.., /testdata/weather/result-000002.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MinTemp, RainToday], file_type=parquet, predicate=MinTemp@0 > 10 AND DynamicFilter [ empty ], pruning_predicate=MinTemp_null_count@1 != row_count@2 AND MinTemp_max@0 > 10, required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000000.parquet:.., /testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MinTemp, RainToday], file_type=parquet, predicate=MinTemp@0 > 10 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=MinTemp_null_count@1 != row_count@2 AND MinTemp_max@0 > 10, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MinTemp, RainToday], file_type=parquet, predicate=MinTemp@0 > 10 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=MinTemp_null_count@1 != row_count@2 AND MinTemp_max@0 > 10, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:.., /testdata/weather/result-000002.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MinTemp, RainToday], file_type=parquet, predicate=MinTemp@0 > 10 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=MinTemp_null_count@1 != row_count@2 AND MinTemp_max@0 > 10, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] │ FilterExec: MaxTemp@0 < 30, fetch=1000000 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000000.parquet:.., /testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=MaxTemp@1 < 30 AND DynamicFilter [ empty ], pruning_predicate=MaxTemp_null_count@1 != row_count@2 AND MaxTemp_min@0 < 30, required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=MaxTemp@1 < 30 AND DynamicFilter [ empty ], pruning_predicate=MaxTemp_null_count@1 != row_count@2 AND MaxTemp_min@0 < 30, required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:.., /testdata/weather/result-000002.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=MaxTemp@1 < 30 AND DynamicFilter [ empty ], pruning_predicate=MaxTemp_null_count@1 != row_count@2 AND MaxTemp_min@0 < 30, required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000000.parquet:.., /testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=MaxTemp@1 < 30 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=MaxTemp_null_count@1 != row_count@2 AND MaxTemp_min@0 < 30, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=MaxTemp@1 < 30 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=MaxTemp_null_count@1 != row_count@2 AND MaxTemp_min@0 < 30, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/weather/result-000000.parquet:..], [/testdata/weather/result-000001.parquet:.., /testdata/weather/result-000002.parquet:..], [/testdata/weather/result-000002.parquet:..]]}, projection=[MaxTemp, RainToday], file_type=parquet, predicate=MaxTemp@1 < 30 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=MaxTemp_null_count@1 != row_count@2 AND MaxTemp_min@0 < 30, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0] t1:[p1] │ LocalLimitExec: fetch=1000000 diff --git a/tests/error_propagation.rs b/tests/error_propagation.rs index 44908e71..05289594 100644 --- a/tests/error_propagation.rs +++ b/tests/error_propagation.rs @@ -13,7 +13,9 @@ mod tests { use datafusion_distributed::test_utils::localhost::start_localhost_context; use datafusion_distributed::test_utils::parquet::register_parquet_tables; use datafusion_distributed::{DistributedExt, WorkerQueryContext}; - use datafusion_proto::physical_plan::PhysicalExtensionCodec; + use datafusion_proto::physical_plan::{ + PhysicalExtensionCodec, PhysicalProtoConverterExtension, + }; use datafusion_proto::protobuf::proto_error; use futures::{TryStreamExt, stream}; use prost::Message; @@ -146,6 +148,7 @@ mod tests { buf: &[u8], inputs: &[Arc], _ctx: &TaskContext, + _proto_converter: &dyn PhysicalProtoConverterExtension, ) -> datafusion::common::Result> { let node = ErrorThrowingExecProto::decode(buf).map_err(|err| proto_error(format!("{err}")))?; @@ -167,6 +170,7 @@ mod tests { &self, node: Arc, buf: &mut Vec, + _proto_converter: &dyn PhysicalProtoConverterExtension, ) -> datafusion::common::Result<()> { let Some(plan) = node.downcast_ref::() else { return Err(proto_error(format!( diff --git a/tests/stateful_execution_plan.rs b/tests/stateful_execution_plan.rs index 4a97cee3..ae8088bf 100644 --- a/tests/stateful_execution_plan.rs +++ b/tests/stateful_execution_plan.rs @@ -16,7 +16,9 @@ mod tests { use datafusion_distributed::{ DistributedExt, WorkerQueryContext, assert_snapshot, display_plan_ascii, }; - use datafusion_proto::physical_plan::PhysicalExtensionCodec; + use datafusion_proto::physical_plan::{ + PhysicalExtensionCodec, PhysicalProtoConverterExtension, + }; use datafusion_proto::protobuf::proto_error; use futures::TryStreamExt; use prost::Message; @@ -185,6 +187,7 @@ mod tests { buf: &[u8], inputs: &[Arc], _ctx: &TaskContext, + _proto_converter: &dyn PhysicalProtoConverterExtension, ) -> datafusion::common::Result> { let _node = PassThroughExecProto::decode(buf).map_err(|err| proto_error(format!("{err}")))?; @@ -203,6 +206,7 @@ mod tests { &self, node: Arc, buf: &mut Vec, + _proto_converter: &dyn PhysicalProtoConverterExtension, ) -> datafusion::common::Result<()> { let Some(_plan) = node.downcast_ref::() else { return Err(proto_error(format!( From 46926aa18f125822ca976c0610bf366b2a341016 Mon Sep 17 00:00:00 2001 From: Jayant Shrivastava Date: Wed, 1 Jul 2026 20:02:20 +0000 Subject: [PATCH 07/12] fix for broadcast joins --- .../inject_network_boundaries.rs | 70 +++++++++++++++++-- 1 file changed, 64 insertions(+), 6 deletions(-) diff --git a/src/distributed_planner/inject_network_boundaries.rs b/src/distributed_planner/inject_network_boundaries.rs index 15419c9b..22e4f6df 100644 --- a/src/distributed_planner/inject_network_boundaries.rs +++ b/src/distributed_planner/inject_network_boundaries.rs @@ -218,6 +218,35 @@ fn plan_ptr_key(plan: &Arc) -> usize { Arc::as_ptr(plan) as *const () as usize } +fn collect_left_hash_join_requires_single_task( + plan: &dyn ExecutionPlan, + processed_children: &[Arc], + broadcast_joins_enabled: bool, +) -> bool { + let Some(hash_join) = plan.downcast_ref::() else { + return false; + }; + if hash_join.partition_mode() != &PartitionMode::CollectLeft { + return false; + } + if !broadcast_joins_enabled { + return true; + } + + !processed_children + .first() + .is_some_and(|child| build_input_is_broadcast(child.as_ref())) +} + +fn build_input_is_broadcast(plan: &dyn ExecutionPlan) -> bool { + if plan.is::() || plan.is::() { + return true; + } + + plan.downcast_ref::() + .is_some_and(|coalesce| build_input_is_broadcast(coalesce.input().as_ref())) +} + /// WARNING: every return statement in this function must funnel through /// [InjectNetworkBoundaryContext::plan_with_task_count] /// (or [InjectNetworkBoundaryContext::set_task_count] on the way through) so the returned node has @@ -266,12 +295,14 @@ async fn _inject_network_boundaries( count += nb_ctx.task_count(processed_child)?.as_usize(); } task_count = Desired(count); - } else if let Some(node) = plan.downcast_ref::() - && node.mode == PartitionMode::CollectLeft - && !broadcast_joins_enabled - { - // Only distribute CollectLeft HashJoins after we broadcast more intelligently or when it - // is explicitly enabled. + } else if collect_left_hash_join_requires_single_task( + plan.as_ref(), + &processed_children, + broadcast_joins_enabled, + ) { + // Only distribute CollectLeft HashJoins when the build side was actually broadcast. + // Enabling broadcast joins is not enough by itself: join types that cannot safely + // broadcast their build side, such as LeftSemi, must keep running in one task. task_count = Maximum(1); } else { // The task count for this plan is decided by the biggest task count from the children; unless @@ -1113,6 +1144,33 @@ mod tests { ") } + #[tokio::test] + async fn test_collect_left_join_without_broadcast_stays_single_task() { + let query = r#" + SELECT a."MinTemp" + FROM weather a + WHERE EXISTS ( + SELECT 1 + FROM weather b + WHERE a."RainToday" = b."RainToday" + ) + "#; + let test_plan_builder = TestPlanBuilder::new() + .target_partitions(4) + .num_workers(4) + // annotate_test_plan expects a single-node input plan. + .distributed_planner(false) + .broadcast_joins(true); + let annotated = annotate_test_plan(test_plan_builder, query).await; + assert!(!annotated.contains("Broadcast")); + assert_snapshot!(annotated, @r" + HashJoinExec: task_count=Maximum(1) + CoalescePartitionsExec: task_count=Maximum(1) + DistributedLeafExec: task_count=Maximum(1) + DistributedLeafExec: task_count=Maximum(1) + ") + } + #[tokio::test] async fn test_broadcast_multi_join_chain() { let query = r#" From 5bab2956bda5f2a17102caa358e4e1c161b438de Mon Sep 17 00:00:00 2001 From: Jayant Shrivastava Date: Thu, 2 Jul 2026 14:46:02 +0000 Subject: [PATCH 08/12] Update plan snapshots for DataFusion changes --- tests/clickbench_plans_test.rs | 9 +- tests/tpcds_plans_test.rs | 8033 +++++++++++++++----------------- 2 files changed, 3842 insertions(+), 4200 deletions(-) diff --git a/tests/clickbench_plans_test.rs b/tests/clickbench_plans_test.rs index 2c202201..88051240 100644 --- a/tests/clickbench_plans_test.rs +++ b/tests/clickbench_plans_test.rs @@ -1131,7 +1131,14 @@ mod tests { if !plan.is::() { Ok("".to_string()) } else { - Ok(display_plan_ascii(plan.as_ref(), false)) + Ok(normalize_plan_display(display_plan_ascii( + plan.as_ref(), + false, + ))) } } + + fn normalize_plan_display(display: String) -> String { + display.replace(", dynamic_rg_pruning=eligible", "") + } } diff --git a/tests/tpcds_plans_test.rs b/tests/tpcds_plans_test.rs index 667ed4d1..688211a5 100644 --- a/tests/tpcds_plans_test.rs +++ b/tests/tpcds_plans_test.rs @@ -21,102 +21,95 @@ mod tests { #[tokio::test] async fn test_tpcds_1() -> Result<()> { let display = test_tpcds_query("q1").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [c_customer_id@0 ASC NULLS LAST], fetch=100 - │ [Stage 9] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 + │ SortExec: TopK(fetch=100), expr=[c_customer_id@0 ASC NULLS LAST], preserve_partitioning=[true] + │ HashJoinExec: mode=CollectLeft, join_type=LeftSemi, on=[(ctr_store_sk@0, ctr_store_sk@1)], filter=CAST(ctr_total_return@0 AS Decimal128(30, 15)) > avg(ctr2.ctr_total_return) * Float64(1.2)@1, projection=[c_customer_id@2] + │ CoalescePartitionsExec + │ [Stage 5] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 + │ ProjectionExec: expr=[CAST(CAST(avg(ctr2.ctr_total_return)@1 AS Float64) * 1.2 AS Decimal128(30, 15)) as avg(ctr2.ctr_total_return) * Float64(1.2), ctr_store_sk@0 as ctr_store_sk] + │ AggregateExec: mode=FinalPartitioned, gby=[ctr_store_sk@0 as ctr_store_sk], aggr=[avg(ctr2.ctr_total_return)] + │ [Stage 8] => NetworkShuffleExec: output_partitions=3, input_tasks=2 └────────────────────────────────────────────────── - ┌───── Stage 9 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] - │ SortExec: TopK(fetch=100), expr=[c_customer_id@0 ASC NULLS LAST], preserve_partitioning=[true] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ctr_store_sk@0, ctr_store_sk@1)], filter=CAST(ctr_total_return@0 AS Decimal128(30, 15)) > avg(ctr2.ctr_total_return) * Float64(1.2)@1, projection=[c_customer_id@2] - │ CoalescePartitionsExec - │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ ProjectionExec: expr=[CAST(CAST(avg(ctr2.ctr_total_return)@1 AS Float64) * 1.2 AS Decimal128(30, 15)) as avg(ctr2.ctr_total_return) * Float64(1.2), ctr_store_sk@0 as ctr_store_sk] - │ AggregateExec: mode=FinalPartitioned, gby=[ctr_store_sk@0 as ctr_store_sk], aggr=[avg(ctr2.ctr_total_return)] - │ [Stage 8] => NetworkShuffleExec: output_partitions=3, input_tasks=2 + ┌───── Stage 5 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ctr_customer_sk@0, c_customer_sk@0)], projection=[ctr_store_sk@1, ctr_total_return@2, c_customer_id@4] + │ CoalescePartitionsExec + │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=2 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ctr_customer_sk@0, c_customer_sk@0)], projection=[ctr_store_sk@1, ctr_total_return@2, c_customer_id@4] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(s_store_sk@0, ctr_store_sk@1)], projection=[ctr_customer_sk@1, ctr_store_sk@2, ctr_total_return@3] │ CoalescePartitionsExec - │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=2 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - └────────────────────────────────────────────────── - ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(s_store_sk@0, ctr_store_sk@1)], projection=[ctr_customer_sk@1, ctr_store_sk@2, ctr_total_return@3] - │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=6, input_tasks=4 - │ ProjectionExec: expr=[sr_customer_sk@0 as ctr_customer_sk, sr_store_sk@1 as ctr_store_sk, sum(store_returns.sr_return_amt)@2 as ctr_total_return] - │ AggregateExec: mode=FinalPartitioned, gby=[sr_customer_sk@0 as sr_customer_sk, sr_store_sk@1 as sr_store_sk], aggr=[sum(store_returns.sr_return_amt)] - │ [Stage 3] => NetworkShuffleExec: output_partitions=3, input_tasks=4 - └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p5] t1:[p6..p11] t2:[p12..p17] t3:[p18..p23] - │ BroadcastExec: input_partitions=3, consumer_tasks=2, output_partitions=6 - │ FilterExec: s_state@1 = TN, projection=[s_store_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:..]]}, projection=[s_store_sk, s_state], file_type=parquet, predicate=s_state@24 = TN, pruning_predicate=s_state_null_count@2 != row_count@3 AND s_state_min@0 <= TN AND TN <= s_state_max@1, required_guarantees=[s_state in (TN)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:..]]}, projection=[s_store_sk, s_state], file_type=parquet, predicate=s_state@24 = TN, pruning_predicate=s_state_null_count@2 != row_count@3 AND s_state_min@0 <= TN AND TN <= s_state_max@1, required_guarantees=[s_state in (TN)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_state], file_type=parquet, predicate=s_state@24 = TN, pruning_predicate=s_state_null_count@2 != row_count@3 AND s_state_min@0 <= TN AND TN <= s_state_max@1, required_guarantees=[s_state in (TN)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_state], file_type=parquet, predicate=s_state@24 = TN, pruning_predicate=s_state_null_count@2 != row_count@3 AND s_state_min@0 <= TN AND TN <= s_state_max@1, required_guarantees=[s_state in (TN)] - └────────────────────────────────────────────────── - ┌───── Stage 3 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] - │ RepartitionExec: partitioning=Hash([sr_customer_sk@0, sr_store_sk@1], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[sr_customer_sk@0 as sr_customer_sk, sr_store_sk@1 as sr_store_sk], aggr=[sum(store_returns.sr_return_amt)] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, sr_returned_date_sk@0)], projection=[sr_customer_sk@2, sr_store_sk@3, sr_return_amt@4] - │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_returned_date_sk, sr_customer_sk, sr_store_sk, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_customer_sk, sr_store_sk, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_customer_sk, sr_store_sk, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_customer_sk, sr_store_sk, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: d_year@1 = 2000, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - └────────────────────────────────────────────────── - ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p0..p11] - │ RepartitionExec: partitioning=Hash([ctr_store_sk@0], 12), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[ctr_store_sk@0 as ctr_store_sk], aggr=[avg(ctr2.ctr_total_return)] - │ ProjectionExec: expr=[sr_store_sk@1 as ctr_store_sk, sum(store_returns.sr_return_amt)@2 as ctr_total_return] + │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=6, input_tasks=4 + │ ProjectionExec: expr=[sr_customer_sk@0 as ctr_customer_sk, sr_store_sk@1 as ctr_store_sk, sum(store_returns.sr_return_amt)@2 as ctr_total_return] │ AggregateExec: mode=FinalPartitioned, gby=[sr_customer_sk@0 as sr_customer_sk, sr_store_sk@1 as sr_store_sk], aggr=[sum(store_returns.sr_return_amt)] - │ [Stage 7] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 3] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 7 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] + ┌───── Stage 1 ── Tasks: t0:[p0..p5] t1:[p6..p11] t2:[p12..p17] t3:[p18..p23] + │ BroadcastExec: input_partitions=3, consumer_tasks=2, output_partitions=6 + │ FilterExec: s_state@1 = TN, projection=[s_store_sk@0] + │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:..]]}, projection=[s_store_sk, s_state], file_type=parquet, predicate=s_state@24 = TN, pruning_predicate=s_state_null_count@2 != row_count@3 AND s_state_min@0 <= TN AND TN <= s_state_max@1, required_guarantees=[s_state in (TN)] + │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:..]]}, projection=[s_store_sk, s_state], file_type=parquet, predicate=s_state@24 = TN, pruning_predicate=s_state_null_count@2 != row_count@3 AND s_state_min@0 <= TN AND TN <= s_state_max@1, required_guarantees=[s_state in (TN)] + │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_state], file_type=parquet, predicate=s_state@24 = TN, pruning_predicate=s_state_null_count@2 != row_count@3 AND s_state_min@0 <= TN AND TN <= s_state_max@1, required_guarantees=[s_state in (TN)] + │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_state], file_type=parquet, predicate=s_state@24 = TN, pruning_predicate=s_state_null_count@2 != row_count@3 AND s_state_min@0 <= TN AND TN <= s_state_max@1, required_guarantees=[s_state in (TN)] + └────────────────────────────────────────────────── + ┌───── Stage 3 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([sr_customer_sk@0, sr_store_sk@1], 6), input_partitions=3 │ AggregateExec: mode=Partial, gby=[sr_customer_sk@0 as sr_customer_sk, sr_store_sk@1 as sr_store_sk], aggr=[sum(store_returns.sr_return_amt)] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, sr_returned_date_sk@0)], projection=[sr_customer_sk@2, sr_store_sk@3, sr_return_amt@4] │ CoalescePartitionsExec - │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_returned_date_sk, sr_customer_sk, sr_store_sk, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_customer_sk, sr_store_sk, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_customer_sk, sr_store_sk, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_customer_sk, sr_store_sk, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2000, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] └────────────────────────────────────────────────── + ┌───── Stage 8 ── Tasks: t0:[p0..p2] t1:[p0..p2] + │ RepartitionExec: partitioning=Hash([ctr_store_sk@0], 3), input_partitions=3 + │ AggregateExec: mode=Partial, gby=[ctr_store_sk@0 as ctr_store_sk], aggr=[avg(ctr2.ctr_total_return)] + │ ProjectionExec: expr=[sr_store_sk@1 as ctr_store_sk, sum(store_returns.sr_return_amt)@2 as ctr_total_return] + │ AggregateExec: mode=FinalPartitioned, gby=[sr_customer_sk@0 as sr_customer_sk, sr_store_sk@1 as sr_store_sk], aggr=[sum(store_returns.sr_return_amt)] + │ [Stage 7] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + └────────────────────────────────────────────────── + ┌───── Stage 7 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] + │ RepartitionExec: partitioning=Hash([sr_customer_sk@0, sr_store_sk@1], 6), input_partitions=3 + │ AggregateExec: mode=Partial, gby=[sr_customer_sk@0 as sr_customer_sk, sr_store_sk@1 as sr_store_sk], aggr=[sum(store_returns.sr_return_amt)] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, sr_returned_date_sk@0)], projection=[sr_customer_sk@2, sr_store_sk@3, sr_return_amt@4] + │ CoalescePartitionsExec + │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_returned_date_sk, sr_customer_sk, sr_store_sk, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_customer_sk, sr_store_sk, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_customer_sk, sr_store_sk, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_customer_sk, sr_store_sk, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + └────────────────────────────────────────────────── + ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ FilterExec: d_year@1 = 2000, projection=[d_date_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + └────────────────────────────────────────────────── "); Ok(()) } @@ -143,40 +136,39 @@ mod tests { │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=6, input_tasks=4 │ ProjectionExec: expr=[d_week_seq@0 as d_week_seq, sum(CASE WHEN date_dim.d_day_name = Utf8("Sunday") THEN wscs.sales_price ELSE NULL END)@1 as sun_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Monday") THEN wscs.sales_price ELSE NULL END)@2 as mon_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Tuesday") THEN wscs.sales_price ELSE NULL END)@3 as tue_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Wednesday") THEN wscs.sales_price ELSE NULL END)@4 as wed_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Thursday") THEN wscs.sales_price ELSE NULL END)@5 as thu_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Friday") THEN wscs.sales_price ELSE NULL END)@6 as fri_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Saturday") THEN wscs.sales_price ELSE NULL END)@7 as sat_sales] - │ AggregateExec: mode=FinalPartitioned, gby=[d_week_seq@0 as d_week_seq], aggr=[sum(CASE WHEN date_dim.d_day_name = Sunday THEN wscs.sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Sunday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Monday THEN wscs.sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Monday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Tuesday THEN wscs.sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Tuesday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Wednesday THEN wscs.sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Wednesday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Thursday THEN wscs.sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Thursday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Friday THEN wscs.sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Friday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Saturday THEN wscs.sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Saturday") THEN wscs.sales_price ELSE NULL END)] + │ AggregateExec: mode=FinalPartitioned, gby=[d_week_seq@0 as d_week_seq], aggr=[sum(CASE WHEN date_dim.d_day_name = Sunday THEN wscs.sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Sunday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Monday THEN wscs.sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Monday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Tuesday THEN wscs.sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Tuesday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Wednesday THEN wscs.sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Wednesday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Thursday THEN wscs.sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Thursday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Friday THEN wscs.sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Friday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Saturday THEN wscs.sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Saturday") THEN wscs.sales_price ELSE NULL END)] │ [Stage 3] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p5] t1:[p6..p11] t2:[p12..p17] t3:[p18..p23] │ BroadcastExec: input_partitions=3, consumer_tasks=2, output_partitions=6 │ FilterExec: d_year@1 = 2001, projection=[d_week_seq@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_week_seq, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_week_seq, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_week_seq, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_week_seq, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_week_seq, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_week_seq, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_week_seq, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_week_seq, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([d_week_seq@0], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[d_week_seq@1 as d_week_seq], aggr=[sum(CASE WHEN date_dim.d_day_name = Sunday THEN wscs.sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Sunday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Monday THEN wscs.sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Monday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Tuesday THEN wscs.sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Tuesday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Wednesday THEN wscs.sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Wednesday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Thursday THEN wscs.sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Thursday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Friday THEN wscs.sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Friday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Saturday THEN wscs.sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Saturday") THEN wscs.sales_price ELSE NULL END)] + │ AggregateExec: mode=Partial, gby=[d_week_seq@1 as d_week_seq], aggr=[sum(CASE WHEN date_dim.d_day_name = Sunday THEN wscs.sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Sunday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Monday THEN wscs.sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Monday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Tuesday THEN wscs.sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Tuesday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Wednesday THEN wscs.sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Wednesday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Thursday THEN wscs.sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Thursday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Friday THEN wscs.sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Friday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Saturday THEN wscs.sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Saturday") THEN wscs.sales_price ELSE NULL END)] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, sold_date_sk@0)], projection=[sales_price@4, d_week_seq@1, d_day_name@2] │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedUnionExec: t0:[c0(0/2)] t1:[c0(1/2)] t2:[c1(0/2)] t3:[c1(1/2)] │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk@0 as sold_date_sk, ws_ext_sales_price@23 as sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk@0 as sold_date_sk, ws_ext_sales_price@23 as sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk@0 as sold_date_sk, ws_ext_sales_price@23 as sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk@0 as sold_date_sk, cs_ext_sales_price@23 as sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk@0 as sold_date_sk, cs_ext_sales_price@23 as sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p5] t1:[p0..p5] │ RepartitionExec: partitioning=Hash([z.d_week_seq2 - Int64(53)@8], 6), input_partitions=3 @@ -185,40 +177,39 @@ mod tests { │ CoalescePartitionsExec │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=6, input_tasks=4 │ ProjectionExec: expr=[d_week_seq@0 as d_week_seq, sum(CASE WHEN date_dim.d_day_name = Utf8("Sunday") THEN wscs.sales_price ELSE NULL END)@1 as sun_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Monday") THEN wscs.sales_price ELSE NULL END)@2 as mon_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Tuesday") THEN wscs.sales_price ELSE NULL END)@3 as tue_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Wednesday") THEN wscs.sales_price ELSE NULL END)@4 as wed_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Thursday") THEN wscs.sales_price ELSE NULL END)@5 as thu_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Friday") THEN wscs.sales_price ELSE NULL END)@6 as fri_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Saturday") THEN wscs.sales_price ELSE NULL END)@7 as sat_sales] - │ AggregateExec: mode=FinalPartitioned, gby=[d_week_seq@0 as d_week_seq], aggr=[sum(CASE WHEN date_dim.d_day_name = Sunday THEN wscs.sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Sunday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Monday THEN wscs.sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Monday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Tuesday THEN wscs.sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Tuesday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Wednesday THEN wscs.sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Wednesday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Thursday THEN wscs.sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Thursday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Friday THEN wscs.sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Friday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Saturday THEN wscs.sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Saturday") THEN wscs.sales_price ELSE NULL END)] + │ AggregateExec: mode=FinalPartitioned, gby=[d_week_seq@0 as d_week_seq], aggr=[sum(CASE WHEN date_dim.d_day_name = Sunday THEN wscs.sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Sunday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Monday THEN wscs.sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Monday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Tuesday THEN wscs.sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Tuesday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Wednesday THEN wscs.sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Wednesday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Thursday THEN wscs.sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Thursday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Friday THEN wscs.sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Friday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Saturday THEN wscs.sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Saturday") THEN wscs.sales_price ELSE NULL END)] │ [Stage 7] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p5] t1:[p6..p11] t2:[p12..p17] t3:[p18..p23] │ BroadcastExec: input_partitions=3, consumer_tasks=2, output_partitions=6 │ FilterExec: d_year@1 = 2002, projection=[d_week_seq@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_week_seq, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_week_seq, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_week_seq, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_week_seq, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_week_seq, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_week_seq, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_week_seq, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_week_seq, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([d_week_seq@0], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[d_week_seq@1 as d_week_seq], aggr=[sum(CASE WHEN date_dim.d_day_name = Sunday THEN wscs.sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Sunday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Monday THEN wscs.sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Monday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Tuesday THEN wscs.sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Tuesday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Wednesday THEN wscs.sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Wednesday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Thursday THEN wscs.sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Thursday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Friday THEN wscs.sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Friday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Saturday THEN wscs.sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Saturday") THEN wscs.sales_price ELSE NULL END)] + │ AggregateExec: mode=Partial, gby=[d_week_seq@1 as d_week_seq], aggr=[sum(CASE WHEN date_dim.d_day_name = Sunday THEN wscs.sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Sunday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Monday THEN wscs.sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Monday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Tuesday THEN wscs.sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Tuesday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Wednesday THEN wscs.sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Wednesday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Thursday THEN wscs.sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Thursday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Friday THEN wscs.sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Friday") THEN wscs.sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Saturday THEN wscs.sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Saturday") THEN wscs.sales_price ELSE NULL END)] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, sold_date_sk@0)], projection=[sales_price@4, d_week_seq@1, d_day_name@2] │ CoalescePartitionsExec - │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedUnionExec: t0:[c0(0/2)] t1:[c0(1/2)] t2:[c1(0/2)] t3:[c1(1/2)] │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk@0 as sold_date_sk, ws_ext_sales_price@23 as sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk@0 as sold_date_sk, ws_ext_sales_price@23 as sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk@0 as sold_date_sk, ws_ext_sales_price@23 as sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk@0 as sold_date_sk, cs_ext_sales_price@23 as sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk@0 as sold_date_sk, cs_ext_sales_price@23 as sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 6 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── "#); Ok(()) @@ -226,7 +217,7 @@ mod tests { #[tokio::test] async fn test_tpcds_3() -> Result<()> { let display = test_tpcds_query("q3").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [d_year@0 ASC NULLS LAST, sum_agg@3 DESC, brand_id@1 ASC NULLS LAST], fetch=100 │ [Stage 4] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -255,22 +246,20 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_manufact_id@3 = 128, projection=[i_item_sk@0, i_brand_id@1, i_brand@2] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manufact_id], file_type=parquet, predicate=i_manufact_id@13 = 128, pruning_predicate=i_manufact_id_null_count@2 != row_count@3 AND i_manufact_id_min@0 <= 128 AND 128 <= i_manufact_id_max@1, required_guarantees=[i_manufact_id in (128)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manufact_id], file_type=parquet, predicate=i_manufact_id@13 = 128, pruning_predicate=i_manufact_id_null_count@2 != row_count@3 AND i_manufact_id_min@0 <= 128 AND 128 <= i_manufact_id_max@1, required_guarantees=[i_manufact_id in (128)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manufact_id], file_type=parquet, predicate=i_manufact_id@13 = 128, pruning_predicate=i_manufact_id_null_count@2 != row_count@3 AND i_manufact_id_min@0 <= 128 AND 128 <= i_manufact_id_max@1, required_guarantees=[i_manufact_id in (128)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manufact_id], file_type=parquet, predicate=i_manufact_id@13 = 128, pruning_predicate=i_manufact_id_null_count@2 != row_count@3 AND i_manufact_id_min@0 <= 128 AND 128 <= i_manufact_id_max@1, required_guarantees=[i_manufact_id in (128)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manufact_id], file_type=parquet, predicate=i_manufact_id@13 = 128, pruning_predicate=i_manufact_id_null_count@2 != row_count@3 AND i_manufact_id_min@0 <= 128 AND 128 <= i_manufact_id_max@1, required_guarantees=[i_manufact_id in (128)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manufact_id], file_type=parquet, predicate=i_manufact_id@13 = 128, pruning_predicate=i_manufact_id_null_count@2 != row_count@3 AND i_manufact_id_min@0 <= 128 AND 128 <= i_manufact_id_max@1, required_guarantees=[i_manufact_id in (128)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manufact_id], file_type=parquet, predicate=i_manufact_id@13 = 128, pruning_predicate=i_manufact_id_null_count@2 != row_count@3 AND i_manufact_id_min@0 <= 128 AND 128 <= i_manufact_id_max@1, required_guarantees=[i_manufact_id in (128)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manufact_id], file_type=parquet, predicate=i_manufact_id@13 = 128, pruning_predicate=i_manufact_id_null_count@2 != row_count@3 AND i_manufact_id_min@0 <= 128 AND 128 <= i_manufact_id_max@1, required_guarantees=[i_manufact_id in (128)] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_moy@2 = 11, projection=[d_date_sk@0, d_year@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1, required_guarantees=[d_moy in (11)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1, required_guarantees=[d_moy in (11)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1, required_guarantees=[d_moy in (11)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1, required_guarantees=[d_moy in (11)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1, required_guarantees=[d_moy in (11)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1, required_guarantees=[d_moy in (11)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1, required_guarantees=[d_moy in (11)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1, required_guarantees=[d_moy in (11)] └────────────────────────────────────────────────── "); Ok(()) @@ -278,18 +267,18 @@ mod tests { #[tokio::test] async fn test_tpcds_4() -> Result<()> { let display = test_tpcds_query("q4").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [customer_id@0 ASC, customer_first_name@1 ASC, customer_last_name@2 ASC, customer_preferred_cust_flag@3 ASC], fetch=100 │ [Stage 24] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 └────────────────────────────────────────────────── ┌───── Stage 24 ── Tasks: t0:[p0..p2] t1:[p0..p2] │ SortExec: TopK(fetch=100), expr=[customer_id@0 ASC, customer_first_name@1 ASC, customer_last_name@2 ASC, customer_preferred_cust_flag@3 ASC], preserve_partitioning=[true] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(customer_id@0, customer_id@0)], filter=CASE WHEN year_total@0 > Some(0),24,6 THEN year_total@1 / year_total@0 END > CASE WHEN year_total@2 > Some(0),24,6 THEN year_total@3 / year_total@2 END, projection=[customer_id@1, customer_first_name@2, customer_last_name@3, customer_preferred_cust_flag@4] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(customer_id@0, customer_id@0)], filter=CASE WHEN year_total@0 > 0.000000 THEN year_total@1 / year_total@0 END > CASE WHEN year_total@2 > 0.000000 THEN year_total@3 / year_total@2 END, projection=[customer_id@1, customer_first_name@2, customer_last_name@3, customer_preferred_cust_flag@4] │ CoalescePartitionsExec │ [Stage 20] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=6, input_tasks=2 │ ProjectionExec: expr=[c_customer_id@0 as customer_id, sum(web_sales.ws_ext_list_price - web_sales.ws_ext_wholesale_cost - web_sales.ws_ext_discount_amt + web_sales.ws_ext_sales_price / Int64(2))@8 as year_total] - │ AggregateExec: mode=FinalPartitioned, gby=[c_customer_id@0 as c_customer_id, c_first_name@1 as c_first_name, c_last_name@2 as c_last_name, c_preferred_cust_flag@3 as c_preferred_cust_flag, c_birth_country@4 as c_birth_country, c_login@5 as c_login, c_email_address@6 as c_email_address, d_year@7 as d_year], aggr=[sum(web_sales.ws_ext_list_price - web_sales.ws_ext_wholesale_cost - web_sales.ws_ext_discount_amt + web_sales.ws_ext_sales_price / Some(2),20,0) as sum(web_sales.ws_ext_list_price - web_sales.ws_ext_wholesale_cost - web_sales.ws_ext_discount_amt + web_sales.ws_ext_sales_price / Int64(2))], ordering_mode=PartiallySorted([7]) + │ AggregateExec: mode=FinalPartitioned, gby=[c_customer_id@0 as c_customer_id, c_first_name@1 as c_first_name, c_last_name@2 as c_last_name, c_preferred_cust_flag@3 as c_preferred_cust_flag, c_birth_country@4 as c_birth_country, c_login@5 as c_login, c_email_address@6 as c_email_address, d_year@7 as d_year], aggr=[sum(web_sales.ws_ext_list_price - web_sales.ws_ext_wholesale_cost - web_sales.ws_ext_discount_amt + web_sales.ws_ext_sales_price / 2) as sum(web_sales.ws_ext_list_price - web_sales.ws_ext_wholesale_cost - web_sales.ws_ext_discount_amt + web_sales.ws_ext_sales_price / Int64(2))], ordering_mode=PartiallySorted([7]) │ [Stage 23] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 20 ── Tasks: t0:[p0..p5] t1:[p6..p11] @@ -297,30 +286,30 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(customer_id@0, customer_id@0)], projection=[customer_id@2, customer_id@3, customer_first_name@4, customer_last_name@5, customer_preferred_cust_flag@6, year_total@7, year_total@8, year_total@1] │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=6, input_tasks=2 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(customer_id@0, customer_id@0)], filter=CASE WHEN year_total@2 > Some(0),24,6 THEN year_total@3 / year_total@2 END > CASE WHEN year_total@0 > Some(0),24,6 THEN year_total@1 / year_total@0 END, projection=[customer_id@0, customer_id@2, customer_first_name@3, customer_last_name@4, customer_preferred_cust_flag@5, year_total@7, year_total@9] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(customer_id@0, customer_id@0)], filter=CASE WHEN year_total@2 > 0.000000 THEN year_total@3 / year_total@2 END > CASE WHEN year_total@0 > 0.000000 THEN year_total@1 / year_total@0 END, projection=[customer_id@0, customer_id@2, customer_first_name@3, customer_last_name@4, customer_preferred_cust_flag@5, year_total@7, year_total@9] │ CoalescePartitionsExec │ [Stage 16] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=6, input_tasks=2 │ ProjectionExec: expr=[c_customer_id@0 as customer_id, sum(catalog_sales.cs_ext_list_price - catalog_sales.cs_ext_wholesale_cost - catalog_sales.cs_ext_discount_amt + catalog_sales.cs_ext_sales_price / Int64(2))@8 as year_total] - │ AggregateExec: mode=FinalPartitioned, gby=[c_customer_id@0 as c_customer_id, c_first_name@1 as c_first_name, c_last_name@2 as c_last_name, c_preferred_cust_flag@3 as c_preferred_cust_flag, c_birth_country@4 as c_birth_country, c_login@5 as c_login, c_email_address@6 as c_email_address, d_year@7 as d_year], aggr=[sum(catalog_sales.cs_ext_list_price - catalog_sales.cs_ext_wholesale_cost - catalog_sales.cs_ext_discount_amt + catalog_sales.cs_ext_sales_price / Some(2),20,0) as sum(catalog_sales.cs_ext_list_price - catalog_sales.cs_ext_wholesale_cost - catalog_sales.cs_ext_discount_amt + catalog_sales.cs_ext_sales_price / Int64(2))], ordering_mode=PartiallySorted([7]) + │ AggregateExec: mode=FinalPartitioned, gby=[c_customer_id@0 as c_customer_id, c_first_name@1 as c_first_name, c_last_name@2 as c_last_name, c_preferred_cust_flag@3 as c_preferred_cust_flag, c_birth_country@4 as c_birth_country, c_login@5 as c_login, c_email_address@6 as c_email_address, d_year@7 as d_year], aggr=[sum(catalog_sales.cs_ext_list_price - catalog_sales.cs_ext_wholesale_cost - catalog_sales.cs_ext_discount_amt + catalog_sales.cs_ext_sales_price / 2) as sum(catalog_sales.cs_ext_list_price - catalog_sales.cs_ext_wholesale_cost - catalog_sales.cs_ext_discount_amt + catalog_sales.cs_ext_sales_price / Int64(2))], ordering_mode=PartiallySorted([7]) │ [Stage 19] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p5] t1:[p6..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=2, output_partitions=6 │ ProjectionExec: expr=[c_customer_id@0 as customer_id, sum(web_sales.ws_ext_list_price - web_sales.ws_ext_wholesale_cost - web_sales.ws_ext_discount_amt + web_sales.ws_ext_sales_price / Int64(2))@1 as year_total] - │ FilterExec: sum(web_sales.ws_ext_list_price - web_sales.ws_ext_wholesale_cost - web_sales.ws_ext_discount_amt + web_sales.ws_ext_sales_price / Int64(2))@1 > Some(0),24,6 + │ FilterExec: sum(web_sales.ws_ext_list_price - web_sales.ws_ext_wholesale_cost - web_sales.ws_ext_discount_amt + web_sales.ws_ext_sales_price / Int64(2))@1 > 0.000000 │ ProjectionExec: expr=[c_customer_id@0 as c_customer_id, sum(web_sales.ws_ext_list_price - web_sales.ws_ext_wholesale_cost - web_sales.ws_ext_discount_amt + web_sales.ws_ext_sales_price / Int64(2))@8 as sum(web_sales.ws_ext_list_price - web_sales.ws_ext_wholesale_cost - web_sales.ws_ext_discount_amt + web_sales.ws_ext_sales_price / Int64(2))] - │ AggregateExec: mode=FinalPartitioned, gby=[c_customer_id@0 as c_customer_id, c_first_name@1 as c_first_name, c_last_name@2 as c_last_name, c_preferred_cust_flag@3 as c_preferred_cust_flag, c_birth_country@4 as c_birth_country, c_login@5 as c_login, c_email_address@6 as c_email_address, d_year@7 as d_year], aggr=[sum(web_sales.ws_ext_list_price - web_sales.ws_ext_wholesale_cost - web_sales.ws_ext_discount_amt + web_sales.ws_ext_sales_price / Some(2),20,0) as sum(web_sales.ws_ext_list_price - web_sales.ws_ext_wholesale_cost - web_sales.ws_ext_discount_amt + web_sales.ws_ext_sales_price / Int64(2))], ordering_mode=PartiallySorted([7]) + │ AggregateExec: mode=FinalPartitioned, gby=[c_customer_id@0 as c_customer_id, c_first_name@1 as c_first_name, c_last_name@2 as c_last_name, c_preferred_cust_flag@3 as c_preferred_cust_flag, c_birth_country@4 as c_birth_country, c_login@5 as c_login, c_email_address@6 as c_email_address, d_year@7 as d_year], aggr=[sum(web_sales.ws_ext_list_price - web_sales.ws_ext_wholesale_cost - web_sales.ws_ext_discount_amt + web_sales.ws_ext_sales_price / 2) as sum(web_sales.ws_ext_list_price - web_sales.ws_ext_wholesale_cost - web_sales.ws_ext_discount_amt + web_sales.ws_ext_sales_price / Int64(2))], ordering_mode=PartiallySorted([7]) │ [Stage 3] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([c_customer_id@0, c_first_name@1, c_last_name@2, c_preferred_cust_flag@3, c_birth_country@4, c_login@5, c_email_address@6, d_year@7], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[c_customer_id@0 as c_customer_id, c_first_name@1 as c_first_name, c_last_name@2 as c_last_name, c_preferred_cust_flag@3 as c_preferred_cust_flag, c_birth_country@4 as c_birth_country, c_login@5 as c_login, c_email_address@6 as c_email_address, d_year@11 as d_year], aggr=[sum(web_sales.ws_ext_list_price - web_sales.ws_ext_wholesale_cost - web_sales.ws_ext_discount_amt + web_sales.ws_ext_sales_price / Some(2),20,0) as sum(web_sales.ws_ext_list_price - web_sales.ws_ext_wholesale_cost - web_sales.ws_ext_discount_amt + web_sales.ws_ext_sales_price / Int64(2))], ordering_mode=PartiallySorted([7]) + │ AggregateExec: mode=Partial, gby=[c_customer_id@0 as c_customer_id, c_first_name@1 as c_first_name, c_last_name@2 as c_last_name, c_preferred_cust_flag@3 as c_preferred_cust_flag, c_birth_country@4 as c_birth_country, c_login@5 as c_login, c_email_address@6 as c_email_address, d_year@11 as d_year], aggr=[sum(web_sales.ws_ext_list_price - web_sales.ws_ext_wholesale_cost - web_sales.ws_ext_discount_amt + web_sales.ws_ext_sales_price / 2) as sum(web_sales.ws_ext_list_price - web_sales.ws_ext_wholesale_cost - web_sales.ws_ext_discount_amt + web_sales.ws_ext_sales_price / Int64(2))], ordering_mode=PartiallySorted([7]) │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_sold_date_sk@7)], projection=[c_customer_id@2, c_first_name@3, c_last_name@4, c_preferred_cust_flag@5, c_birth_country@6, c_login@7, c_email_address@8, ws_ext_discount_amt@10, ws_ext_sales_price@11, ws_ext_wholesale_cost@12, ws_ext_list_price@13, d_year@1] │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ws_bill_customer_sk@1)], projection=[c_customer_id@1, c_first_name@2, c_last_name@3, c_preferred_cust_flag@4, c_birth_country@5, c_login@6, c_email_address@7, ws_sold_date_sk@8, ws_ext_discount_amt@10, ws_ext_sales_price@11, ws_ext_wholesale_cost@12, ws_ext_list_price@13] │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_sales_price, ws_ext_wholesale_cost, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_sales_price, ws_ext_wholesale_cost, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] @@ -330,20 +319,19 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2001 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 16 ── Tasks: t0:[p0..p5] t1:[p6..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=2, output_partitions=6 @@ -354,26 +342,26 @@ mod tests { │ CoalescePartitionsExec │ [Stage 12] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=6, input_tasks=2 │ ProjectionExec: expr=[c_customer_id@0 as customer_id, c_first_name@1 as customer_first_name, c_last_name@2 as customer_last_name, c_preferred_cust_flag@3 as customer_preferred_cust_flag, sum(store_sales.ss_ext_list_price - store_sales.ss_ext_wholesale_cost - store_sales.ss_ext_discount_amt + store_sales.ss_ext_sales_price / Int64(2))@8 as year_total] - │ AggregateExec: mode=FinalPartitioned, gby=[c_customer_id@0 as c_customer_id, c_first_name@1 as c_first_name, c_last_name@2 as c_last_name, c_preferred_cust_flag@3 as c_preferred_cust_flag, c_birth_country@4 as c_birth_country, c_login@5 as c_login, c_email_address@6 as c_email_address, d_year@7 as d_year], aggr=[sum(store_sales.ss_ext_list_price - store_sales.ss_ext_wholesale_cost - store_sales.ss_ext_discount_amt + store_sales.ss_ext_sales_price / Some(2),20,0) as sum(store_sales.ss_ext_list_price - store_sales.ss_ext_wholesale_cost - store_sales.ss_ext_discount_amt + store_sales.ss_ext_sales_price / Int64(2))], ordering_mode=PartiallySorted([7]) + │ AggregateExec: mode=FinalPartitioned, gby=[c_customer_id@0 as c_customer_id, c_first_name@1 as c_first_name, c_last_name@2 as c_last_name, c_preferred_cust_flag@3 as c_preferred_cust_flag, c_birth_country@4 as c_birth_country, c_login@5 as c_login, c_email_address@6 as c_email_address, d_year@7 as d_year], aggr=[sum(store_sales.ss_ext_list_price - store_sales.ss_ext_wholesale_cost - store_sales.ss_ext_discount_amt + store_sales.ss_ext_sales_price / 2) as sum(store_sales.ss_ext_list_price - store_sales.ss_ext_wholesale_cost - store_sales.ss_ext_discount_amt + store_sales.ss_ext_sales_price / Int64(2))], ordering_mode=PartiallySorted([7]) │ [Stage 15] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p5] t1:[p6..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=2, output_partitions=6 │ ProjectionExec: expr=[c_customer_id@0 as customer_id, sum(catalog_sales.cs_ext_list_price - catalog_sales.cs_ext_wholesale_cost - catalog_sales.cs_ext_discount_amt + catalog_sales.cs_ext_sales_price / Int64(2))@1 as year_total] - │ FilterExec: sum(catalog_sales.cs_ext_list_price - catalog_sales.cs_ext_wholesale_cost - catalog_sales.cs_ext_discount_amt + catalog_sales.cs_ext_sales_price / Int64(2))@1 > Some(0),24,6 + │ FilterExec: sum(catalog_sales.cs_ext_list_price - catalog_sales.cs_ext_wholesale_cost - catalog_sales.cs_ext_discount_amt + catalog_sales.cs_ext_sales_price / Int64(2))@1 > 0.000000 │ ProjectionExec: expr=[c_customer_id@0 as c_customer_id, sum(catalog_sales.cs_ext_list_price - catalog_sales.cs_ext_wholesale_cost - catalog_sales.cs_ext_discount_amt + catalog_sales.cs_ext_sales_price / Int64(2))@8 as sum(catalog_sales.cs_ext_list_price - catalog_sales.cs_ext_wholesale_cost - catalog_sales.cs_ext_discount_amt + catalog_sales.cs_ext_sales_price / Int64(2))] - │ AggregateExec: mode=FinalPartitioned, gby=[c_customer_id@0 as c_customer_id, c_first_name@1 as c_first_name, c_last_name@2 as c_last_name, c_preferred_cust_flag@3 as c_preferred_cust_flag, c_birth_country@4 as c_birth_country, c_login@5 as c_login, c_email_address@6 as c_email_address, d_year@7 as d_year], aggr=[sum(catalog_sales.cs_ext_list_price - catalog_sales.cs_ext_wholesale_cost - catalog_sales.cs_ext_discount_amt + catalog_sales.cs_ext_sales_price / Some(2),20,0) as sum(catalog_sales.cs_ext_list_price - catalog_sales.cs_ext_wholesale_cost - catalog_sales.cs_ext_discount_amt + catalog_sales.cs_ext_sales_price / Int64(2))], ordering_mode=PartiallySorted([7]) + │ AggregateExec: mode=FinalPartitioned, gby=[c_customer_id@0 as c_customer_id, c_first_name@1 as c_first_name, c_last_name@2 as c_last_name, c_preferred_cust_flag@3 as c_preferred_cust_flag, c_birth_country@4 as c_birth_country, c_login@5 as c_login, c_email_address@6 as c_email_address, d_year@7 as d_year], aggr=[sum(catalog_sales.cs_ext_list_price - catalog_sales.cs_ext_wholesale_cost - catalog_sales.cs_ext_discount_amt + catalog_sales.cs_ext_sales_price / 2) as sum(catalog_sales.cs_ext_list_price - catalog_sales.cs_ext_wholesale_cost - catalog_sales.cs_ext_discount_amt + catalog_sales.cs_ext_sales_price / Int64(2))], ordering_mode=PartiallySorted([7]) │ [Stage 7] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([c_customer_id@0, c_first_name@1, c_last_name@2, c_preferred_cust_flag@3, c_birth_country@4, c_login@5, c_email_address@6, d_year@7], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[c_customer_id@0 as c_customer_id, c_first_name@1 as c_first_name, c_last_name@2 as c_last_name, c_preferred_cust_flag@3 as c_preferred_cust_flag, c_birth_country@4 as c_birth_country, c_login@5 as c_login, c_email_address@6 as c_email_address, d_year@11 as d_year], aggr=[sum(catalog_sales.cs_ext_list_price - catalog_sales.cs_ext_wholesale_cost - catalog_sales.cs_ext_discount_amt + catalog_sales.cs_ext_sales_price / Some(2),20,0) as sum(catalog_sales.cs_ext_list_price - catalog_sales.cs_ext_wholesale_cost - catalog_sales.cs_ext_discount_amt + catalog_sales.cs_ext_sales_price / Int64(2))], ordering_mode=PartiallySorted([7]) + │ AggregateExec: mode=Partial, gby=[c_customer_id@0 as c_customer_id, c_first_name@1 as c_first_name, c_last_name@2 as c_last_name, c_preferred_cust_flag@3 as c_preferred_cust_flag, c_birth_country@4 as c_birth_country, c_login@5 as c_login, c_email_address@6 as c_email_address, d_year@11 as d_year], aggr=[sum(catalog_sales.cs_ext_list_price - catalog_sales.cs_ext_wholesale_cost - catalog_sales.cs_ext_discount_amt + catalog_sales.cs_ext_sales_price / 2) as sum(catalog_sales.cs_ext_list_price - catalog_sales.cs_ext_wholesale_cost - catalog_sales.cs_ext_discount_amt + catalog_sales.cs_ext_sales_price / Int64(2))], ordering_mode=PartiallySorted([7]) │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@7)], projection=[c_customer_id@2, c_first_name@3, c_last_name@4, c_preferred_cust_flag@5, c_birth_country@6, c_login@7, c_email_address@8, cs_ext_discount_amt@10, cs_ext_sales_price@11, cs_ext_wholesale_cost@12, cs_ext_list_price@13, d_year@1] │ CoalescePartitionsExec │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, cs_bill_customer_sk@1)], projection=[c_customer_id@1, c_first_name@2, c_last_name@3, c_preferred_cust_flag@4, c_birth_country@5, c_login@6, c_email_address@7, cs_sold_date_sk@8, cs_ext_discount_amt@10, cs_ext_sales_price@11, cs_ext_wholesale_cost@12, cs_ext_list_price@13] │ CoalescePartitionsExec - │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_ext_discount_amt, cs_ext_sales_price, cs_ext_wholesale_cost, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_ext_discount_amt, cs_ext_sales_price, cs_ext_wholesale_cost, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] @@ -383,38 +371,37 @@ mod tests { ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2001 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] └────────────────────────────────────────────────── - ┌───── Stage 6 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 12 ── Tasks: t0:[p0..p5] t1:[p6..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=2, output_partitions=6 │ ProjectionExec: expr=[c_customer_id@0 as customer_id, sum(store_sales.ss_ext_list_price - store_sales.ss_ext_wholesale_cost - store_sales.ss_ext_discount_amt + store_sales.ss_ext_sales_price / Int64(2))@1 as year_total] - │ FilterExec: sum(store_sales.ss_ext_list_price - store_sales.ss_ext_wholesale_cost - store_sales.ss_ext_discount_amt + store_sales.ss_ext_sales_price / Int64(2))@1 > Some(0),24,6 + │ FilterExec: sum(store_sales.ss_ext_list_price - store_sales.ss_ext_wholesale_cost - store_sales.ss_ext_discount_amt + store_sales.ss_ext_sales_price / Int64(2))@1 > 0.000000 │ ProjectionExec: expr=[c_customer_id@0 as c_customer_id, sum(store_sales.ss_ext_list_price - store_sales.ss_ext_wholesale_cost - store_sales.ss_ext_discount_amt + store_sales.ss_ext_sales_price / Int64(2))@8 as sum(store_sales.ss_ext_list_price - store_sales.ss_ext_wholesale_cost - store_sales.ss_ext_discount_amt + store_sales.ss_ext_sales_price / Int64(2))] - │ AggregateExec: mode=FinalPartitioned, gby=[c_customer_id@0 as c_customer_id, c_first_name@1 as c_first_name, c_last_name@2 as c_last_name, c_preferred_cust_flag@3 as c_preferred_cust_flag, c_birth_country@4 as c_birth_country, c_login@5 as c_login, c_email_address@6 as c_email_address, d_year@7 as d_year], aggr=[sum(store_sales.ss_ext_list_price - store_sales.ss_ext_wholesale_cost - store_sales.ss_ext_discount_amt + store_sales.ss_ext_sales_price / Some(2),20,0) as sum(store_sales.ss_ext_list_price - store_sales.ss_ext_wholesale_cost - store_sales.ss_ext_discount_amt + store_sales.ss_ext_sales_price / Int64(2))], ordering_mode=PartiallySorted([7]) + │ AggregateExec: mode=FinalPartitioned, gby=[c_customer_id@0 as c_customer_id, c_first_name@1 as c_first_name, c_last_name@2 as c_last_name, c_preferred_cust_flag@3 as c_preferred_cust_flag, c_birth_country@4 as c_birth_country, c_login@5 as c_login, c_email_address@6 as c_email_address, d_year@7 as d_year], aggr=[sum(store_sales.ss_ext_list_price - store_sales.ss_ext_wholesale_cost - store_sales.ss_ext_discount_amt + store_sales.ss_ext_sales_price / 2) as sum(store_sales.ss_ext_list_price - store_sales.ss_ext_wholesale_cost - store_sales.ss_ext_discount_amt + store_sales.ss_ext_sales_price / Int64(2))], ordering_mode=PartiallySorted([7]) │ [Stage 11] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 11 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([c_customer_id@0, c_first_name@1, c_last_name@2, c_preferred_cust_flag@3, c_birth_country@4, c_login@5, c_email_address@6, d_year@7], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[c_customer_id@0 as c_customer_id, c_first_name@1 as c_first_name, c_last_name@2 as c_last_name, c_preferred_cust_flag@3 as c_preferred_cust_flag, c_birth_country@4 as c_birth_country, c_login@5 as c_login, c_email_address@6 as c_email_address, d_year@11 as d_year], aggr=[sum(store_sales.ss_ext_list_price - store_sales.ss_ext_wholesale_cost - store_sales.ss_ext_discount_amt + store_sales.ss_ext_sales_price / Some(2),20,0) as sum(store_sales.ss_ext_list_price - store_sales.ss_ext_wholesale_cost - store_sales.ss_ext_discount_amt + store_sales.ss_ext_sales_price / Int64(2))], ordering_mode=PartiallySorted([7]) + │ AggregateExec: mode=Partial, gby=[c_customer_id@0 as c_customer_id, c_first_name@1 as c_first_name, c_last_name@2 as c_last_name, c_preferred_cust_flag@3 as c_preferred_cust_flag, c_birth_country@4 as c_birth_country, c_login@5 as c_login, c_email_address@6 as c_email_address, d_year@11 as d_year], aggr=[sum(store_sales.ss_ext_list_price - store_sales.ss_ext_wholesale_cost - store_sales.ss_ext_discount_amt + store_sales.ss_ext_sales_price / 2) as sum(store_sales.ss_ext_list_price - store_sales.ss_ext_wholesale_cost - store_sales.ss_ext_discount_amt + store_sales.ss_ext_sales_price / Int64(2))], ordering_mode=PartiallySorted([7]) │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@7)], projection=[c_customer_id@2, c_first_name@3, c_last_name@4, c_preferred_cust_flag@5, c_birth_country@6, c_login@7, c_email_address@8, ss_ext_discount_amt@10, ss_ext_sales_price@11, ss_ext_wholesale_cost@12, ss_ext_list_price@13, d_year@1] │ CoalescePartitionsExec │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ss_customer_sk@1)], projection=[c_customer_id@1, c_first_name@2, c_last_name@3, c_preferred_cust_flag@4, c_birth_country@5, c_login@6, c_email_address@7, ss_sold_date_sk@8, ss_ext_discount_amt@10, ss_ext_sales_price@11, ss_ext_wholesale_cost@12, ss_ext_list_price@13] │ CoalescePartitionsExec - │ [Stage 10] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 10] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_sales_price, ss_ext_wholesale_cost, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_sales_price, ss_ext_wholesale_cost, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] @@ -424,30 +411,29 @@ mod tests { ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2001 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] └────────────────────────────────────────────────── - ┌───── Stage 10 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 10 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 15 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([c_customer_id@0, c_first_name@1, c_last_name@2, c_preferred_cust_flag@3, c_birth_country@4, c_login@5, c_email_address@6, d_year@7], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[c_customer_id@0 as c_customer_id, c_first_name@1 as c_first_name, c_last_name@2 as c_last_name, c_preferred_cust_flag@3 as c_preferred_cust_flag, c_birth_country@4 as c_birth_country, c_login@5 as c_login, c_email_address@6 as c_email_address, d_year@11 as d_year], aggr=[sum(store_sales.ss_ext_list_price - store_sales.ss_ext_wholesale_cost - store_sales.ss_ext_discount_amt + store_sales.ss_ext_sales_price / Some(2),20,0) as sum(store_sales.ss_ext_list_price - store_sales.ss_ext_wholesale_cost - store_sales.ss_ext_discount_amt + store_sales.ss_ext_sales_price / Int64(2))], ordering_mode=PartiallySorted([7]) + │ AggregateExec: mode=Partial, gby=[c_customer_id@0 as c_customer_id, c_first_name@1 as c_first_name, c_last_name@2 as c_last_name, c_preferred_cust_flag@3 as c_preferred_cust_flag, c_birth_country@4 as c_birth_country, c_login@5 as c_login, c_email_address@6 as c_email_address, d_year@11 as d_year], aggr=[sum(store_sales.ss_ext_list_price - store_sales.ss_ext_wholesale_cost - store_sales.ss_ext_discount_amt + store_sales.ss_ext_sales_price / 2) as sum(store_sales.ss_ext_list_price - store_sales.ss_ext_wholesale_cost - store_sales.ss_ext_discount_amt + store_sales.ss_ext_sales_price / Int64(2))], ordering_mode=PartiallySorted([7]) │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@7)], projection=[c_customer_id@2, c_first_name@3, c_last_name@4, c_preferred_cust_flag@5, c_birth_country@6, c_login@7, c_email_address@8, ss_ext_discount_amt@10, ss_ext_sales_price@11, ss_ext_wholesale_cost@12, ss_ext_list_price@13, d_year@1] │ CoalescePartitionsExec │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ss_customer_sk@1)], projection=[c_customer_id@1, c_first_name@2, c_last_name@3, c_preferred_cust_flag@4, c_birth_country@5, c_login@6, c_email_address@7, ss_sold_date_sk@8, ss_ext_discount_amt@10, ss_ext_sales_price@11, ss_ext_wholesale_cost@12, ss_ext_list_price@13] │ CoalescePartitionsExec - │ [Stage 14] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 14] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_sales_price, ss_ext_wholesale_cost, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_sales_price, ss_ext_wholesale_cost, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] @@ -457,30 +443,29 @@ mod tests { ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2002 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] └────────────────────────────────────────────────── - ┌───── Stage 14 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 14 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 19 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([c_customer_id@0, c_first_name@1, c_last_name@2, c_preferred_cust_flag@3, c_birth_country@4, c_login@5, c_email_address@6, d_year@7], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[c_customer_id@0 as c_customer_id, c_first_name@1 as c_first_name, c_last_name@2 as c_last_name, c_preferred_cust_flag@3 as c_preferred_cust_flag, c_birth_country@4 as c_birth_country, c_login@5 as c_login, c_email_address@6 as c_email_address, d_year@11 as d_year], aggr=[sum(catalog_sales.cs_ext_list_price - catalog_sales.cs_ext_wholesale_cost - catalog_sales.cs_ext_discount_amt + catalog_sales.cs_ext_sales_price / Some(2),20,0) as sum(catalog_sales.cs_ext_list_price - catalog_sales.cs_ext_wholesale_cost - catalog_sales.cs_ext_discount_amt + catalog_sales.cs_ext_sales_price / Int64(2))], ordering_mode=PartiallySorted([7]) + │ AggregateExec: mode=Partial, gby=[c_customer_id@0 as c_customer_id, c_first_name@1 as c_first_name, c_last_name@2 as c_last_name, c_preferred_cust_flag@3 as c_preferred_cust_flag, c_birth_country@4 as c_birth_country, c_login@5 as c_login, c_email_address@6 as c_email_address, d_year@11 as d_year], aggr=[sum(catalog_sales.cs_ext_list_price - catalog_sales.cs_ext_wholesale_cost - catalog_sales.cs_ext_discount_amt + catalog_sales.cs_ext_sales_price / 2) as sum(catalog_sales.cs_ext_list_price - catalog_sales.cs_ext_wholesale_cost - catalog_sales.cs_ext_discount_amt + catalog_sales.cs_ext_sales_price / Int64(2))], ordering_mode=PartiallySorted([7]) │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@7)], projection=[c_customer_id@2, c_first_name@3, c_last_name@4, c_preferred_cust_flag@5, c_birth_country@6, c_login@7, c_email_address@8, cs_ext_discount_amt@10, cs_ext_sales_price@11, cs_ext_wholesale_cost@12, cs_ext_list_price@13, d_year@1] │ CoalescePartitionsExec │ [Stage 17] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, cs_bill_customer_sk@1)], projection=[c_customer_id@1, c_first_name@2, c_last_name@3, c_preferred_cust_flag@4, c_birth_country@5, c_login@6, c_email_address@7, cs_sold_date_sk@8, cs_ext_discount_amt@10, cs_ext_sales_price@11, cs_ext_wholesale_cost@12, cs_ext_list_price@13] │ CoalescePartitionsExec - │ [Stage 18] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 18] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_ext_discount_amt, cs_ext_sales_price, cs_ext_wholesale_cost, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_ext_discount_amt, cs_ext_sales_price, cs_ext_wholesale_cost, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] @@ -490,30 +475,29 @@ mod tests { ┌───── Stage 17 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2002 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] └────────────────────────────────────────────────── - ┌───── Stage 18 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 18 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 23 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([c_customer_id@0, c_first_name@1, c_last_name@2, c_preferred_cust_flag@3, c_birth_country@4, c_login@5, c_email_address@6, d_year@7], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[c_customer_id@0 as c_customer_id, c_first_name@1 as c_first_name, c_last_name@2 as c_last_name, c_preferred_cust_flag@3 as c_preferred_cust_flag, c_birth_country@4 as c_birth_country, c_login@5 as c_login, c_email_address@6 as c_email_address, d_year@11 as d_year], aggr=[sum(web_sales.ws_ext_list_price - web_sales.ws_ext_wholesale_cost - web_sales.ws_ext_discount_amt + web_sales.ws_ext_sales_price / Some(2),20,0) as sum(web_sales.ws_ext_list_price - web_sales.ws_ext_wholesale_cost - web_sales.ws_ext_discount_amt + web_sales.ws_ext_sales_price / Int64(2))], ordering_mode=PartiallySorted([7]) + │ AggregateExec: mode=Partial, gby=[c_customer_id@0 as c_customer_id, c_first_name@1 as c_first_name, c_last_name@2 as c_last_name, c_preferred_cust_flag@3 as c_preferred_cust_flag, c_birth_country@4 as c_birth_country, c_login@5 as c_login, c_email_address@6 as c_email_address, d_year@11 as d_year], aggr=[sum(web_sales.ws_ext_list_price - web_sales.ws_ext_wholesale_cost - web_sales.ws_ext_discount_amt + web_sales.ws_ext_sales_price / 2) as sum(web_sales.ws_ext_list_price - web_sales.ws_ext_wholesale_cost - web_sales.ws_ext_discount_amt + web_sales.ws_ext_sales_price / Int64(2))], ordering_mode=PartiallySorted([7]) │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_sold_date_sk@7)], projection=[c_customer_id@2, c_first_name@3, c_last_name@4, c_preferred_cust_flag@5, c_birth_country@6, c_login@7, c_email_address@8, ws_ext_discount_amt@10, ws_ext_sales_price@11, ws_ext_wholesale_cost@12, ws_ext_list_price@13, d_year@1] │ CoalescePartitionsExec │ [Stage 21] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ws_bill_customer_sk@1)], projection=[c_customer_id@1, c_first_name@2, c_last_name@3, c_preferred_cust_flag@4, c_birth_country@5, c_login@6, c_email_address@7, ws_sold_date_sk@8, ws_ext_discount_amt@10, ws_ext_sales_price@11, ws_ext_wholesale_cost@12, ws_ext_list_price@13] │ CoalescePartitionsExec - │ [Stage 22] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 22] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_sales_price, ws_ext_wholesale_cost, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_sales_price, ws_ext_wholesale_cost, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] @@ -523,20 +507,19 @@ mod tests { ┌───── Stage 21 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2002 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] └────────────────────────────────────────────────── - ┌───── Stage 22 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 22 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── "); Ok(()) @@ -544,7 +527,7 @@ mod tests { #[tokio::test] async fn test_tpcds_5() -> Result<()> { let display = test_tpcds_query("q5").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [channel@0 ASC, id@1 ASC], fetch=100 │ SortExec: TopK(fetch=100), expr=[channel@0 ASC, id@1 ASC], preserve_partitioning=[true] @@ -577,11 +560,11 @@ mod tests { │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedUnionExec: t0:[c0(0/2)] t1:[c0(1/2)] t2:[c1(0/2)] t3:[c1(1/2)] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_store_sk@7 as store_sk, ss_sold_date_sk@0 as date_sk, ss_ext_sales_price@15 as sales_price, ss_net_profit@22 as profit, Some(0),7,2 as return_amt, Some(0),7,2 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_store_sk@7 as store_sk, ss_sold_date_sk@0 as date_sk, ss_ext_sales_price@15 as sales_price, ss_net_profit@22 as profit, Some(0),7,2 as return_amt, Some(0),7,2 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_store_sk@7 as store_sk, ss_sold_date_sk@0 as date_sk, ss_ext_sales_price@15 as sales_price, ss_net_profit@22 as profit, 0.00 as return_amt, 0.00 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_store_sk@7 as store_sk, ss_sold_date_sk@0 as date_sk, ss_ext_sales_price@15 as sales_price, ss_net_profit@22 as profit, 0.00 as return_amt, 0.00 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_store_sk@7 as store_sk, sr_returned_date_sk@0 as date_sk, Some(0),7,2 as sales_price, Some(0),7,2 as profit, sr_return_amt@11 as return_amt, sr_net_loss@19 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_store_sk@7 as store_sk, sr_returned_date_sk@0 as date_sk, Some(0),7,2 as sales_price, Some(0),7,2 as profit, sr_return_amt@11 as return_amt, sr_net_loss@19 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_store_sk@7 as store_sk, sr_returned_date_sk@0 as date_sk, 0.00 as sales_price, 0.00 as profit, sr_return_amt@11 as return_amt, sr_net_loss@19 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_store_sk@7 as store_sk, sr_returned_date_sk@0 as date_sk, 0.00 as sales_price, 0.00 as profit, sr_return_amt@11 as return_amt, sr_net_loss@19 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -594,12 +577,11 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_date@1 >= 2000-08-23 AND d_date@1 <= 2000-09-06, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-06, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-06, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-06, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-06, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-06, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-06, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-06, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-06, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-06, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-06, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-06, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-06, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-06, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-06, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-06, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-06, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ RepartitionExec: partitioning=Hash([cp_catalog_page_id@0], 3), input_partitions=3 @@ -607,12 +589,11 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(page_sk@0, cp_catalog_page_sk@0)], projection=[sales_price@1, profit@2, return_amt@3, net_loss@4, cp_catalog_page_id@6] │ CoalescePartitionsExec │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..]]}, projection=[cp_catalog_page_sk, cp_catalog_page_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_page/part-1.parquet:..]]}, projection=[cp_catalog_page_sk, cp_catalog_page_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-1.parquet:..]]}, projection=[cp_catalog_page_sk, cp_catalog_page_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_page/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_page/part-3.parquet:..]]}, projection=[cp_catalog_page_sk, cp_catalog_page_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_page/part-1.parquet:..]]}, projection=[cp_catalog_page_sk, cp_catalog_page_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-1.parquet:..]]}, projection=[cp_catalog_page_sk, cp_catalog_page_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-1.parquet:..]]}, projection=[cp_catalog_page_sk, cp_catalog_page_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_page/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_page/part-3.parquet:..]]}, projection=[cp_catalog_page_sk, cp_catalog_page_id], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -621,21 +602,20 @@ mod tests { │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedUnionExec: t0:[c0(0/2)] t1:[c0(1/2)] t2:[c1(0/2)] t3:[c1(1/2)] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_catalog_page_sk@12 as page_sk, cs_sold_date_sk@0 as date_sk, cs_ext_sales_price@23 as sales_price, cs_net_profit@33 as profit, Some(0),7,2 as return_amt, Some(0),7,2 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_catalog_page_sk@12 as page_sk, cs_sold_date_sk@0 as date_sk, cs_ext_sales_price@23 as sales_price, cs_net_profit@33 as profit, Some(0),7,2 as return_amt, Some(0),7,2 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_catalog_page_sk@12 as page_sk, cs_sold_date_sk@0 as date_sk, cs_ext_sales_price@23 as sales_price, cs_net_profit@33 as profit, 0.00 as return_amt, 0.00 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_catalog_page_sk@12 as page_sk, cs_sold_date_sk@0 as date_sk, cs_ext_sales_price@23 as sales_price, cs_net_profit@33 as profit, 0.00 as return_amt, 0.00 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_catalog_page_sk@12 as page_sk, cr_returned_date_sk@0 as date_sk, Some(0),7,2 as sales_price, Some(0),7,2 as profit, cr_return_amount@18 as return_amt, cr_net_loss@26 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_catalog_page_sk@12 as page_sk, cr_returned_date_sk@0 as date_sk, Some(0),7,2 as sales_price, Some(0),7,2 as profit, cr_return_amount@18 as return_amt, cr_net_loss@26 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_catalog_page_sk@12 as page_sk, cr_returned_date_sk@0 as date_sk, 0.00 as sales_price, 0.00 as profit, cr_return_amount@18 as return_amt, cr_net_loss@26 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_catalog_page_sk@12 as page_sk, cr_returned_date_sk@0 as date_sk, 0.00 as sales_price, 0.00 as profit, cr_return_amount@18 as return_amt, cr_net_loss@26 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_date@1 >= 2000-08-23 AND d_date@1 <= 2000-09-06, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-06, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-06, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-06, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-06, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-06, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-06, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-06, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-06, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-06, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-06, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-06, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-06, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-06, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-06, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-06, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-06, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 11 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ RepartitionExec: partitioning=Hash([web_site_id@0], 3), input_partitions=3 @@ -648,9 +628,9 @@ mod tests { │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedUnionExec: t0:[c0(0/2)] t1:[c0(1/2)] t2:[c1(0/2)] t3:[c1(1/2)] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_web_site_sk@13 as wsr_web_site_sk, ws_sold_date_sk@0 as date_sk, ws_ext_sales_price@23 as sales_price, ws_net_profit@33 as profit, Some(0),7,2 as return_amt, Some(0),7,2 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_web_site_sk@13 as wsr_web_site_sk, ws_sold_date_sk@0 as date_sk, ws_ext_sales_price@23 as sales_price, ws_net_profit@33 as profit, Some(0),7,2 as return_amt, Some(0),7,2 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ ProjectionExec: expr=[ws_web_site_sk@0 as wsr_web_site_sk, wr_returned_date_sk@1 as date_sk, Some(0),7,2 as sales_price, Some(0),7,2 as profit, wr_return_amt@2 as return_amt, wr_net_loss@3 as net_loss] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_web_site_sk@13 as wsr_web_site_sk, ws_sold_date_sk@0 as date_sk, ws_ext_sales_price@23 as sales_price, ws_net_profit@33 as profit, 0.00 as return_amt, 0.00 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_web_site_sk@13 as wsr_web_site_sk, ws_sold_date_sk@0 as date_sk, ws_ext_sales_price@23 as sales_price, ws_net_profit@33 as profit, 0.00 as return_amt, 0.00 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ ProjectionExec: expr=[ws_web_site_sk@0 as wsr_web_site_sk, wr_returned_date_sk@1 as date_sk, 0.00 as sales_price, 0.00 as profit, wr_return_amt@2 as return_amt, wr_net_loss@3 as net_loss] │ HashJoinExec: mode=Partitioned, join_type=Left, on=[(wr_item_sk@1, ws_item_sk@0), (wr_order_number@2, ws_order_number@2)], projection=[ws_web_site_sk@6, wr_returned_date_sk@0, wr_return_amt@3, wr_net_loss@4] │ [Stage 9] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ [Stage 10] => NetworkShuffleExec: output_partitions=3, input_tasks=4 @@ -666,20 +646,19 @@ mod tests { ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_date@1 >= 2000-08-23 AND d_date@1 <= 2000-09-06, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-06, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-06, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-06, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-06, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-06, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-06, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-06, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-06, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-06, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-06, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-06, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-06, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-06, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-06, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-06, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-06, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 9 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] - │ RepartitionExec: partitioning=Hash([wr_item_sk@1, wr_order_number@2], 6), input_partitions=2 + │ RepartitionExec: partitioning=Hash([wr_item_sk@1, wr_order_number@2], 6), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_order_number, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_order_number, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_order_number, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_order_number, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_order_number, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_order_number, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_order_number, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_order_number, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 10 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([ws_item_sk@0, ws_order_number@2], 6), input_partitions=3 @@ -695,115 +674,114 @@ mod tests { #[tokio::test] async fn test_tpcds_6() -> Result<()> { let display = test_tpcds_query("q6").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [cnt@1 ASC, state@0 ASC], fetch=100 - │ SortExec: TopK(fetch=100), expr=[cnt@1 ASC, state@0 ASC], preserve_partitioning=[true] - │ ProjectionExec: expr=[ca_state@0 as state, count(Int64(1))@1 as cnt] - │ FilterExec: count(Int64(1))@1 >= 10 - │ AggregateExec: mode=FinalPartitioned, gby=[ca_state@0 as ca_state], aggr=[count(Int64(1))] - │ [Stage 9] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 10] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 └────────────────────────────────────────────────── - ┌───── Stage 9 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] - │ RepartitionExec: partitioning=Hash([ca_state@0], 3), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[ca_state@0 as ca_state], aggr=[count(Int64(1))] - │ FilterExec: CAST(i_current_price@1 AS Decimal128(30, 15)) > CAST(1.2 * avg(j.i_current_price)@2 AS Decimal128(30, 15)), projection=[ca_state@0] - │ HashJoinExec: mode=CollectLeft, join_type=Right, on=[(i_category@1, i_category@2)], projection=[ca_state@2, i_current_price@3, avg(j.i_current_price)@0] - │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=2 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_month_seq@0, d_month_seq@1)], projection=[ca_state@1, i_current_price@3, i_category@4] - │ CoalescePartitionsExec - │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=1 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@1)], projection=[ca_state@3, d_month_seq@5, i_current_price@1, i_category@2] - │ CoalescePartitionsExec - │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@1)], projection=[ca_state@2, ss_item_sk@4, d_month_seq@1] - │ CoalescePartitionsExec - │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@1, ss_customer_sk@2)], projection=[ca_state@0, ss_sold_date_sk@2, ss_item_sk@3] - │ CoalescePartitionsExec - │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + ┌───── Stage 10 ── Tasks: t0:[p0..p2] t1:[p0..p2] + │ SortExec: TopK(fetch=100), expr=[cnt@1 ASC, state@0 ASC], preserve_partitioning=[true] + │ ProjectionExec: expr=[ca_state@0 as state, count(Int64(1))@1 as cnt] + │ FilterExec: count(Int64(1))@1 >= 10 + │ AggregateExec: mode=FinalPartitioned, gby=[ca_state@0 as ca_state], aggr=[count(Int64(1))] + │ [Stage 9] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ ProjectionExec: expr=[CAST(avg(j.i_current_price)@1 AS Float64) as avg(j.i_current_price), i_category@0 as i_category] - │ AggregateExec: mode=FinalPartitioned, gby=[i_category@0 as i_category], aggr=[avg(j.i_current_price)] - │ [Stage 1] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + ┌───── Stage 9 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] + │ RepartitionExec: partitioning=Hash([ca_state@0], 6), input_partitions=3 + │ AggregateExec: mode=Partial, gby=[ca_state@0 as ca_state], aggr=[count(Int64(1))] + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(i_category@1, i_category@2)], filter=CAST(i_current_price@0 AS Decimal128(30, 15)) > CAST(1.2 * avg(j.i_current_price)@1 AS Decimal128(30, 15)), projection=[ca_state@0] + │ CoalescePartitionsExec + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=2 + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_month_seq@0, d_month_seq@1)], projection=[ca_state@1, i_current_price@3, i_category@4] + │ CoalescePartitionsExec + │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=1 + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@1)], projection=[ca_state@3, d_month_seq@5, i_current_price@1, i_category@2] + │ CoalescePartitionsExec + │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@1)], projection=[ca_state@2, ss_item_sk@4, d_month_seq@1] + │ CoalescePartitionsExec + │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@1, ss_customer_sk@2)], projection=[ca_state@0, ss_sold_date_sk@2, ss_item_sk@3] + │ CoalescePartitionsExec + │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] - │ RepartitionExec: partitioning=Hash([i_category@0], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[i_category@1 as i_category], aggr=[avg(j.i_current_price)] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_current_price, i_category], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_current_price, i_category], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_current_price, i_category], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_current_price, i_category], file_type=parquet + ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ ProjectionExec: expr=[CAST(avg(j.i_current_price)@1 AS Float64) as avg(j.i_current_price), i_category@0 as i_category] + │ AggregateExec: mode=FinalPartitioned, gby=[i_category@0 as i_category], aggr=[avg(j.i_current_price)] + │ [Stage 1] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 4 ── Tasks: t0:[p0..p11] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ AggregateExec: mode=FinalPartitioned, gby=[d_month_seq@0 as d_month_seq], aggr=[] - │ [Stage 3] => NetworkShuffleExec: output_partitions=3, input_tasks=4 - └────────────────────────────────────────────────── - ┌───── Stage 3 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] - │ RepartitionExec: partitioning=Hash([d_month_seq@0], 3), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[d_month_seq@0 as d_month_seq], aggr=[] - │ FilterExec: d_year@1 = 2001 AND d_moy@2 = 1, projection=[d_month_seq@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_month_seq, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_moy in (1), d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_month_seq, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_moy in (1), d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_month_seq, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_moy in (1), d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_month_seq, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_moy in (1), d_year in (2001)] + ┌───── Stage 1 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] + │ RepartitionExec: partitioning=Hash([i_category@0], 6), input_partitions=3 + │ AggregateExec: mode=Partial, gby=[i_category@1 as i_category], aggr=[avg(j.i_current_price)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_current_price, i_category], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_current_price, i_category], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_current_price, i_category], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_current_price, i_category], file_type=parquet + └────────────────────────────────────────────────── + ┌───── Stage 4 ── Tasks: t0:[p0..p11] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ AggregateExec: mode=FinalPartitioned, gby=[d_month_seq@0 as d_month_seq], aggr=[] + │ [Stage 3] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 5 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_category], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_category], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_category], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_current_price, i_category], file_type=parquet - └────────────────────────────────────────────────── - ┌───── Stage 6 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - └────────────────────────────────────────────────── - ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, c_current_addr_sk@1)], projection=[ca_state@1, c_customer_sk@2] - │ CoalescePartitionsExec - │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - └────────────────────────────────────────────────── - ┌───── Stage 7 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 3 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] + │ RepartitionExec: partitioning=Hash([d_month_seq@0], 3), input_partitions=3 + │ AggregateExec: mode=Partial, gby=[d_month_seq@0 as d_month_seq], aggr=[] + │ FilterExec: d_year@1 = 2001 AND d_moy@2 = 1, projection=[d_month_seq@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_month_seq, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_moy in (1), d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_month_seq, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_moy in (1), d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_month_seq, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_moy in (1), d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_month_seq, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_moy in (1), d_year in (2001)] + └────────────────────────────────────────────────── + ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_category], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_category], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_current_price, i_category], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_current_price, i_category], file_type=parquet, predicate=DynamicFilter [ empty ] + └────────────────────────────────────────────────── + ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + └────────────────────────────────────────────────── + ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, c_current_addr_sk@1)], projection=[ca_state@1, c_customer_sk@2] + │ CoalescePartitionsExec + │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── + ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet + └────────────────────────────────────────────────── "); Ok(()) } #[tokio::test] async fn test_tpcds_7() -> Result<()> { let display = test_tpcds_query("q7").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [i_item_id@0 ASC NULLS LAST], fetch=100 │ [Stage 7] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -822,7 +800,7 @@ mod tests { │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@0)], projection=[ss_promo_sk@3, ss_quantity@4, ss_list_price@5, ss_sales_price@6, ss_coupon_amt@7, i_item_id@1] │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_item_sk@2, ss_promo_sk@3, ss_quantity@4, ss_list_price@5, ss_sales_price@6, ss_coupon_amt@7] │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -840,23 +818,22 @@ mod tests { │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/promotion/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/promotion/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/promotion/part-1.parquet:..]]}, projection=[p_promo_sk, p_channel_email, p_channel_event], file_type=parquet, predicate=p_channel_email@9 = N OR p_channel_event@14 = N, pruning_predicate=p_channel_email_null_count@2 != row_count@3 AND p_channel_email_min@0 <= N AND N <= p_channel_email_max@1 OR p_channel_event_null_count@6 != row_count@3 AND p_channel_event_min@4 <= N AND N <= p_channel_event_max@5, required_guarantees=[] │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/promotion/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/promotion/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/promotion/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/promotion/part-3.parquet:..]]}, projection=[p_promo_sk, p_channel_email, p_channel_event], file_type=parquet, predicate=p_channel_email@9 = N OR p_channel_event@14 = N, pruning_predicate=p_channel_email_null_count@2 != row_count@3 AND p_channel_email_min@0 <= N AND N <= p_channel_email_max@1 OR p_channel_event_null_count@6 != row_count@3 AND p_channel_event_min@4 <= N AND N <= p_channel_event_max@5, required_guarantees=[] └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2000, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cd_demo_sk@0], 12), input_partitions=3 @@ -865,7 +842,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_cdemo_sk@2], 12), input_partitions=3 @@ -881,7 +858,7 @@ mod tests { #[tokio::test] async fn test_tpcds_8() -> Result<()> { let display = test_tpcds_query("q8").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [s_store_name@0 ASC NULLS LAST], fetch=100 │ [Stage 8] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -927,12 +904,11 @@ mod tests { │ AggregateExec: mode=Partial, gby=[ca_zip@0 as ca_zip], aggr=[] │ ProjectionExec: expr=[substr(ca_zip@0, 1, 5) as ca_zip] │ FilterExec: substr(ca_zip@0, 1, 5) IN (SET) ([24128, 76232, 65084, 87816, 83926, 77556, 20548, 26231, 43848, 15126, 91137, 61265, 98294, 25782, 17920, 18426, 98235, 40081, 84093, 28577, 55565, 17183, 54601, 67897, 22752, 86284, 18376, 38607, 45200, 21756, 29741, 96765, 23932, 89360, 29839, 25989, 28898, 91068, 72550, 10390, 18845, 47770, 82636, 41367, 76638, 86198, 81312, 37126, 39192, 88424, 72175, 81426, 53672, 10445, 42666, 66864, 66708, 41248, 48583, 82276, 18842, 78890, 49448, 14089, 38122, 34425, 79077, 19849, 43285, 39861, 66162, 77610, 13695, 99543, 83444, 83041, 12305, 57665, 68341, 25003, 57834, 62878, 49130, 81096, 18840, 27700, 23470, 50412, 21195, 16021, 76107, 71954, 68309, 18119, 98359, 64544, 10336, 86379, 27068, 39736, 98569, 28915, 24206, 56529, 57647, 54917, 42961, 91110, 63981, 14922, 36420, 23006, 67467, 32754, 30903, 20260, 31671, 51798, 72325, 85816, 68621, 13955, 36446, 41766, 68806, 16725, 15146, 22744, 35850, 88086, 51649, 18270, 52867, 39972, 96976, 63792, 11376, 94898, 13595, 10516, 90225, 58943, 39371, 94945, 28587, 96576, 57855, 28488, 26105, 83933, 25858, 34322, 44438, 73171, 30122, 34102, 22685, 71256, 78451, 54364, 13354, 45375, 40558, 56458, 28286, 45266, 47305, 69399, 83921, 26233, 11101, 15371, 69913, 35942, 15882, 25631, 24610, 44165, 99076, 33786, 70738, 26653, 14328, 72305, 62496, 22152, 10144, 64147, 48425, 14663, 21076, 18799, 30450, 63089, 81019, 68893, 24996, 51200, 51211, 45692, 92712, 70466, 79994, 22437, 25280, 38935, 71791, 73134, 56571, 14060, 19505, 72425, 56575, 74351, 68786, 51650, 20004, 18383, 76614, 11634, 18906, 15765, 41368, 73241, 76698, 78567, 97189, 28545, 76231, 75691, 22246, 51061, 90578, 56691, 68014, 51103, 94167, 57047, 14867, 73520, 15734, 63435, 25733, 35474, 24676, 94627, 53535, 17879, 15559, 53268, 59166, 11928, 59402, 33282, 45721, 43933, 68101, 33515, 36634, 71286, 19736, 58058, 55253, 67473, 41918, 19515, 36495, 19430, 22351, 77191, 91393, 49156, 50298, 87501, 18652, 53179, 18767, 63193, 23968, 65164, 68880, 21286, 72823, 58470, 67301, 13394, 31016, 70372, 67030, 40604, 24317, 45748, 39127, 26065, 77721, 31029, 31880, 60576, 24671, 45549, 13376, 50016, 33123, 19769, 22927, 97789, 46081, 72151, 15723, 46136, 51949, 68100, 96888, 64528, 14171, 79777, 28709, 11489, 25103, 32213, 78668, 22245, 15798, 27156, 37930, 62971, 21337, 51622, 67853, 10567, 38415, 15455, 58263, 42029, 60279, 37125, 56240, 88190, 50308, 26859, 64457, 89091, 82136, 62377, 36233, 63837, 58078, 17043, 30010, 60099, 28810, 98025, 29178, 87343, 73273, 30469, 64034, 39516, 86057, 21309, 90257, 67875, 40162, 11356, 73650, 61810, 72013, 30431, 22461, 19512, 13375, 55307, 30625, 83849, 68908, 26689, 96451, 38193, 46820, 88885, 84935, 69035, 83144, 47537, 56616, 94983, 48033, 69952, 25486, 61547, 27385, 61860, 58048, 56910, 16807, 17871, 35258, 31387, 35458, 35576]) - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_zip], file_type=parquet, predicate=substr(ca_zip@9, 1, 5) IN (SET) ([24128, 76232, 65084, 87816, 83926, 77556, 20548, 26231, 43848, 15126, 91137, 61265, 98294, 25782, 17920, 18426, 98235, 40081, 84093, 28577, 55565, 17183, 54601, 67897, 22752, 86284, 18376, 38607, 45200, 21756, 29741, 96765, 23932, 89360, 29839, 25989, 28898, 91068, 72550, 10390, 18845, 47770, 82636, 41367, 76638, 86198, 81312, 37126, 39192, 88424, 72175, 81426, 53672, 10445, 42666, 66864, 66708, 41248, 48583, 82276, 18842, 78890, 49448, 14089, 38122, 34425, 79077, 19849, 43285, 39861, 66162, 77610, 13695, 99543, 83444, 83041, 12305, 57665, 68341, 25003, 57834, 62878, 49130, 81096, 18840, 27700, 23470, 50412, 21195, 16021, 76107, 71954, 68309, 18119, 98359, 64544, 10336, 86379, 27068, 39736, 98569, 28915, 24206, 56529, 57647, 54917, 42961, 91110, 63981, 14922, 36420, 23006, 67467, 32754, 30903, 20260, 31671, 51798, 72325, 85816, 68621, 13955, 36446, 41766, 68806, 16725, 15146, 22744, 35850, 88086, 51649, 18270, 52867, 39972, 96976, 63792, 11376, 94898, 13595, 10516, 90225, 58943, 39371, 94945, 28587, 96576, 57855, 28488, 26105, 83933, 25858, 34322, 44438, 73171, 30122, 34102, 22685, 71256, 78451, 54364, 13354, 45375, 40558, 56458, 28286, 45266, 47305, 69399, 83921, 26233, 11101, 15371, 69913, 35942, 15882, 25631, 24610, 44165, 99076, 33786, 70738, 26653, 14328, 72305, 62496, 22152, 10144, 64147, 48425, 14663, 21076, 18799, 30450, 63089, 81019, 68893, 24996, 51200, 51211, 45692, 92712, 70466, 79994, 22437, 25280, 38935, 71791, 73134, 56571, 14060, 19505, 72425, 56575, 74351, 68786, 51650, 20004, 18383, 76614, 11634, 18906, 15765, 41368, 73241, 76698, 78567, 97189, 28545, 76231, 75691, 22246, 51061, 90578, 56691, 68014, 51103, 94167, 57047, 14867, 73520, 15734, 63435, 25733, 35474, 24676, 94627, 53535, 17879, 15559, 53268, 59166, 11928, 59402, 33282, 45721, 43933, 68101, 33515, 36634, 71286, 19736, 58058, 55253, 67473, 41918, 19515, 36495, 19430, 22351, 77191, 91393, 49156, 50298, 87501, 18652, 53179, 18767, 63193, 23968, 65164, 68880, 21286, 72823, 58470, 67301, 13394, 31016, 70372, 67030, 40604, 24317, 45748, 39127, 26065, 77721, 31029, 31880, 60576, 24671, 45549, 13376, 50016, 33123, 19769, 22927, 97789, 46081, 72151, 15723, 46136, 51949, 68100, 96888, 64528, 14171, 79777, 28709, 11489, 25103, 32213, 78668, 22245, 15798, 27156, 37930, 62971, 21337, 51622, 67853, 10567, 38415, 15455, 58263, 42029, 60279, 37125, 56240, 88190, 50308, 26859, 64457, 89091, 82136, 62377, 36233, 63837, 58078, 17043, 30010, 60099, 28810, 98025, 29178, 87343, 73273, 30469, 64034, 39516, 86057, 21309, 90257, 67875, 40162, 11356, 73650, 61810, 72013, 30431, 22461, 19512, 13375, 55307, 30625, 83849, 68908, 26689, 96451, 38193, 46820, 88885, 84935, 69035, 83144, 47537, 56616, 94983, 48033, 69952, 25486, 61547, 27385, 61860, 58048, 56910, 16807, 17871, 35258, 31387, 35458, 35576]) - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_zip], file_type=parquet, predicate=substr(ca_zip@9, 1, 5) IN (SET) ([24128, 76232, 65084, 87816, 83926, 77556, 20548, 26231, 43848, 15126, 91137, 61265, 98294, 25782, 17920, 18426, 98235, 40081, 84093, 28577, 55565, 17183, 54601, 67897, 22752, 86284, 18376, 38607, 45200, 21756, 29741, 96765, 23932, 89360, 29839, 25989, 28898, 91068, 72550, 10390, 18845, 47770, 82636, 41367, 76638, 86198, 81312, 37126, 39192, 88424, 72175, 81426, 53672, 10445, 42666, 66864, 66708, 41248, 48583, 82276, 18842, 78890, 49448, 14089, 38122, 34425, 79077, 19849, 43285, 39861, 66162, 77610, 13695, 99543, 83444, 83041, 12305, 57665, 68341, 25003, 57834, 62878, 49130, 81096, 18840, 27700, 23470, 50412, 21195, 16021, 76107, 71954, 68309, 18119, 98359, 64544, 10336, 86379, 27068, 39736, 98569, 28915, 24206, 56529, 57647, 54917, 42961, 91110, 63981, 14922, 36420, 23006, 67467, 32754, 30903, 20260, 31671, 51798, 72325, 85816, 68621, 13955, 36446, 41766, 68806, 16725, 15146, 22744, 35850, 88086, 51649, 18270, 52867, 39972, 96976, 63792, 11376, 94898, 13595, 10516, 90225, 58943, 39371, 94945, 28587, 96576, 57855, 28488, 26105, 83933, 25858, 34322, 44438, 73171, 30122, 34102, 22685, 71256, 78451, 54364, 13354, 45375, 40558, 56458, 28286, 45266, 47305, 69399, 83921, 26233, 11101, 15371, 69913, 35942, 15882, 25631, 24610, 44165, 99076, 33786, 70738, 26653, 14328, 72305, 62496, 22152, 10144, 64147, 48425, 14663, 21076, 18799, 30450, 63089, 81019, 68893, 24996, 51200, 51211, 45692, 92712, 70466, 79994, 22437, 25280, 38935, 71791, 73134, 56571, 14060, 19505, 72425, 56575, 74351, 68786, 51650, 20004, 18383, 76614, 11634, 18906, 15765, 41368, 73241, 76698, 78567, 97189, 28545, 76231, 75691, 22246, 51061, 90578, 56691, 68014, 51103, 94167, 57047, 14867, 73520, 15734, 63435, 25733, 35474, 24676, 94627, 53535, 17879, 15559, 53268, 59166, 11928, 59402, 33282, 45721, 43933, 68101, 33515, 36634, 71286, 19736, 58058, 55253, 67473, 41918, 19515, 36495, 19430, 22351, 77191, 91393, 49156, 50298, 87501, 18652, 53179, 18767, 63193, 23968, 65164, 68880, 21286, 72823, 58470, 67301, 13394, 31016, 70372, 67030, 40604, 24317, 45748, 39127, 26065, 77721, 31029, 31880, 60576, 24671, 45549, 13376, 50016, 33123, 19769, 22927, 97789, 46081, 72151, 15723, 46136, 51949, 68100, 96888, 64528, 14171, 79777, 28709, 11489, 25103, 32213, 78668, 22245, 15798, 27156, 37930, 62971, 21337, 51622, 67853, 10567, 38415, 15455, 58263, 42029, 60279, 37125, 56240, 88190, 50308, 26859, 64457, 89091, 82136, 62377, 36233, 63837, 58078, 17043, 30010, 60099, 28810, 98025, 29178, 87343, 73273, 30469, 64034, 39516, 86057, 21309, 90257, 67875, 40162, 11356, 73650, 61810, 72013, 30431, 22461, 19512, 13375, 55307, 30625, 83849, 68908, 26689, 96451, 38193, 46820, 88885, 84935, 69035, 83144, 47537, 56616, 94983, 48033, 69952, 25486, 61547, 27385, 61860, 58048, 56910, 16807, 17871, 35258, 31387, 35458, 35576]) - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_zip], file_type=parquet, predicate=substr(ca_zip@9, 1, 5) IN (SET) ([24128, 76232, 65084, 87816, 83926, 77556, 20548, 26231, 43848, 15126, 91137, 61265, 98294, 25782, 17920, 18426, 98235, 40081, 84093, 28577, 55565, 17183, 54601, 67897, 22752, 86284, 18376, 38607, 45200, 21756, 29741, 96765, 23932, 89360, 29839, 25989, 28898, 91068, 72550, 10390, 18845, 47770, 82636, 41367, 76638, 86198, 81312, 37126, 39192, 88424, 72175, 81426, 53672, 10445, 42666, 66864, 66708, 41248, 48583, 82276, 18842, 78890, 49448, 14089, 38122, 34425, 79077, 19849, 43285, 39861, 66162, 77610, 13695, 99543, 83444, 83041, 12305, 57665, 68341, 25003, 57834, 62878, 49130, 81096, 18840, 27700, 23470, 50412, 21195, 16021, 76107, 71954, 68309, 18119, 98359, 64544, 10336, 86379, 27068, 39736, 98569, 28915, 24206, 56529, 57647, 54917, 42961, 91110, 63981, 14922, 36420, 23006, 67467, 32754, 30903, 20260, 31671, 51798, 72325, 85816, 68621, 13955, 36446, 41766, 68806, 16725, 15146, 22744, 35850, 88086, 51649, 18270, 52867, 39972, 96976, 63792, 11376, 94898, 13595, 10516, 90225, 58943, 39371, 94945, 28587, 96576, 57855, 28488, 26105, 83933, 25858, 34322, 44438, 73171, 30122, 34102, 22685, 71256, 78451, 54364, 13354, 45375, 40558, 56458, 28286, 45266, 47305, 69399, 83921, 26233, 11101, 15371, 69913, 35942, 15882, 25631, 24610, 44165, 99076, 33786, 70738, 26653, 14328, 72305, 62496, 22152, 10144, 64147, 48425, 14663, 21076, 18799, 30450, 63089, 81019, 68893, 24996, 51200, 51211, 45692, 92712, 70466, 79994, 22437, 25280, 38935, 71791, 73134, 56571, 14060, 19505, 72425, 56575, 74351, 68786, 51650, 20004, 18383, 76614, 11634, 18906, 15765, 41368, 73241, 76698, 78567, 97189, 28545, 76231, 75691, 22246, 51061, 90578, 56691, 68014, 51103, 94167, 57047, 14867, 73520, 15734, 63435, 25733, 35474, 24676, 94627, 53535, 17879, 15559, 53268, 59166, 11928, 59402, 33282, 45721, 43933, 68101, 33515, 36634, 71286, 19736, 58058, 55253, 67473, 41918, 19515, 36495, 19430, 22351, 77191, 91393, 49156, 50298, 87501, 18652, 53179, 18767, 63193, 23968, 65164, 68880, 21286, 72823, 58470, 67301, 13394, 31016, 70372, 67030, 40604, 24317, 45748, 39127, 26065, 77721, 31029, 31880, 60576, 24671, 45549, 13376, 50016, 33123, 19769, 22927, 97789, 46081, 72151, 15723, 46136, 51949, 68100, 96888, 64528, 14171, 79777, 28709, 11489, 25103, 32213, 78668, 22245, 15798, 27156, 37930, 62971, 21337, 51622, 67853, 10567, 38415, 15455, 58263, 42029, 60279, 37125, 56240, 88190, 50308, 26859, 64457, 89091, 82136, 62377, 36233, 63837, 58078, 17043, 30010, 60099, 28810, 98025, 29178, 87343, 73273, 30469, 64034, 39516, 86057, 21309, 90257, 67875, 40162, 11356, 73650, 61810, 72013, 30431, 22461, 19512, 13375, 55307, 30625, 83849, 68908, 26689, 96451, 38193, 46820, 88885, 84935, 69035, 83144, 47537, 56616, 94983, 48033, 69952, 25486, 61547, 27385, 61860, 58048, 56910, 16807, 17871, 35258, 31387, 35458, 35576]) - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_zip], file_type=parquet, predicate=substr(ca_zip@9, 1, 5) IN (SET) ([24128, 76232, 65084, 87816, 83926, 77556, 20548, 26231, 43848, 15126, 91137, 61265, 98294, 25782, 17920, 18426, 98235, 40081, 84093, 28577, 55565, 17183, 54601, 67897, 22752, 86284, 18376, 38607, 45200, 21756, 29741, 96765, 23932, 89360, 29839, 25989, 28898, 91068, 72550, 10390, 18845, 47770, 82636, 41367, 76638, 86198, 81312, 37126, 39192, 88424, 72175, 81426, 53672, 10445, 42666, 66864, 66708, 41248, 48583, 82276, 18842, 78890, 49448, 14089, 38122, 34425, 79077, 19849, 43285, 39861, 66162, 77610, 13695, 99543, 83444, 83041, 12305, 57665, 68341, 25003, 57834, 62878, 49130, 81096, 18840, 27700, 23470, 50412, 21195, 16021, 76107, 71954, 68309, 18119, 98359, 64544, 10336, 86379, 27068, 39736, 98569, 28915, 24206, 56529, 57647, 54917, 42961, 91110, 63981, 14922, 36420, 23006, 67467, 32754, 30903, 20260, 31671, 51798, 72325, 85816, 68621, 13955, 36446, 41766, 68806, 16725, 15146, 22744, 35850, 88086, 51649, 18270, 52867, 39972, 96976, 63792, 11376, 94898, 13595, 10516, 90225, 58943, 39371, 94945, 28587, 96576, 57855, 28488, 26105, 83933, 25858, 34322, 44438, 73171, 30122, 34102, 22685, 71256, 78451, 54364, 13354, 45375, 40558, 56458, 28286, 45266, 47305, 69399, 83921, 26233, 11101, 15371, 69913, 35942, 15882, 25631, 24610, 44165, 99076, 33786, 70738, 26653, 14328, 72305, 62496, 22152, 10144, 64147, 48425, 14663, 21076, 18799, 30450, 63089, 81019, 68893, 24996, 51200, 51211, 45692, 92712, 70466, 79994, 22437, 25280, 38935, 71791, 73134, 56571, 14060, 19505, 72425, 56575, 74351, 68786, 51650, 20004, 18383, 76614, 11634, 18906, 15765, 41368, 73241, 76698, 78567, 97189, 28545, 76231, 75691, 22246, 51061, 90578, 56691, 68014, 51103, 94167, 57047, 14867, 73520, 15734, 63435, 25733, 35474, 24676, 94627, 53535, 17879, 15559, 53268, 59166, 11928, 59402, 33282, 45721, 43933, 68101, 33515, 36634, 71286, 19736, 58058, 55253, 67473, 41918, 19515, 36495, 19430, 22351, 77191, 91393, 49156, 50298, 87501, 18652, 53179, 18767, 63193, 23968, 65164, 68880, 21286, 72823, 58470, 67301, 13394, 31016, 70372, 67030, 40604, 24317, 45748, 39127, 26065, 77721, 31029, 31880, 60576, 24671, 45549, 13376, 50016, 33123, 19769, 22927, 97789, 46081, 72151, 15723, 46136, 51949, 68100, 96888, 64528, 14171, 79777, 28709, 11489, 25103, 32213, 78668, 22245, 15798, 27156, 37930, 62971, 21337, 51622, 67853, 10567, 38415, 15455, 58263, 42029, 60279, 37125, 56240, 88190, 50308, 26859, 64457, 89091, 82136, 62377, 36233, 63837, 58078, 17043, 30010, 60099, 28810, 98025, 29178, 87343, 73273, 30469, 64034, 39516, 86057, 21309, 90257, 67875, 40162, 11356, 73650, 61810, 72013, 30431, 22461, 19512, 13375, 55307, 30625, 83849, 68908, 26689, 96451, 38193, 46820, 88885, 84935, 69035, 83144, 47537, 56616, 94983, 48033, 69952, 25486, 61547, 27385, 61860, 58048, 56910, 16807, 17871, 35258, 31387, 35458, 35576]) + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_zip], file_type=parquet, predicate=substr(ca_zip@9, 1, 5) IN (SET) ([24128, 76232, 65084, 87816, 83926, 77556, 20548, 26231, 43848, 15126, 91137, 61265, 98294, 25782, 17920, 18426, 98235, 40081, 84093, 28577, 55565, 17183, 54601, 67897, 22752, 86284, 18376, 38607, 45200, 21756, 29741, 96765, 23932, 89360, 29839, 25989, 28898, 91068, 72550, 10390, 18845, 47770, 82636, 41367, 76638, 86198, 81312, 37126, 39192, 88424, 72175, 81426, 53672, 10445, 42666, 66864, 66708, 41248, 48583, 82276, 18842, 78890, 49448, 14089, 38122, 34425, 79077, 19849, 43285, 39861, 66162, 77610, 13695, 99543, 83444, 83041, 12305, 57665, 68341, 25003, 57834, 62878, 49130, 81096, 18840, 27700, 23470, 50412, 21195, 16021, 76107, 71954, 68309, 18119, 98359, 64544, 10336, 86379, 27068, 39736, 98569, 28915, 24206, 56529, 57647, 54917, 42961, 91110, 63981, 14922, 36420, 23006, 67467, 32754, 30903, 20260, 31671, 51798, 72325, 85816, 68621, 13955, 36446, 41766, 68806, 16725, 15146, 22744, 35850, 88086, 51649, 18270, 52867, 39972, 96976, 63792, 11376, 94898, 13595, 10516, 90225, 58943, 39371, 94945, 28587, 96576, 57855, 28488, 26105, 83933, 25858, 34322, 44438, 73171, 30122, 34102, 22685, 71256, 78451, 54364, 13354, 45375, 40558, 56458, 28286, 45266, 47305, 69399, 83921, 26233, 11101, 15371, 69913, 35942, 15882, 25631, 24610, 44165, 99076, 33786, 70738, 26653, 14328, 72305, 62496, 22152, 10144, 64147, 48425, 14663, 21076, 18799, 30450, 63089, 81019, 68893, 24996, 51200, 51211, 45692, 92712, 70466, 79994, 22437, 25280, 38935, 71791, 73134, 56571, 14060, 19505, 72425, 56575, 74351, 68786, 51650, 20004, 18383, 76614, 11634, 18906, 15765, 41368, 73241, 76698, 78567, 97189, 28545, 76231, 75691, 22246, 51061, 90578, 56691, 68014, 51103, 94167, 57047, 14867, 73520, 15734, 63435, 25733, 35474, 24676, 94627, 53535, 17879, 15559, 53268, 59166, 11928, 59402, 33282, 45721, 43933, 68101, 33515, 36634, 71286, 19736, 58058, 55253, 67473, 41918, 19515, 36495, 19430, 22351, 77191, 91393, 49156, 50298, 87501, 18652, 53179, 18767, 63193, 23968, 65164, 68880, 21286, 72823, 58470, 67301, 13394, 31016, 70372, 67030, 40604, 24317, 45748, 39127, 26065, 77721, 31029, 31880, 60576, 24671, 45549, 13376, 50016, 33123, 19769, 22927, 97789, 46081, 72151, 15723, 46136, 51949, 68100, 96888, 64528, 14171, 79777, 28709, 11489, 25103, 32213, 78668, 22245, 15798, 27156, 37930, 62971, 21337, 51622, 67853, 10567, 38415, 15455, 58263, 42029, 60279, 37125, 56240, 88190, 50308, 26859, 64457, 89091, 82136, 62377, 36233, 63837, 58078, 17043, 30010, 60099, 28810, 98025, 29178, 87343, 73273, 30469, 64034, 39516, 86057, 21309, 90257, 67875, 40162, 11356, 73650, 61810, 72013, 30431, 22461, 19512, 13375, 55307, 30625, 83849, 68908, 26689, 96451, 38193, 46820, 88885, 84935, 69035, 83144, 47537, 56616, 94983, 48033, 69952, 25486, 61547, 27385, 61860, 58048, 56910, 16807, 17871, 35258, 31387, 35458, 35576]) + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_zip], file_type=parquet, predicate=substr(ca_zip@9, 1, 5) IN (SET) ([24128, 76232, 65084, 87816, 83926, 77556, 20548, 26231, 43848, 15126, 91137, 61265, 98294, 25782, 17920, 18426, 98235, 40081, 84093, 28577, 55565, 17183, 54601, 67897, 22752, 86284, 18376, 38607, 45200, 21756, 29741, 96765, 23932, 89360, 29839, 25989, 28898, 91068, 72550, 10390, 18845, 47770, 82636, 41367, 76638, 86198, 81312, 37126, 39192, 88424, 72175, 81426, 53672, 10445, 42666, 66864, 66708, 41248, 48583, 82276, 18842, 78890, 49448, 14089, 38122, 34425, 79077, 19849, 43285, 39861, 66162, 77610, 13695, 99543, 83444, 83041, 12305, 57665, 68341, 25003, 57834, 62878, 49130, 81096, 18840, 27700, 23470, 50412, 21195, 16021, 76107, 71954, 68309, 18119, 98359, 64544, 10336, 86379, 27068, 39736, 98569, 28915, 24206, 56529, 57647, 54917, 42961, 91110, 63981, 14922, 36420, 23006, 67467, 32754, 30903, 20260, 31671, 51798, 72325, 85816, 68621, 13955, 36446, 41766, 68806, 16725, 15146, 22744, 35850, 88086, 51649, 18270, 52867, 39972, 96976, 63792, 11376, 94898, 13595, 10516, 90225, 58943, 39371, 94945, 28587, 96576, 57855, 28488, 26105, 83933, 25858, 34322, 44438, 73171, 30122, 34102, 22685, 71256, 78451, 54364, 13354, 45375, 40558, 56458, 28286, 45266, 47305, 69399, 83921, 26233, 11101, 15371, 69913, 35942, 15882, 25631, 24610, 44165, 99076, 33786, 70738, 26653, 14328, 72305, 62496, 22152, 10144, 64147, 48425, 14663, 21076, 18799, 30450, 63089, 81019, 68893, 24996, 51200, 51211, 45692, 92712, 70466, 79994, 22437, 25280, 38935, 71791, 73134, 56571, 14060, 19505, 72425, 56575, 74351, 68786, 51650, 20004, 18383, 76614, 11634, 18906, 15765, 41368, 73241, 76698, 78567, 97189, 28545, 76231, 75691, 22246, 51061, 90578, 56691, 68014, 51103, 94167, 57047, 14867, 73520, 15734, 63435, 25733, 35474, 24676, 94627, 53535, 17879, 15559, 53268, 59166, 11928, 59402, 33282, 45721, 43933, 68101, 33515, 36634, 71286, 19736, 58058, 55253, 67473, 41918, 19515, 36495, 19430, 22351, 77191, 91393, 49156, 50298, 87501, 18652, 53179, 18767, 63193, 23968, 65164, 68880, 21286, 72823, 58470, 67301, 13394, 31016, 70372, 67030, 40604, 24317, 45748, 39127, 26065, 77721, 31029, 31880, 60576, 24671, 45549, 13376, 50016, 33123, 19769, 22927, 97789, 46081, 72151, 15723, 46136, 51949, 68100, 96888, 64528, 14171, 79777, 28709, 11489, 25103, 32213, 78668, 22245, 15798, 27156, 37930, 62971, 21337, 51622, 67853, 10567, 38415, 15455, 58263, 42029, 60279, 37125, 56240, 88190, 50308, 26859, 64457, 89091, 82136, 62377, 36233, 63837, 58078, 17043, 30010, 60099, 28810, 98025, 29178, 87343, 73273, 30469, 64034, 39516, 86057, 21309, 90257, 67875, 40162, 11356, 73650, 61810, 72013, 30431, 22461, 19512, 13375, 55307, 30625, 83849, 68908, 26689, 96451, 38193, 46820, 88885, 84935, 69035, 83144, 47537, 56616, 94983, 48033, 69952, 25486, 61547, 27385, 61860, 58048, 56910, 16807, 17871, 35258, 31387, 35458, 35576]) + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_zip], file_type=parquet, predicate=substr(ca_zip@9, 1, 5) IN (SET) ([24128, 76232, 65084, 87816, 83926, 77556, 20548, 26231, 43848, 15126, 91137, 61265, 98294, 25782, 17920, 18426, 98235, 40081, 84093, 28577, 55565, 17183, 54601, 67897, 22752, 86284, 18376, 38607, 45200, 21756, 29741, 96765, 23932, 89360, 29839, 25989, 28898, 91068, 72550, 10390, 18845, 47770, 82636, 41367, 76638, 86198, 81312, 37126, 39192, 88424, 72175, 81426, 53672, 10445, 42666, 66864, 66708, 41248, 48583, 82276, 18842, 78890, 49448, 14089, 38122, 34425, 79077, 19849, 43285, 39861, 66162, 77610, 13695, 99543, 83444, 83041, 12305, 57665, 68341, 25003, 57834, 62878, 49130, 81096, 18840, 27700, 23470, 50412, 21195, 16021, 76107, 71954, 68309, 18119, 98359, 64544, 10336, 86379, 27068, 39736, 98569, 28915, 24206, 56529, 57647, 54917, 42961, 91110, 63981, 14922, 36420, 23006, 67467, 32754, 30903, 20260, 31671, 51798, 72325, 85816, 68621, 13955, 36446, 41766, 68806, 16725, 15146, 22744, 35850, 88086, 51649, 18270, 52867, 39972, 96976, 63792, 11376, 94898, 13595, 10516, 90225, 58943, 39371, 94945, 28587, 96576, 57855, 28488, 26105, 83933, 25858, 34322, 44438, 73171, 30122, 34102, 22685, 71256, 78451, 54364, 13354, 45375, 40558, 56458, 28286, 45266, 47305, 69399, 83921, 26233, 11101, 15371, 69913, 35942, 15882, 25631, 24610, 44165, 99076, 33786, 70738, 26653, 14328, 72305, 62496, 22152, 10144, 64147, 48425, 14663, 21076, 18799, 30450, 63089, 81019, 68893, 24996, 51200, 51211, 45692, 92712, 70466, 79994, 22437, 25280, 38935, 71791, 73134, 56571, 14060, 19505, 72425, 56575, 74351, 68786, 51650, 20004, 18383, 76614, 11634, 18906, 15765, 41368, 73241, 76698, 78567, 97189, 28545, 76231, 75691, 22246, 51061, 90578, 56691, 68014, 51103, 94167, 57047, 14867, 73520, 15734, 63435, 25733, 35474, 24676, 94627, 53535, 17879, 15559, 53268, 59166, 11928, 59402, 33282, 45721, 43933, 68101, 33515, 36634, 71286, 19736, 58058, 55253, 67473, 41918, 19515, 36495, 19430, 22351, 77191, 91393, 49156, 50298, 87501, 18652, 53179, 18767, 63193, 23968, 65164, 68880, 21286, 72823, 58470, 67301, 13394, 31016, 70372, 67030, 40604, 24317, 45748, 39127, 26065, 77721, 31029, 31880, 60576, 24671, 45549, 13376, 50016, 33123, 19769, 22927, 97789, 46081, 72151, 15723, 46136, 51949, 68100, 96888, 64528, 14171, 79777, 28709, 11489, 25103, 32213, 78668, 22245, 15798, 27156, 37930, 62971, 21337, 51622, 67853, 10567, 38415, 15455, 58263, 42029, 60279, 37125, 56240, 88190, 50308, 26859, 64457, 89091, 82136, 62377, 36233, 63837, 58078, 17043, 30010, 60099, 28810, 98025, 29178, 87343, 73273, 30469, 64034, 39516, 86057, 21309, 90257, 67875, 40162, 11356, 73650, 61810, 72013, 30431, 22461, 19512, 13375, 55307, 30625, 83849, 68908, 26689, 96451, 38193, 46820, 88885, 84935, 69035, 83144, 47537, 56616, 94983, 48033, 69952, 25486, 61547, 27385, 61860, 58048, 56910, 16807, 17871, 35258, 31387, 35458, 35576]) + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_zip], file_type=parquet, predicate=substr(ca_zip@9, 1, 5) IN (SET) ([24128, 76232, 65084, 87816, 83926, 77556, 20548, 26231, 43848, 15126, 91137, 61265, 98294, 25782, 17920, 18426, 98235, 40081, 84093, 28577, 55565, 17183, 54601, 67897, 22752, 86284, 18376, 38607, 45200, 21756, 29741, 96765, 23932, 89360, 29839, 25989, 28898, 91068, 72550, 10390, 18845, 47770, 82636, 41367, 76638, 86198, 81312, 37126, 39192, 88424, 72175, 81426, 53672, 10445, 42666, 66864, 66708, 41248, 48583, 82276, 18842, 78890, 49448, 14089, 38122, 34425, 79077, 19849, 43285, 39861, 66162, 77610, 13695, 99543, 83444, 83041, 12305, 57665, 68341, 25003, 57834, 62878, 49130, 81096, 18840, 27700, 23470, 50412, 21195, 16021, 76107, 71954, 68309, 18119, 98359, 64544, 10336, 86379, 27068, 39736, 98569, 28915, 24206, 56529, 57647, 54917, 42961, 91110, 63981, 14922, 36420, 23006, 67467, 32754, 30903, 20260, 31671, 51798, 72325, 85816, 68621, 13955, 36446, 41766, 68806, 16725, 15146, 22744, 35850, 88086, 51649, 18270, 52867, 39972, 96976, 63792, 11376, 94898, 13595, 10516, 90225, 58943, 39371, 94945, 28587, 96576, 57855, 28488, 26105, 83933, 25858, 34322, 44438, 73171, 30122, 34102, 22685, 71256, 78451, 54364, 13354, 45375, 40558, 56458, 28286, 45266, 47305, 69399, 83921, 26233, 11101, 15371, 69913, 35942, 15882, 25631, 24610, 44165, 99076, 33786, 70738, 26653, 14328, 72305, 62496, 22152, 10144, 64147, 48425, 14663, 21076, 18799, 30450, 63089, 81019, 68893, 24996, 51200, 51211, 45692, 92712, 70466, 79994, 22437, 25280, 38935, 71791, 73134, 56571, 14060, 19505, 72425, 56575, 74351, 68786, 51650, 20004, 18383, 76614, 11634, 18906, 15765, 41368, 73241, 76698, 78567, 97189, 28545, 76231, 75691, 22246, 51061, 90578, 56691, 68014, 51103, 94167, 57047, 14867, 73520, 15734, 63435, 25733, 35474, 24676, 94627, 53535, 17879, 15559, 53268, 59166, 11928, 59402, 33282, 45721, 43933, 68101, 33515, 36634, 71286, 19736, 58058, 55253, 67473, 41918, 19515, 36495, 19430, 22351, 77191, 91393, 49156, 50298, 87501, 18652, 53179, 18767, 63193, 23968, 65164, 68880, 21286, 72823, 58470, 67301, 13394, 31016, 70372, 67030, 40604, 24317, 45748, 39127, 26065, 77721, 31029, 31880, 60576, 24671, 45549, 13376, 50016, 33123, 19769, 22927, 97789, 46081, 72151, 15723, 46136, 51949, 68100, 96888, 64528, 14171, 79777, 28709, 11489, 25103, 32213, 78668, 22245, 15798, 27156, 37930, 62971, 21337, 51622, 67853, 10567, 38415, 15455, 58263, 42029, 60279, 37125, 56240, 88190, 50308, 26859, 64457, 89091, 82136, 62377, 36233, 63837, 58078, 17043, 30010, 60099, 28810, 98025, 29178, 87343, 73273, 30469, 64034, 39516, 86057, 21309, 90257, 67875, 40162, 11356, 73650, 61810, 72013, 30431, 22461, 19512, 13375, 55307, 30625, 83849, 68908, 26689, 96451, 38193, 46820, 88885, 84935, 69035, 83144, 47537, 56616, 94983, 48033, 69952, 25486, 61547, 27385, 61860, 58048, 56910, 16807, 17871, 35258, 31387, 35458, 35576]) └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ RepartitionExec: partitioning=Hash([ca_zip@0], 3), input_partitions=3 @@ -940,22 +916,20 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_current_addr_sk@0, ca_address_sk@0)], projection=[ca_zip@2] │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: c_preferred_cust_flag@1 = Y, projection=[c_current_addr_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_current_addr_sk, c_preferred_cust_flag], file_type=parquet, predicate=c_preferred_cust_flag@10 = Y, pruning_predicate=c_preferred_cust_flag_null_count@2 != row_count@3 AND c_preferred_cust_flag_min@0 <= Y AND Y <= c_preferred_cust_flag_max@1, required_guarantees=[c_preferred_cust_flag in (Y)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_current_addr_sk, c_preferred_cust_flag], file_type=parquet, predicate=c_preferred_cust_flag@10 = Y, pruning_predicate=c_preferred_cust_flag_null_count@2 != row_count@3 AND c_preferred_cust_flag_min@0 <= Y AND Y <= c_preferred_cust_flag_max@1, required_guarantees=[c_preferred_cust_flag in (Y)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_current_addr_sk, c_preferred_cust_flag], file_type=parquet, predicate=c_preferred_cust_flag@10 = Y, pruning_predicate=c_preferred_cust_flag_null_count@2 != row_count@3 AND c_preferred_cust_flag_min@0 <= Y AND Y <= c_preferred_cust_flag_max@1, required_guarantees=[c_preferred_cust_flag in (Y)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_current_addr_sk, c_preferred_cust_flag], file_type=parquet, predicate=c_preferred_cust_flag@10 = Y, pruning_predicate=c_preferred_cust_flag_null_count@2 != row_count@3 AND c_preferred_cust_flag_min@0 <= Y AND Y <= c_preferred_cust_flag_max@1, required_guarantees=[c_preferred_cust_flag in (Y)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_current_addr_sk, c_preferred_cust_flag], file_type=parquet, predicate=c_preferred_cust_flag@10 = Y, pruning_predicate=c_preferred_cust_flag_null_count@2 != row_count@3 AND c_preferred_cust_flag_min@0 <= Y AND Y <= c_preferred_cust_flag_max@1, required_guarantees=[c_preferred_cust_flag in (Y)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_current_addr_sk, c_preferred_cust_flag], file_type=parquet, predicate=c_preferred_cust_flag@10 = Y, pruning_predicate=c_preferred_cust_flag_null_count@2 != row_count@3 AND c_preferred_cust_flag_min@0 <= Y AND Y <= c_preferred_cust_flag_max@1, required_guarantees=[c_preferred_cust_flag in (Y)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_current_addr_sk, c_preferred_cust_flag], file_type=parquet, predicate=c_preferred_cust_flag@10 = Y, pruning_predicate=c_preferred_cust_flag_null_count@2 != row_count@3 AND c_preferred_cust_flag_min@0 <= Y AND Y <= c_preferred_cust_flag_max@1, required_guarantees=[c_preferred_cust_flag in (Y)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_current_addr_sk, c_preferred_cust_flag], file_type=parquet, predicate=c_preferred_cust_flag@10 = Y, pruning_predicate=c_preferred_cust_flag_null_count@2 != row_count@3 AND c_preferred_cust_flag_min@0 <= Y AND Y <= c_preferred_cust_flag_max@1, required_guarantees=[c_preferred_cust_flag in (Y)] └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -968,12 +942,11 @@ mod tests { ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_qoy@2 = 2 AND d_year@1 = 1998, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 1998, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1998 AND 1998 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (1998)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 1998, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1998 AND 1998 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (1998)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 1998, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1998 AND 1998 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (1998)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 1998, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1998 AND 1998 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (1998)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 1998, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1998 AND 1998 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (1998)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 1998, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1998 AND 1998 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (1998)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 1998, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1998 AND 1998 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (1998)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 1998, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1998 AND 1998 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (1998)] └────────────────────────────────────────────────── "); Ok(()) @@ -1204,7 +1177,7 @@ mod tests { #[tokio::test] async fn test_tpcds_10() -> Result<()> { let display = test_tpcds_query("q10").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [cd_gender@0 ASC NULLS LAST, cd_marital_status@1 ASC NULLS LAST, cd_education_status@2 ASC NULLS LAST, cd_purchase_estimate@4 ASC NULLS LAST, cd_credit_rating@6 ASC NULLS LAST, cd_dep_count@8 ASC NULLS LAST, cd_dep_employed_count@10 ASC NULLS LAST, cd_dep_college_count@12 ASC NULLS LAST], fetch=100 │ SortExec: TopK(fetch=100), expr=[cd_gender@0 ASC NULLS LAST, cd_marital_status@1 ASC NULLS LAST, cd_education_status@2 ASC NULLS LAST, cd_purchase_estimate@4 ASC NULLS LAST, cd_credit_rating@6 ASC NULLS LAST, cd_dep_count@8 ASC NULLS LAST, cd_dep_employed_count@10 ASC NULLS LAST, cd_dep_college_count@12 ASC NULLS LAST], preserve_partitioning=[true] @@ -1215,88 +1188,90 @@ mod tests { │ FilterExec: mark@8 OR mark@9, projection=[cd_gender@0, cd_marital_status@1, cd_education_status@2, cd_purchase_estimate@3, cd_credit_rating@4, cd_dep_count@5, cd_dep_employed_count@6, cd_dep_college_count@7] │ HashJoinExec: mode=CollectLeft, join_type=LeftMark, on=[(c_customer_sk@0, cs_ship_customer_sk@0)], projection=[cd_gender@1, cd_marital_status@2, cd_education_status@3, cd_purchase_estimate@4, cd_credit_rating@5, cd_dep_count@6, cd_dep_employed_count@7, cd_dep_college_count@8, mark@9, mark@10] │ CoalescePartitionsExec - │ HashJoinExec: mode=CollectLeft, join_type=LeftMark, on=[(c_customer_sk@0, ws_bill_customer_sk@0)] + │ HashJoinExec: mode=CollectLeft, join_type=RightMark, on=[(ws_bill_customer_sk@0, c_customer_sk@0)] │ CoalescePartitionsExec - │ HashJoinExec: mode=CollectLeft, join_type=LeftSemi, on=[(c_customer_sk@0, ss_customer_sk@0)] - │ CoalescePartitionsExec - │ [Stage 3] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_customer_sk@2] - │ CoalescePartitionsExec - │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[ws_bill_customer_sk@2] + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=LeftSemi, on=[(c_customer_sk@0, ss_customer_sk@0)] │ CoalescePartitionsExec - │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_ship_customer_sk@2] + │ [Stage 5] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_customer_sk@1] + │ CoalescePartitionsExec + │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_ship_customer_sk@1] │ CoalescePartitionsExec - │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 + │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_ship_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 3 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_current_cdemo_sk@1, cd_demo_sk@0)], projection=[c_customer_sk@0, cd_gender@3, cd_marital_status@4, cd_education_status@5, cd_purchase_estimate@6, cd_credit_rating@7, cd_dep_count@8, cd_dep_employed_count@9, cd_dep_college_count@10] - │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 2 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[ws_bill_customer_sk@1] + │ CoalescePartitionsExec + │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + └────────────────────────────────────────────────── + ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ FilterExec: d_year@1 = 2002 AND d_moy@2 >= 1 AND d_moy@2 <= 4, projection=[d_date_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2002 AND d_moy@8 >= 1 AND d_moy@8 <= 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 1 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 4, required_guarantees=[d_year in (2002)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2002 AND d_moy@8 >= 1 AND d_moy@8 <= 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 1 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 4, required_guarantees=[d_year in (2002)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2002 AND d_moy@8 >= 1 AND d_moy@8 <= 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 1 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 4, required_guarantees=[d_year in (2002)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2002 AND d_moy@8 >= 1 AND d_moy@8 <= 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 1 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 4, required_guarantees=[d_year in (2002)] + └────────────────────────────────────────────────── + ┌───── Stage 5 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_current_cdemo_sk@1, cd_demo_sk@0)], projection=[c_customer_sk@0, cd_gender@3, cd_marital_status@4, cd_education_status@5, cd_purchase_estimate@6, cd_credit_rating@7, cd_dep_count@8, cd_dep_employed_count@9, cd_dep_college_count@10] + │ CoalescePartitionsExec + │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + └────────────────────────────────────────────────── + ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, c_current_addr_sk@2)], projection=[c_customer_sk@1, c_current_cdemo_sk@2] │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: ca_county@1 IN (SET) ([Rush County, Toole County, Jefferson County, Dona Ana County, La Porte County]), projection=[ca_address_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=ca_county@7 IN (SET) ([Rush County, Toole County, Jefferson County, Dona Ana County, La Porte County]), pruning_predicate=ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Rush County AND Rush County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Toole County AND Toole County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Jefferson County AND Jefferson County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Dona Ana County AND Dona Ana County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= La Porte County AND La Porte County <= ca_county_max@1, required_guarantees=[ca_county in (Dona Ana County, Jefferson County, La Porte County, Rush County, Toole County)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=ca_county@7 IN (SET) ([Rush County, Toole County, Jefferson County, Dona Ana County, La Porte County]), pruning_predicate=ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Rush County AND Rush County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Toole County AND Toole County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Jefferson County AND Jefferson County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Dona Ana County AND Dona Ana County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= La Porte County AND La Porte County <= ca_county_max@1, required_guarantees=[ca_county in (Dona Ana County, Jefferson County, La Porte County, Rush County, Toole County)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=ca_county@7 IN (SET) ([Rush County, Toole County, Jefferson County, Dona Ana County, La Porte County]), pruning_predicate=ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Rush County AND Rush County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Toole County AND Toole County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Jefferson County AND Jefferson County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Dona Ana County AND Dona Ana County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= La Porte County AND La Porte County <= ca_county_max@1, required_guarantees=[ca_county in (Dona Ana County, Jefferson County, La Porte County, Rush County, Toole County)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=ca_county@7 IN (SET) ([Rush County, Toole County, Jefferson County, Dona Ana County, La Porte County]), pruning_predicate=ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Rush County AND Rush County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Toole County AND Toole County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Jefferson County AND Jefferson County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Dona Ana County AND Dona Ana County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= La Porte County AND La Porte County <= ca_county_max@1, required_guarantees=[ca_county in (Dona Ana County, Jefferson County, La Porte County, Rush County, Toole County)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=ca_county@7 IN (SET) ([Rush County, Toole County, Jefferson County, Dona Ana County, La Porte County]), pruning_predicate=ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Rush County AND Rush County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Toole County AND Toole County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Jefferson County AND Jefferson County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Dona Ana County AND Dona Ana County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= La Porte County AND La Porte County <= ca_county_max@1, required_guarantees=[ca_county in (Dona Ana County, Jefferson County, La Porte County, Rush County, Toole County)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=ca_county@7 IN (SET) ([Rush County, Toole County, Jefferson County, Dona Ana County, La Porte County]), pruning_predicate=ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Rush County AND Rush County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Toole County AND Toole County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Jefferson County AND Jefferson County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Dona Ana County AND Dona Ana County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= La Porte County AND La Porte County <= ca_county_max@1, required_guarantees=[ca_county in (Dona Ana County, Jefferson County, La Porte County, Rush County, Toole County)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=ca_county@7 IN (SET) ([Rush County, Toole County, Jefferson County, Dona Ana County, La Porte County]), pruning_predicate=ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Rush County AND Rush County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Toole County AND Toole County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Jefferson County AND Jefferson County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Dona Ana County AND Dona Ana County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= La Porte County AND La Porte County <= ca_county_max@1, required_guarantees=[ca_county in (Dona Ana County, Jefferson County, La Porte County, Rush County, Toole County)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=ca_county@7 IN (SET) ([Rush County, Toole County, Jefferson County, Dona Ana County, La Porte County]), pruning_predicate=ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Rush County AND Rush County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Toole County AND Toole County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Jefferson County AND Jefferson County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= Dona Ana County AND Dona Ana County <= ca_county_max@1 OR ca_county_null_count@2 != row_count@3 AND ca_county_min@0 <= La Porte County AND La Porte County <= ca_county_max@1, required_guarantees=[ca_county in (Dona Ana County, Jefferson County, La Porte County, Rush County, Toole County)] └────────────────────────────────────────────────── - ┌───── Stage 4 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] - │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 - │ FilterExec: d_year@1 = 2002 AND d_moy@2 >= 1 AND d_moy@2 <= 4, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2002 AND d_moy@8 >= 1 AND d_moy@8 <= 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 1 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 4, required_guarantees=[d_year in (2002)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2002 AND d_moy@8 >= 1 AND d_moy@8 <= 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 1 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 4, required_guarantees=[d_year in (2002)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2002 AND d_moy@8 >= 1 AND d_moy@8 <= 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 1 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 4, required_guarantees=[d_year in (2002)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2002 AND d_moy@8 >= 1 AND d_moy@8 <= 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 1 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 4, required_guarantees=[d_year in (2002)] - └────────────────────────────────────────────────── - ┌───── Stage 5 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + ┌───── Stage 6 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 │ FilterExec: d_year@1 = 2002 AND d_moy@2 >= 1 AND d_moy@2 <= 4, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2002 AND d_moy@8 >= 1 AND d_moy@8 <= 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 1 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 4, required_guarantees=[d_year in (2002)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2002 AND d_moy@8 >= 1 AND d_moy@8 <= 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 1 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 4, required_guarantees=[d_year in (2002)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2002 AND d_moy@8 >= 1 AND d_moy@8 <= 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 1 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 4, required_guarantees=[d_year in (2002)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2002 AND d_moy@8 >= 1 AND d_moy@8 <= 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 1 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 4, required_guarantees=[d_year in (2002)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2002 AND d_moy@8 >= 1 AND d_moy@8 <= 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 1 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 4, required_guarantees=[d_year in (2002)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2002 AND d_moy@8 >= 1 AND d_moy@8 <= 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 1 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 4, required_guarantees=[d_year in (2002)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2002 AND d_moy@8 >= 1 AND d_moy@8 <= 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 1 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 4, required_guarantees=[d_year in (2002)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2002 AND d_moy@8 >= 1 AND d_moy@8 <= 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 1 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 4, required_guarantees=[d_year in (2002)] └────────────────────────────────────────────────── - ┌───── Stage 6 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + ┌───── Stage 7 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 │ FilterExec: d_year@1 = 2002 AND d_moy@2 >= 1 AND d_moy@2 <= 4, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2002 AND d_moy@8 >= 1 AND d_moy@8 <= 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 1 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 4, required_guarantees=[d_year in (2002)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2002 AND d_moy@8 >= 1 AND d_moy@8 <= 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 1 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 4, required_guarantees=[d_year in (2002)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2002 AND d_moy@8 >= 1 AND d_moy@8 <= 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 1 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 4, required_guarantees=[d_year in (2002)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2002 AND d_moy@8 >= 1 AND d_moy@8 <= 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 1 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 4, required_guarantees=[d_year in (2002)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2002 AND d_moy@8 >= 1 AND d_moy@8 <= 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 1 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 4, required_guarantees=[d_year in (2002)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2002 AND d_moy@8 >= 1 AND d_moy@8 <= 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 1 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 4, required_guarantees=[d_year in (2002)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2002 AND d_moy@8 >= 1 AND d_moy@8 <= 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 1 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 4, required_guarantees=[d_year in (2002)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2002 AND d_moy@8 >= 1 AND d_moy@8 <= 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 1 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 4, required_guarantees=[d_year in (2002)] └────────────────────────────────────────────────── "); Ok(()) @@ -1304,14 +1279,14 @@ mod tests { #[tokio::test] async fn test_tpcds_11() -> Result<()> { let display = test_tpcds_query("q11").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [customer_id@0 ASC, customer_first_name@1 ASC, customer_last_name@2 ASC, customer_preferred_cust_flag@3 ASC], fetch=100 │ [Stage 16] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 └────────────────────────────────────────────────── ┌───── Stage 16 ── Tasks: t0:[p0..p2] t1:[p0..p2] │ SortExec: TopK(fetch=100), expr=[customer_id@0 ASC, customer_first_name@1 ASC, customer_last_name@2 ASC, customer_preferred_cust_flag@3 ASC], preserve_partitioning=[true] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(customer_id@0, customer_id@0)], filter=CASE WHEN year_total@2 > Some(0),18,2 THEN CAST(year_total@3 AS Float64) / CAST(year_total@2 AS Float64) ELSE 0 END > CASE WHEN year_total@0 > Some(0),18,2 THEN CAST(year_total@1 AS Float64) / CAST(year_total@0 AS Float64) ELSE 0 END, projection=[customer_id@2, customer_first_name@3, customer_last_name@4, customer_preferred_cust_flag@5] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(customer_id@0, customer_id@0)], filter=CASE WHEN year_total@2 > 0.00 THEN CAST(year_total@3 AS Float64) / CAST(year_total@2 AS Float64) ELSE 0 END > CASE WHEN year_total@0 > 0.00 THEN CAST(year_total@1 AS Float64) / CAST(year_total@0 AS Float64) ELSE 0 END, projection=[customer_id@2, customer_first_name@3, customer_last_name@4, customer_preferred_cust_flag@5] │ CoalescePartitionsExec │ [Stage 12] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=6, input_tasks=2 │ ProjectionExec: expr=[c_customer_id@0 as customer_id, sum(web_sales.ws_ext_list_price - web_sales.ws_ext_discount_amt)@8 as year_total] @@ -1333,7 +1308,7 @@ mod tests { ┌───── Stage 4 ── Tasks: t0:[p0..p5] t1:[p6..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=2, output_partitions=6 │ ProjectionExec: expr=[c_customer_id@0 as customer_id, sum(web_sales.ws_ext_list_price - web_sales.ws_ext_discount_amt)@1 as year_total] - │ FilterExec: sum(web_sales.ws_ext_list_price - web_sales.ws_ext_discount_amt)@1 > Some(0),18,2 + │ FilterExec: sum(web_sales.ws_ext_list_price - web_sales.ws_ext_discount_amt)@1 > 0.00 │ ProjectionExec: expr=[c_customer_id@0 as c_customer_id, sum(web_sales.ws_ext_list_price - web_sales.ws_ext_discount_amt)@8 as sum(web_sales.ws_ext_list_price - web_sales.ws_ext_discount_amt)] │ AggregateExec: mode=FinalPartitioned, gby=[c_customer_id@0 as c_customer_id, c_first_name@1 as c_first_name, c_last_name@2 as c_last_name, c_preferred_cust_flag@3 as c_preferred_cust_flag, c_birth_country@4 as c_birth_country, c_login@5 as c_login, c_email_address@6 as c_email_address, d_year@7 as d_year], aggr=[sum(web_sales.ws_ext_list_price - web_sales.ws_ext_discount_amt)], ordering_mode=PartiallySorted([7]) │ [Stage 3] => NetworkShuffleExec: output_partitions=3, input_tasks=4 @@ -1346,7 +1321,7 @@ mod tests { │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ws_bill_customer_sk@1)], projection=[c_customer_id@1, c_first_name@2, c_last_name@3, c_preferred_cust_flag@4, c_birth_country@5, c_login@6, c_email_address@7, ws_sold_date_sk@8, ws_ext_discount_amt@10, ws_ext_list_price@11] │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] @@ -1356,25 +1331,24 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2001 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p5] t1:[p6..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=2, output_partitions=6 │ ProjectionExec: expr=[c_customer_id@0 as customer_id, sum(store_sales.ss_ext_list_price - store_sales.ss_ext_discount_amt)@1 as year_total] - │ FilterExec: sum(store_sales.ss_ext_list_price - store_sales.ss_ext_discount_amt)@1 > Some(0),18,2 + │ FilterExec: sum(store_sales.ss_ext_list_price - store_sales.ss_ext_discount_amt)@1 > 0.00 │ ProjectionExec: expr=[c_customer_id@0 as c_customer_id, sum(store_sales.ss_ext_list_price - store_sales.ss_ext_discount_amt)@8 as sum(store_sales.ss_ext_list_price - store_sales.ss_ext_discount_amt)] │ AggregateExec: mode=FinalPartitioned, gby=[c_customer_id@0 as c_customer_id, c_first_name@1 as c_first_name, c_last_name@2 as c_last_name, c_preferred_cust_flag@3 as c_preferred_cust_flag, c_birth_country@4 as c_birth_country, c_login@5 as c_login, c_email_address@6 as c_email_address, d_year@7 as d_year], aggr=[sum(store_sales.ss_ext_list_price - store_sales.ss_ext_discount_amt)], ordering_mode=PartiallySorted([7]) │ [Stage 7] => NetworkShuffleExec: output_partitions=3, input_tasks=4 @@ -1387,7 +1361,7 @@ mod tests { │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ss_customer_sk@1)], projection=[c_customer_id@1, c_first_name@2, c_last_name@3, c_preferred_cust_flag@4, c_birth_country@5, c_login@6, c_email_address@7, ss_sold_date_sk@8, ss_ext_discount_amt@10, ss_ext_list_price@11] │ CoalescePartitionsExec - │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] @@ -1397,20 +1371,19 @@ mod tests { ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2001 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] └────────────────────────────────────────────────── - ┌───── Stage 6 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 11 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([c_customer_id@0, c_first_name@1, c_last_name@2, c_preferred_cust_flag@3, c_birth_country@4, c_login@5, c_email_address@6, d_year@7], 6), input_partitions=3 @@ -1420,7 +1393,7 @@ mod tests { │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ss_customer_sk@1)], projection=[c_customer_id@1, c_first_name@2, c_last_name@3, c_preferred_cust_flag@4, c_birth_country@5, c_login@6, c_email_address@7, ss_sold_date_sk@8, ss_ext_discount_amt@10, ss_ext_list_price@11] │ CoalescePartitionsExec - │ [Stage 10] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 10] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] @@ -1430,20 +1403,19 @@ mod tests { ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2002 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] └────────────────────────────────────────────────── - ┌───── Stage 10 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 10 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 15 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([c_customer_id@0, c_first_name@1, c_last_name@2, c_preferred_cust_flag@3, c_birth_country@4, c_login@5, c_email_address@6, d_year@7], 6), input_partitions=3 @@ -1453,7 +1425,7 @@ mod tests { │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ws_bill_customer_sk@1)], projection=[c_customer_id@1, c_first_name@2, c_last_name@3, c_preferred_cust_flag@4, c_birth_country@5, c_login@6, c_email_address@7, ws_sold_date_sk@8, ws_ext_discount_amt@10, ws_ext_list_price@11] │ CoalescePartitionsExec - │ [Stage 14] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 14] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] @@ -1463,20 +1435,19 @@ mod tests { ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2002 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] └────────────────────────────────────────────────── - ┌───── Stage 14 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 14 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── "); Ok(()) @@ -1516,22 +1487,20 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_date@1 >= 1999-02-22 AND d_date@1 <= 1999-03-24, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-22 AND d_date@2 <= 1999-03-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-22 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-03-24, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-22 AND d_date@2 <= 1999-03-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-22 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-03-24, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-22 AND d_date@2 <= 1999-03-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-22 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-03-24, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-22 AND d_date@2 <= 1999-03-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-22 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-03-24, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-22 AND d_date@2 <= 1999-03-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-22 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-03-24, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-22 AND d_date@2 <= 1999-03-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-22 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-03-24, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-22 AND d_date@2 <= 1999-03-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-22 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-03-24, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-22 AND d_date@2 <= 1999-03-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-22 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-03-24, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_category@5 = Sports OR i_category@5 = Books OR i_category@5 = Home - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_class, i_category], file_type=parquet, predicate=i_category@12 = Sports OR i_category@12 = Books OR i_category@12 = Home, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Home AND Home <= i_category_max@1, required_guarantees=[i_category in (Books, Home, Sports)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_class, i_category], file_type=parquet, predicate=i_category@12 = Sports OR i_category@12 = Books OR i_category@12 = Home, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Home AND Home <= i_category_max@1, required_guarantees=[i_category in (Books, Home, Sports)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_class, i_category], file_type=parquet, predicate=i_category@12 = Sports OR i_category@12 = Books OR i_category@12 = Home, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Home AND Home <= i_category_max@1, required_guarantees=[i_category in (Books, Home, Sports)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_class, i_category], file_type=parquet, predicate=i_category@12 = Sports OR i_category@12 = Books OR i_category@12 = Home, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Home AND Home <= i_category_max@1, required_guarantees=[i_category in (Books, Home, Sports)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_class, i_category], file_type=parquet, predicate=i_category@12 = Sports OR i_category@12 = Books OR i_category@12 = Home, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Home AND Home <= i_category_max@1, required_guarantees=[i_category in (Books, Home, Sports)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_class, i_category], file_type=parquet, predicate=i_category@12 = Sports OR i_category@12 = Books OR i_category@12 = Home, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Home AND Home <= i_category_max@1, required_guarantees=[i_category in (Books, Home, Sports)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_class, i_category], file_type=parquet, predicate=i_category@12 = Sports OR i_category@12 = Books OR i_category@12 = Home, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Home AND Home <= i_category_max@1, required_guarantees=[i_category in (Books, Home, Sports)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_class, i_category], file_type=parquet, predicate=i_category@12 = Sports OR i_category@12 = Books OR i_category@12 = Home, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Home AND Home <= i_category_max@1, required_guarantees=[i_category in (Books, Home, Sports)] └────────────────────────────────────────────────── "#); Ok(()) @@ -1539,7 +1508,7 @@ mod tests { #[tokio::test] async fn test_tpcds_13() -> Result<()> { let display = test_tpcds_query("q13").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ ProjectionExec: expr=[avg(store_sales.ss_quantity)@0 as avg1, avg(store_sales.ss_ext_sales_price)@1 as avg2, avg(store_sales.ss_ext_wholesale_cost)@2 as avg3, sum(store_sales.ss_ext_wholesale_cost)@3 as sum(store_sales.ss_ext_wholesale_cost)] │ AggregateExec: mode=Final, gby=[], aggr=[avg(store_sales.ss_quantity), avg(store_sales.ss_ext_sales_price), avg(store_sales.ss_ext_wholesale_cost), sum(store_sales.ss_ext_wholesale_cost)] @@ -1551,35 +1520,33 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_quantity@2, ss_ext_sales_price@3, ss_ext_wholesale_cost@4] │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, ss_addr_sk@1)], filter=(ca_state@1 = TX OR ca_state@1 = OH) AND ss_net_profit@0 >= Some(10000),7,2 AND ss_net_profit@0 <= Some(20000),7,2 OR (ca_state@1 = OR OR ca_state@1 = NM OR ca_state@1 = KY) AND ss_net_profit@0 >= Some(15000),7,2 AND ss_net_profit@0 <= Some(30000),7,2 OR (ca_state@1 = VA OR ca_state@1 = TX OR ca_state@1 = MS) AND ss_net_profit@0 >= Some(5000),7,2 AND ss_net_profit@0 <= Some(25000),7,2, projection=[ss_sold_date_sk@2, ss_quantity@4, ss_ext_sales_price@5, ss_ext_wholesale_cost@6] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, ss_addr_sk@1)], filter=(ca_state@1 = TX OR ca_state@1 = OH) AND ss_net_profit@0 >= 100.00 AND ss_net_profit@0 <= 200.00 OR (ca_state@1 = OR OR ca_state@1 = NM OR ca_state@1 = KY) AND ss_net_profit@0 >= 150.00 AND ss_net_profit@0 <= 300.00 OR (ca_state@1 = VA OR ca_state@1 = TX OR ca_state@1 = MS) AND ss_net_profit@0 >= 50.00 AND ss_net_profit@0 <= 250.00, projection=[ss_sold_date_sk@2, ss_quantity@4, ss_ext_sales_price@5, ss_ext_wholesale_cost@6] │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(hd_demo_sk@0, ss_hdemo_sk@1)], filter=cd_marital_status@1 = M AND cd_education_status@2 = Advanced Degree AND ss_sales_price@0 >= Some(10000),7,2 AND ss_sales_price@0 <= Some(15000),7,2 AND hd_dep_count@3 = 3 OR cd_marital_status@1 = S AND cd_education_status@2 = College AND ss_sales_price@0 >= Some(5000),7,2 AND ss_sales_price@0 <= Some(10000),7,2 AND hd_dep_count@3 = 1 OR cd_marital_status@1 = W AND cd_education_status@2 = 2 yr Degree AND ss_sales_price@0 >= Some(15000),7,2 AND ss_sales_price@0 <= Some(20000),7,2 AND hd_dep_count@3 = 1, projection=[ss_sold_date_sk@2, ss_addr_sk@4, ss_quantity@5, ss_ext_sales_price@7, ss_ext_wholesale_cost@8, ss_net_profit@9] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(hd_demo_sk@0, ss_hdemo_sk@1)], filter=cd_marital_status@1 = M AND cd_education_status@2 = Advanced Degree AND ss_sales_price@0 >= 100.00 AND ss_sales_price@0 <= 150.00 AND hd_dep_count@3 = 3 OR cd_marital_status@1 = S AND cd_education_status@2 = College AND ss_sales_price@0 >= 50.00 AND ss_sales_price@0 <= 100.00 AND hd_dep_count@3 = 1 OR cd_marital_status@1 = W AND cd_education_status@2 = 2 yr Degree AND ss_sales_price@0 >= 150.00 AND ss_sales_price@0 <= 200.00 AND hd_dep_count@3 = 1, projection=[ss_sold_date_sk@2, ss_addr_sk@4, ss_quantity@5, ss_ext_sales_price@7, ss_ext_wholesale_cost@8, ss_net_profit@9] │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(cd_demo_sk@0, ss_cdemo_sk@1)], filter=cd_marital_status@1 = M AND cd_education_status@2 = Advanced Degree AND ss_sales_price@0 >= Some(10000),7,2 AND ss_sales_price@0 <= Some(15000),7,2 OR cd_marital_status@1 = S AND cd_education_status@2 = College AND ss_sales_price@0 >= Some(5000),7,2 AND ss_sales_price@0 <= Some(10000),7,2 OR cd_marital_status@1 = W AND cd_education_status@2 = 2 yr Degree AND ss_sales_price@0 >= Some(15000),7,2 AND ss_sales_price@0 <= Some(20000),7,2, projection=[ss_sold_date_sk@3, ss_hdemo_sk@5, ss_addr_sk@6, ss_quantity@7, ss_sales_price@8, ss_ext_sales_price@9, ss_ext_wholesale_cost@10, ss_net_profit@11, cd_marital_status@1, cd_education_status@2] + │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(cd_demo_sk@0, ss_cdemo_sk@1)], filter=cd_marital_status@1 = M AND cd_education_status@2 = Advanced Degree AND ss_sales_price@0 >= 100.00 AND ss_sales_price@0 <= 150.00 OR cd_marital_status@1 = S AND cd_education_status@2 = College AND ss_sales_price@0 >= 50.00 AND ss_sales_price@0 <= 100.00 OR cd_marital_status@1 = W AND cd_education_status@2 = 2 yr Degree AND ss_sales_price@0 >= 150.00 AND ss_sales_price@0 <= 200.00, projection=[ss_sold_date_sk@3, ss_hdemo_sk@5, ss_addr_sk@6, ss_quantity@7, ss_sales_price@8, ss_ext_sales_price@9, ss_ext_wholesale_cost@10, ss_net_profit@11, cd_marital_status@1, cd_education_status@2] │ [Stage 4] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ [Stage 6] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2001, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: ca_country@2 = United States AND ca_state@1 IN (SET) ([TX, OH, OR, NM, KY, VA, MS]) AND (ca_state@1 = TX OR ca_state@1 = OH OR ca_state@1 = OR OR ca_state@1 = NM OR ca_state@1 = KY OR ca_state@1 = VA OR ca_state@1 = TX OR ca_state@1 = MS), projection=[ca_address_sk@0, ca_state@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_country], file_type=parquet, predicate=ca_country@10 = United States AND ca_state@8 IN (SET) ([TX, OH, OR, NM, KY, VA, MS]) AND (ca_state@8 = TX OR ca_state@8 = OH OR ca_state@8 = OR OR ca_state@8 = NM OR ca_state@8 = KY OR ca_state@8 = VA OR ca_state@8 = TX OR ca_state@8 = MS), pruning_predicate=ca_country_null_count@2 != row_count@3 AND ca_country_min@0 <= United States AND United States <= ca_country_max@1 AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NM AND NM <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5) AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NM AND NM <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5), required_guarantees=[ca_country in (United States), ca_state in (KY, MS, NM, OH, OR, TX, VA)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_country], file_type=parquet, predicate=ca_country@10 = United States AND ca_state@8 IN (SET) ([TX, OH, OR, NM, KY, VA, MS]) AND (ca_state@8 = TX OR ca_state@8 = OH OR ca_state@8 = OR OR ca_state@8 = NM OR ca_state@8 = KY OR ca_state@8 = VA OR ca_state@8 = TX OR ca_state@8 = MS), pruning_predicate=ca_country_null_count@2 != row_count@3 AND ca_country_min@0 <= United States AND United States <= ca_country_max@1 AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NM AND NM <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5) AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NM AND NM <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5), required_guarantees=[ca_country in (United States), ca_state in (KY, MS, NM, OH, OR, TX, VA)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_country], file_type=parquet, predicate=ca_country@10 = United States AND ca_state@8 IN (SET) ([TX, OH, OR, NM, KY, VA, MS]) AND (ca_state@8 = TX OR ca_state@8 = OH OR ca_state@8 = OR OR ca_state@8 = NM OR ca_state@8 = KY OR ca_state@8 = VA OR ca_state@8 = TX OR ca_state@8 = MS), pruning_predicate=ca_country_null_count@2 != row_count@3 AND ca_country_min@0 <= United States AND United States <= ca_country_max@1 AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NM AND NM <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5) AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NM AND NM <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5), required_guarantees=[ca_country in (United States), ca_state in (KY, MS, NM, OH, OR, TX, VA)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_country], file_type=parquet, predicate=ca_country@10 = United States AND ca_state@8 IN (SET) ([TX, OH, OR, NM, KY, VA, MS]) AND (ca_state@8 = TX OR ca_state@8 = OH OR ca_state@8 = OR OR ca_state@8 = NM OR ca_state@8 = KY OR ca_state@8 = VA OR ca_state@8 = TX OR ca_state@8 = MS), pruning_predicate=ca_country_null_count@2 != row_count@3 AND ca_country_min@0 <= United States AND United States <= ca_country_max@1 AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NM AND NM <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5) AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NM AND NM <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5), required_guarantees=[ca_country in (United States), ca_state in (KY, MS, NM, OH, OR, TX, VA)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_country], file_type=parquet, predicate=ca_country@10 = United States AND ca_state@8 IN (SET) ([TX, OH, OR, NM, KY, VA, MS]) AND (ca_state@8 = TX OR ca_state@8 = OH OR ca_state@8 = OR OR ca_state@8 = NM OR ca_state@8 = KY OR ca_state@8 = VA OR ca_state@8 = TX OR ca_state@8 = MS), pruning_predicate=ca_country_null_count@2 != row_count@3 AND ca_country_min@0 <= United States AND United States <= ca_country_max@1 AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NM AND NM <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5) AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NM AND NM <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5), required_guarantees=[ca_country in (United States), ca_state in (KY, MS, NM, OH, OR, TX, VA)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_country], file_type=parquet, predicate=ca_country@10 = United States AND ca_state@8 IN (SET) ([TX, OH, OR, NM, KY, VA, MS]) AND (ca_state@8 = TX OR ca_state@8 = OH OR ca_state@8 = OR OR ca_state@8 = NM OR ca_state@8 = KY OR ca_state@8 = VA OR ca_state@8 = TX OR ca_state@8 = MS), pruning_predicate=ca_country_null_count@2 != row_count@3 AND ca_country_min@0 <= United States AND United States <= ca_country_max@1 AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NM AND NM <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5) AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NM AND NM <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5), required_guarantees=[ca_country in (United States), ca_state in (KY, MS, NM, OH, OR, TX, VA)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_country], file_type=parquet, predicate=ca_country@10 = United States AND ca_state@8 IN (SET) ([TX, OH, OR, NM, KY, VA, MS]) AND (ca_state@8 = TX OR ca_state@8 = OH OR ca_state@8 = OR OR ca_state@8 = NM OR ca_state@8 = KY OR ca_state@8 = VA OR ca_state@8 = TX OR ca_state@8 = MS), pruning_predicate=ca_country_null_count@2 != row_count@3 AND ca_country_min@0 <= United States AND United States <= ca_country_max@1 AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NM AND NM <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5) AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NM AND NM <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5), required_guarantees=[ca_country in (United States), ca_state in (KY, MS, NM, OH, OR, TX, VA)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_country], file_type=parquet, predicate=ca_country@10 = United States AND ca_state@8 IN (SET) ([TX, OH, OR, NM, KY, VA, MS]) AND (ca_state@8 = TX OR ca_state@8 = OH OR ca_state@8 = OR OR ca_state@8 = NM OR ca_state@8 = KY OR ca_state@8 = VA OR ca_state@8 = TX OR ca_state@8 = MS), pruning_predicate=ca_country_null_count@2 != row_count@3 AND ca_country_min@0 <= United States AND United States <= ca_country_max@1 AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NM AND NM <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5) AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NM AND NM <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5), required_guarantees=[ca_country in (United States), ca_state in (KY, MS, NM, OH, OR, TX, VA)] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1599,19 +1566,19 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_marital_status@2 = M AND cd_education_status@3 = Advanced Degree OR cd_marital_status@2 = S AND cd_education_status@3 = College OR cd_marital_status@2 = W AND cd_education_status@3 = 2 yr Degree, pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= S AND S <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= College AND College <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= 2 yr Degree AND 2 yr Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (2 yr Degree, Advanced Degree, College), cd_marital_status in (M, S, W)] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_marital_status@2 = M AND cd_education_status@3 = Advanced Degree OR cd_marital_status@2 = S AND cd_education_status@3 = College OR cd_marital_status@2 = W AND cd_education_status@3 = 2 yr Degree, pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= S AND S <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= College AND College <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= 2 yr Degree AND 2 yr Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (2 yr Degree, Advanced Degree, College), cd_marital_status in (M, S, W)] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_marital_status@2 = M AND cd_education_status@3 = Advanced Degree OR cd_marital_status@2 = S AND cd_education_status@3 = College OR cd_marital_status@2 = W AND cd_education_status@3 = 2 yr Degree, pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= S AND S <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= College AND College <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= 2 yr Degree AND 2 yr Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (2 yr Degree, Advanced Degree, College), cd_marital_status in (M, S, W)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_marital_status@2 = M AND cd_education_status@3 = Advanced Degree OR cd_marital_status@2 = S AND cd_education_status@3 = College OR cd_marital_status@2 = W AND cd_education_status@3 = 2 yr Degree, pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= S AND S <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= College AND College <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= 2 yr Degree AND 2 yr Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (2 yr Degree, Advanced Degree, College), cd_marital_status in (M, S, W)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_marital_status@2 = M AND cd_education_status@3 = Advanced Degree OR cd_marital_status@2 = S AND cd_education_status@3 = College OR cd_marital_status@2 = W AND cd_education_status@3 = 2 yr Degree, pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= S AND S <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= College AND College <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= 2 yr Degree AND 2 yr Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (2 yr Degree, Advanced Degree, College), cd_marital_status in (M, S, W)] └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_cdemo_sk@1], 12), input_partitions=3 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(s_store_sk@0, ss_store_sk@4)], projection=[ss_sold_date_sk@1, ss_cdemo_sk@2, ss_hdemo_sk@3, ss_addr_sk@4, ss_quantity@6, ss_sales_price@7, ss_ext_sales_price@8, ss_ext_wholesale_cost@9, ss_net_profit@10] │ CoalescePartitionsExec │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 - │ FilterExec: (ss_net_profit@9 >= Some(10000),7,2 AND ss_net_profit@9 <= Some(20000),7,2 OR ss_net_profit@9 >= Some(15000),7,2 AND ss_net_profit@9 <= Some(30000),7,2 OR ss_net_profit@9 >= Some(5000),7,2 AND ss_net_profit@9 <= Some(25000),7,2) AND (ss_sales_price@6 >= Some(10000),7,2 AND ss_sales_price@6 <= Some(15000),7,2 OR ss_sales_price@6 >= Some(5000),7,2 AND ss_sales_price@6 <= Some(10000),7,2 OR ss_sales_price@6 >= Some(15000),7,2 AND ss_sales_price@6 <= Some(20000),7,2) + │ FilterExec: (ss_net_profit@9 >= 100.00 AND ss_net_profit@9 <= 200.00 OR ss_net_profit@9 >= 150.00 AND ss_net_profit@9 <= 300.00 OR ss_net_profit@9 >= 50.00 AND ss_net_profit@9 <= 250.00) AND (ss_sales_price@6 >= 100.00 AND ss_sales_price@6 <= 150.00 OR ss_sales_price@6 >= 50.00 AND ss_sales_price@6 <= 100.00 OR ss_sales_price@6 >= 150.00 AND ss_sales_price@6 <= 200.00) │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_ext_sales_price, ss_ext_wholesale_cost, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= Some(10000),7,2 AND ss_net_profit@22 <= Some(20000),7,2 OR ss_net_profit@22 >= Some(15000),7,2 AND ss_net_profit@22 <= Some(30000),7,2 OR ss_net_profit@22 >= Some(5000),7,2 AND ss_net_profit@22 <= Some(25000),7,2) AND (ss_sales_price@13 >= Some(10000),7,2 AND ss_sales_price@13 <= Some(15000),7,2 OR ss_sales_price@13 >= Some(5000),7,2 AND ss_sales_price@13 <= Some(10000),7,2 OR ss_sales_price@13 >= Some(15000),7,2 AND ss_sales_price@13 <= Some(20000),7,2) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= Some(10000),7,2 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= Some(20000),7,2 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= Some(15000),7,2 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= Some(30000),7,2 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= Some(5000),7,2 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= Some(25000),7,2) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= Some(10000),7,2 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= Some(15000),7,2 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= Some(5000),7,2 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= Some(10000),7,2 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= Some(15000),7,2 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= Some(20000),7,2), required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_ext_sales_price, ss_ext_wholesale_cost, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= Some(10000),7,2 AND ss_net_profit@22 <= Some(20000),7,2 OR ss_net_profit@22 >= Some(15000),7,2 AND ss_net_profit@22 <= Some(30000),7,2 OR ss_net_profit@22 >= Some(5000),7,2 AND ss_net_profit@22 <= Some(25000),7,2) AND (ss_sales_price@13 >= Some(10000),7,2 AND ss_sales_price@13 <= Some(15000),7,2 OR ss_sales_price@13 >= Some(5000),7,2 AND ss_sales_price@13 <= Some(10000),7,2 OR ss_sales_price@13 >= Some(15000),7,2 AND ss_sales_price@13 <= Some(20000),7,2) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= Some(10000),7,2 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= Some(20000),7,2 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= Some(15000),7,2 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= Some(30000),7,2 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= Some(5000),7,2 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= Some(25000),7,2) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= Some(10000),7,2 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= Some(15000),7,2 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= Some(5000),7,2 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= Some(10000),7,2 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= Some(15000),7,2 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= Some(20000),7,2), required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_ext_sales_price, ss_ext_wholesale_cost, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= Some(10000),7,2 AND ss_net_profit@22 <= Some(20000),7,2 OR ss_net_profit@22 >= Some(15000),7,2 AND ss_net_profit@22 <= Some(30000),7,2 OR ss_net_profit@22 >= Some(5000),7,2 AND ss_net_profit@22 <= Some(25000),7,2) AND (ss_sales_price@13 >= Some(10000),7,2 AND ss_sales_price@13 <= Some(15000),7,2 OR ss_sales_price@13 >= Some(5000),7,2 AND ss_sales_price@13 <= Some(10000),7,2 OR ss_sales_price@13 >= Some(15000),7,2 AND ss_sales_price@13 <= Some(20000),7,2) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= Some(10000),7,2 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= Some(20000),7,2 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= Some(15000),7,2 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= Some(30000),7,2 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= Some(5000),7,2 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= Some(25000),7,2) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= Some(10000),7,2 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= Some(15000),7,2 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= Some(5000),7,2 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= Some(10000),7,2 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= Some(15000),7,2 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= Some(20000),7,2), required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_ext_sales_price, ss_ext_wholesale_cost, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= Some(10000),7,2 AND ss_net_profit@22 <= Some(20000),7,2 OR ss_net_profit@22 >= Some(15000),7,2 AND ss_net_profit@22 <= Some(30000),7,2 OR ss_net_profit@22 >= Some(5000),7,2 AND ss_net_profit@22 <= Some(25000),7,2) AND (ss_sales_price@13 >= Some(10000),7,2 AND ss_sales_price@13 <= Some(15000),7,2 OR ss_sales_price@13 >= Some(5000),7,2 AND ss_sales_price@13 <= Some(10000),7,2 OR ss_sales_price@13 >= Some(15000),7,2 AND ss_sales_price@13 <= Some(20000),7,2) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= Some(10000),7,2 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= Some(20000),7,2 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= Some(15000),7,2 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= Some(30000),7,2 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= Some(5000),7,2 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= Some(25000),7,2) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= Some(10000),7,2 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= Some(15000),7,2 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= Some(5000),7,2 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= Some(10000),7,2 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= Some(15000),7,2 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= Some(20000),7,2), required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_ext_sales_price, ss_ext_wholesale_cost, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= 100.00 AND ss_net_profit@22 <= 200.00 OR ss_net_profit@22 >= 150.00 AND ss_net_profit@22 <= 300.00 OR ss_net_profit@22 >= 50.00 AND ss_net_profit@22 <= 250.00) AND (ss_sales_price@13 >= 100.00 AND ss_sales_price@13 <= 150.00 OR ss_sales_price@13 >= 50.00 AND ss_sales_price@13 <= 100.00 OR ss_sales_price@13 >= 150.00 AND ss_sales_price@13 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 100.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 200.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 150.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 300.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 50.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 250.00) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 100.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 150.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 50.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 100.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 150.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 200.00), required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_ext_sales_price, ss_ext_wholesale_cost, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= 100.00 AND ss_net_profit@22 <= 200.00 OR ss_net_profit@22 >= 150.00 AND ss_net_profit@22 <= 300.00 OR ss_net_profit@22 >= 50.00 AND ss_net_profit@22 <= 250.00) AND (ss_sales_price@13 >= 100.00 AND ss_sales_price@13 <= 150.00 OR ss_sales_price@13 >= 50.00 AND ss_sales_price@13 <= 100.00 OR ss_sales_price@13 >= 150.00 AND ss_sales_price@13 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 100.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 200.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 150.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 300.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 50.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 250.00) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 100.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 150.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 50.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 100.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 150.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 200.00), required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_ext_sales_price, ss_ext_wholesale_cost, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= 100.00 AND ss_net_profit@22 <= 200.00 OR ss_net_profit@22 >= 150.00 AND ss_net_profit@22 <= 300.00 OR ss_net_profit@22 >= 50.00 AND ss_net_profit@22 <= 250.00) AND (ss_sales_price@13 >= 100.00 AND ss_sales_price@13 <= 150.00 OR ss_sales_price@13 >= 50.00 AND ss_sales_price@13 <= 100.00 OR ss_sales_price@13 >= 150.00 AND ss_sales_price@13 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 100.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 200.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 150.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 300.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 50.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 250.00) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 100.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 150.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 50.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 100.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 150.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 200.00), required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_ext_sales_price, ss_ext_wholesale_cost, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= 100.00 AND ss_net_profit@22 <= 200.00 OR ss_net_profit@22 >= 150.00 AND ss_net_profit@22 <= 300.00 OR ss_net_profit@22 >= 50.00 AND ss_net_profit@22 <= 250.00) AND (ss_sales_price@13 >= 100.00 AND ss_sales_price@13 <= 150.00 OR ss_sales_price@13 >= 50.00 AND ss_sales_price@13 <= 100.00 OR ss_sales_price@13 >= 150.00 AND ss_sales_price@13 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 100.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 200.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 150.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 300.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 50.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 250.00) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 100.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 150.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 50.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 100.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 150.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 200.00), required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -1627,15 +1594,15 @@ mod tests { #[tokio::test] async fn test_tpcds_14() -> Result<()> { let display = test_tpcds_query("q14").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [channel@0 ASC, i_brand_id@1 ASC, i_class_id@2 ASC, i_category_id@3 ASC], fetch=100 │ SortExec: TopK(fetch=100), expr=[channel@0 ASC, i_brand_id@1 ASC, i_class_id@2 ASC, i_category_id@3 ASC], preserve_partitioning=[true] │ ProjectionExec: expr=[channel@0 as channel, i_brand_id@1 as i_brand_id, i_class_id@2 as i_class_id, i_category_id@3 as i_category_id, sum(y.sales)@5 as sum_sales, sum(y.number_sales)@6 as sum_number_sales] │ AggregateExec: mode=FinalPartitioned, gby=[channel@0 as channel, i_brand_id@1 as i_brand_id, i_class_id@2 as i_class_id, i_category_id@3 as i_category_id, __grouping_id@4 as __grouping_id], aggr=[sum(y.sales), sum(y.number_sales)] - │ [Stage 58] => NetworkShuffleExec: output_partitions=3, input_tasks=2 + │ [Stage 55] => NetworkShuffleExec: output_partitions=3, input_tasks=2 └────────────────────────────────────────────────── - ┌───── Stage 58 ── Tasks: t0:[p0..p2] t1:[p0..p2] + ┌───── Stage 55 ── Tasks: t0:[p0..p2] t1:[p0..p2] │ RepartitionExec: partitioning=Hash([channel@0, i_brand_id@1, i_class_id@2, i_category_id@3, __grouping_id@4], 3), input_partitions=3 │ AggregateExec: mode=Partial, gby=[(NULL as channel, NULL as i_brand_id, NULL as i_class_id, NULL as i_category_id), (channel@0 as channel, NULL as i_brand_id, NULL as i_class_id, NULL as i_category_id), (channel@0 as channel, i_brand_id@1 as i_brand_id, NULL as i_class_id, NULL as i_category_id), (channel@0 as channel, i_brand_id@1 as i_brand_id, i_class_id@2 as i_class_id, NULL as i_category_id), (channel@0 as channel, i_brand_id@1 as i_brand_id, i_class_id@2 as i_class_id, i_category_id@3 as i_category_id)], aggr=[sum(y.sales), sum(y.number_sales)] │ InterleaveExec @@ -1645,21 +1612,21 @@ mod tests { │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=1, stage_partitions=2, input_tasks=1 │ ProjectionExec: expr=[i_brand_id@0 as i_brand_id, i_class_id@1 as i_class_id, i_category_id@2 as i_category_id, sum(store_sales.ss_quantity * store_sales.ss_list_price)@3 as sum(store_sales.ss_quantity * store_sales.ss_list_price), count(Int64(1))@4 as count(Int64(1)), CAST(sum(store_sales.ss_quantity * store_sales.ss_list_price)@3 AS Decimal128(32, 6)) as join_proj_push_down_1] │ AggregateExec: mode=FinalPartitioned, gby=[i_brand_id@0 as i_brand_id, i_class_id@1 as i_class_id, i_category_id@2 as i_category_id], aggr=[sum(store_sales.ss_quantity * store_sales.ss_list_price), count(Int64(1))] - │ [Stage 19] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 18] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ ProjectionExec: expr=[catalog as channel, i_brand_id@1 as i_brand_id, i_class_id@2 as i_class_id, i_category_id@3 as i_category_id, sum(catalog_sales.cs_quantity * catalog_sales.cs_list_price)@4 as sales, count(Int64(1))@5 as number_sales] │ NestedLoopJoinExec: join_type=Inner, filter=join_proj_push_down_2@1 > avg_sales.average_sales@0, projection=[avg_sales.average_sales@0, i_brand_id@1, i_class_id@2, i_category_id@3, sum(catalog_sales.cs_quantity * catalog_sales.cs_list_price)@4, count(Int64(1))@5] │ CoalescePartitionsExec - │ [Stage 24] => NetworkBroadcastExec: partitions_per_consumer=1, stage_partitions=2, input_tasks=1 + │ [Stage 23] => NetworkBroadcastExec: partitions_per_consumer=1, stage_partitions=2, input_tasks=1 │ ProjectionExec: expr=[i_brand_id@0 as i_brand_id, i_class_id@1 as i_class_id, i_category_id@2 as i_category_id, sum(catalog_sales.cs_quantity * catalog_sales.cs_list_price)@3 as sum(catalog_sales.cs_quantity * catalog_sales.cs_list_price), count(Int64(1))@4 as count(Int64(1)), CAST(sum(catalog_sales.cs_quantity * catalog_sales.cs_list_price)@3 AS Decimal128(32, 6)) as join_proj_push_down_2] │ AggregateExec: mode=FinalPartitioned, gby=[i_brand_id@0 as i_brand_id, i_class_id@1 as i_class_id, i_category_id@2 as i_category_id], aggr=[sum(catalog_sales.cs_quantity * catalog_sales.cs_list_price), count(Int64(1))] - │ [Stage 38] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 36] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ ProjectionExec: expr=[web as channel, i_brand_id@1 as i_brand_id, i_class_id@2 as i_class_id, i_category_id@3 as i_category_id, sum(web_sales.ws_quantity * web_sales.ws_list_price)@4 as sales, count(Int64(1))@5 as number_sales] │ NestedLoopJoinExec: join_type=Inner, filter=join_proj_push_down_3@1 > avg_sales.average_sales@0, projection=[avg_sales.average_sales@0, i_brand_id@1, i_class_id@2, i_category_id@3, sum(web_sales.ws_quantity * web_sales.ws_list_price)@4, count(Int64(1))@5] │ CoalescePartitionsExec - │ [Stage 43] => NetworkBroadcastExec: partitions_per_consumer=1, stage_partitions=2, input_tasks=1 + │ [Stage 41] => NetworkBroadcastExec: partitions_per_consumer=1, stage_partitions=2, input_tasks=1 │ ProjectionExec: expr=[i_brand_id@0 as i_brand_id, i_class_id@1 as i_class_id, i_category_id@2 as i_category_id, sum(web_sales.ws_quantity * web_sales.ws_list_price)@3 as sum(web_sales.ws_quantity * web_sales.ws_list_price), count(Int64(1))@4 as count(Int64(1)), CAST(sum(web_sales.ws_quantity * web_sales.ws_list_price)@3 AS Decimal128(32, 6)) as join_proj_push_down_3] │ AggregateExec: mode=FinalPartitioned, gby=[i_brand_id@0 as i_brand_id, i_class_id@1 as i_class_id, i_category_id@2 as i_category_id], aggr=[sum(web_sales.ws_quantity * web_sales.ws_list_price), count(Int64(1))] - │ [Stage 57] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 54] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p1] │ BroadcastExec: input_partitions=1, consumer_tasks=2, output_partitions=2 @@ -1677,7 +1644,7 @@ mod tests { │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=6, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] │ ProjectionExec: expr=[cs_quantity@0 as quantity, cs_list_price@1 as list_price] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_quantity@2, cs_list_price@3] │ CoalescePartitionsExec @@ -1694,620 +1661,578 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p5] t1:[p6..p11] t2:[p12..p17] t3:[p18..p23] │ BroadcastExec: input_partitions=3, consumer_tasks=2, output_partitions=6 │ FilterExec: d_year@1 >= 1999 AND d_year@1 <= 2001, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 │ FilterExec: d_year@1 >= 1999 AND d_year@1 <= 2001, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 │ FilterExec: d_year@1 >= 1999 AND d_year@1 <= 2001, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] └────────────────────────────────────────────────── - ┌───── Stage 19 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] + ┌───── Stage 18 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([i_brand_id@0, i_class_id@1, i_category_id@2], 6), input_partitions=3 │ AggregateExec: mode=Partial, gby=[i_brand_id@2 as i_brand_id, i_class_id@3 as i_class_id, i_category_id@4 as i_category_id], aggr=[sum(store_sales.ss_quantity * store_sales.ss_list_price), count(Int64(1))] │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(ss_item_sk@0, ss_item_sk@0)], projection=[ss_quantity@1, ss_list_price@2, i_brand_id@3, i_class_id@4, i_category_id@5] │ CoalescePartitionsExec - │ [Stage 16] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ [Stage 15] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=1 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_item_sk@2, ss_quantity@3, ss_list_price@4, i_brand_id@5, i_class_id@6, i_category_id@7] │ CoalescePartitionsExec - │ [Stage 17] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ [Stage 16] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@1)], projection=[ss_sold_date_sk@4, ss_item_sk@5, ss_quantity@6, ss_list_price@7, i_brand_id@1, i_class_id@2, i_category_id@3] │ CoalescePartitionsExec - │ [Stage 18] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 17] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 16 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 15 ── Tasks: t0:[p0..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ ProjectionExec: expr=[i_item_sk@0 as ss_item_sk] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_brand_id@1, brand_id@0), (i_class_id@2, class_id@1), (i_category_id@3, category_id@2)], projection=[i_item_sk@0] + │ HashJoinExec: mode=CollectLeft, join_type=LeftSemi, on=[(i_brand_id@1, brand_id@0), (i_class_id@2, class_id@1), (i_category_id@3, category_id@2)], projection=[i_item_sk@0] │ CoalescePartitionsExec - │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet │ HashJoinExec: mode=Partitioned, join_type=RightSemi, on=[(i_brand_id@0, brand_id@0), (i_class_id@1, class_id@1), (i_category_id@2, category_id@2)], NullsEqual: true - │ [Stage 9] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 8] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ AggregateExec: mode=SinglePartitioned, gby=[brand_id@0 as brand_id, class_id@1 as class_id, category_id@2 as category_id], aggr=[] │ HashJoinExec: mode=Partitioned, join_type=RightSemi, on=[(i_brand_id@0, brand_id@0), (i_class_id@1, class_id@1), (i_category_id@2, category_id@2)], NullsEqual: true - │ [Stage 12] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 11] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ AggregateExec: mode=FinalPartitioned, gby=[brand_id@0 as brand_id, class_id@1 as class_id, category_id@2 as category_id], aggr=[] - │ [Stage 15] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 14] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 6 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - └────────────────────────────────────────────────── - ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([i_brand_id@0, i_class_id@1, i_category_id@2], 12), input_partitions=3 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[i_brand_id@2, i_class_id@3, i_category_id@4] + ┌───── Stage 8 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] + │ RepartitionExec: partitioning=Hash([i_brand_id@0, i_class_id@1, i_category_id@2], 3), input_partitions=3 + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[i_brand_id@1, i_class_id@2, i_category_id@3] │ CoalescePartitionsExec - │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ws_item_sk@1)], projection=[ws_sold_date_sk@4, i_brand_id@1, i_class_id@2, i_category_id@3] │ CoalescePartitionsExec - │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 >= 1999 AND d_year@1 <= 2001, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] └────────────────────────────────────────────────── - ┌───── Stage 8 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 12 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([i_brand_id@0, i_class_id@1, i_category_id@2], 12), input_partitions=3 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[i_brand_id@2, i_class_id@3, i_category_id@4] + ┌───── Stage 11 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] + │ RepartitionExec: partitioning=Hash([i_brand_id@0, i_class_id@1, i_category_id@2], 3), input_partitions=3 + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[i_brand_id@1, i_class_id@2, i_category_id@3] │ CoalescePartitionsExec - │ [Stage 10] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, cs_item_sk@1)], projection=[cs_sold_date_sk@4, i_brand_id@1, i_class_id@2, i_category_id@3] │ CoalescePartitionsExec - │ [Stage 11] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 10] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 10 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 >= 1999 AND d_year@1 <= 2001, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] └────────────────────────────────────────────────── - ┌───── Stage 11 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 10 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 15 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([brand_id@0, class_id@1, category_id@2], 12), input_partitions=3 + ┌───── Stage 14 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] + │ RepartitionExec: partitioning=Hash([brand_id@0, class_id@1, category_id@2], 3), input_partitions=3 │ AggregateExec: mode=Partial, gby=[brand_id@0 as brand_id, class_id@1 as class_id, category_id@2 as category_id], aggr=[] │ ProjectionExec: expr=[i_brand_id@0 as brand_id, i_class_id@1 as class_id, i_category_id@2 as category_id] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[i_brand_id@2, i_class_id@3, i_category_id@4] + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[i_brand_id@1, i_class_id@2, i_category_id@3] │ CoalescePartitionsExec - │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ [Stage 12] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@1)], projection=[ss_sold_date_sk@4, i_brand_id@1, i_class_id@2, i_category_id@3] │ CoalescePartitionsExec - │ [Stage 14] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 12 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 >= 1999 AND d_year@1 <= 2001, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] └────────────────────────────────────────────────── - ┌───── Stage 14 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 17 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 16 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2001 AND d_moy@2 = 11, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (2001)] └────────────────────────────────────────────────── - ┌───── Stage 18 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 17 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 24 ── Tasks: t0:[p0..p1] + ┌───── Stage 23 ── Tasks: t0:[p0..p1] │ BroadcastExec: input_partitions=1, consumer_tasks=2, output_partitions=2 │ ProjectionExec: expr=[CAST(avg(sq2.quantity * sq2.list_price)@0 AS Decimal128(32, 6)) as avg_sales.average_sales] │ AggregateExec: mode=Final, gby=[], aggr=[avg(sq2.quantity * sq2.list_price)] │ CoalescePartitionsExec - │ [Stage 23] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 + │ [Stage 22] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 23 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + ┌───── Stage 22 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ AggregateExec: mode=Partial, gby=[], aggr=[avg(sq2.quantity * sq2.list_price)] │ DistributedUnionExec: t0:[c0(0/2)] t1:[c0(1/2)] t2:[c1] t3:[c2] │ ProjectionExec: expr=[ss_quantity@0 as quantity, ss_list_price@1 as list_price] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_quantity@2, ss_list_price@3] │ CoalescePartitionsExec - │ [Stage 20] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=6, input_tasks=4 + │ [Stage 19] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=6, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] │ ProjectionExec: expr=[cs_quantity@0 as quantity, cs_list_price@1 as list_price] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_quantity@2, cs_list_price@3] │ CoalescePartitionsExec - │ [Stage 21] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 + │ [Stage 20] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] │ ProjectionExec: expr=[ws_quantity@0 as quantity, ws_list_price@1 as list_price] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[ws_quantity@2, ws_list_price@3] │ CoalescePartitionsExec - │ [Stage 22] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 + │ [Stage 21] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 20 ── Tasks: t0:[p0..p5] t1:[p6..p11] t2:[p12..p17] t3:[p18..p23] + ┌───── Stage 19 ── Tasks: t0:[p0..p5] t1:[p6..p11] t2:[p12..p17] t3:[p18..p23] │ BroadcastExec: input_partitions=3, consumer_tasks=2, output_partitions=6 │ FilterExec: d_year@1 >= 1999 AND d_year@1 <= 2001, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] └────────────────────────────────────────────────── - ┌───── Stage 21 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + ┌───── Stage 20 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 │ FilterExec: d_year@1 >= 1999 AND d_year@1 <= 2001, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] └────────────────────────────────────────────────── - ┌───── Stage 22 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + ┌───── Stage 21 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 │ FilterExec: d_year@1 >= 1999 AND d_year@1 <= 2001, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] └────────────────────────────────────────────────── - ┌───── Stage 38 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] + ┌───── Stage 36 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([i_brand_id@0, i_class_id@1, i_category_id@2], 6), input_partitions=3 │ AggregateExec: mode=Partial, gby=[i_brand_id@2 as i_brand_id, i_class_id@3 as i_class_id, i_category_id@4 as i_category_id], aggr=[sum(catalog_sales.cs_quantity * catalog_sales.cs_list_price), count(Int64(1))] │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(ss_item_sk@0, cs_item_sk@0)], projection=[cs_quantity@1, cs_list_price@2, i_brand_id@3, i_class_id@4, i_category_id@5] │ CoalescePartitionsExec - │ [Stage 35] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ [Stage 33] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=1 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_item_sk@2, cs_quantity@3, cs_list_price@4, i_brand_id@5, i_class_id@6, i_category_id@7] │ CoalescePartitionsExec - │ [Stage 36] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ [Stage 34] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, cs_item_sk@1)], projection=[cs_sold_date_sk@4, cs_item_sk@5, cs_quantity@6, cs_list_price@7, i_brand_id@1, i_class_id@2, i_category_id@3] │ CoalescePartitionsExec - │ [Stage 37] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 35] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 35 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 33 ── Tasks: t0:[p0..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ ProjectionExec: expr=[i_item_sk@0 as ss_item_sk] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_brand_id@1, brand_id@0), (i_class_id@2, class_id@1), (i_category_id@3, category_id@2)], projection=[i_item_sk@0] + │ HashJoinExec: mode=CollectLeft, join_type=LeftSemi, on=[(i_brand_id@1, brand_id@0), (i_class_id@2, class_id@1), (i_category_id@3, category_id@2)], projection=[i_item_sk@0] │ CoalescePartitionsExec - │ [Stage 25] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet │ HashJoinExec: mode=Partitioned, join_type=RightSemi, on=[(i_brand_id@0, brand_id@0), (i_class_id@1, class_id@1), (i_category_id@2, category_id@2)], NullsEqual: true - │ [Stage 28] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 26] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ AggregateExec: mode=SinglePartitioned, gby=[brand_id@0 as brand_id, class_id@1 as class_id, category_id@2 as category_id], aggr=[] │ HashJoinExec: mode=Partitioned, join_type=RightSemi, on=[(i_brand_id@0, brand_id@0), (i_class_id@1, class_id@1), (i_category_id@2, category_id@2)], NullsEqual: true - │ [Stage 31] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 29] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ AggregateExec: mode=FinalPartitioned, gby=[brand_id@0 as brand_id, class_id@1 as class_id, category_id@2 as category_id], aggr=[] - │ [Stage 34] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 32] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 25 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - └────────────────────────────────────────────────── - ┌───── Stage 28 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([i_brand_id@0, i_class_id@1, i_category_id@2], 12), input_partitions=3 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[i_brand_id@2, i_class_id@3, i_category_id@4] + ┌───── Stage 26 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] + │ RepartitionExec: partitioning=Hash([i_brand_id@0, i_class_id@1, i_category_id@2], 3), input_partitions=3 + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[i_brand_id@1, i_class_id@2, i_category_id@3] │ CoalescePartitionsExec - │ [Stage 26] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ [Stage 24] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ws_item_sk@1)], projection=[ws_sold_date_sk@4, i_brand_id@1, i_class_id@2, i_category_id@3] │ CoalescePartitionsExec - │ [Stage 27] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 25] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 26 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 24 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 >= 1999 AND d_year@1 <= 2001, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] └────────────────────────────────────────────────── - ┌───── Stage 27 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 25 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 31 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([i_brand_id@0, i_class_id@1, i_category_id@2], 12), input_partitions=3 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[i_brand_id@2, i_class_id@3, i_category_id@4] + ┌───── Stage 29 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] + │ RepartitionExec: partitioning=Hash([i_brand_id@0, i_class_id@1, i_category_id@2], 3), input_partitions=3 + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[i_brand_id@1, i_class_id@2, i_category_id@3] │ CoalescePartitionsExec - │ [Stage 29] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ [Stage 27] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, cs_item_sk@1)], projection=[cs_sold_date_sk@4, i_brand_id@1, i_class_id@2, i_category_id@3] │ CoalescePartitionsExec - │ [Stage 30] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 28] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 29 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 27 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 >= 1999 AND d_year@1 <= 2001, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] └────────────────────────────────────────────────── - ┌───── Stage 30 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 28 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 34 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([brand_id@0, class_id@1, category_id@2], 12), input_partitions=3 + ┌───── Stage 32 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] + │ RepartitionExec: partitioning=Hash([brand_id@0, class_id@1, category_id@2], 3), input_partitions=3 │ AggregateExec: mode=Partial, gby=[brand_id@0 as brand_id, class_id@1 as class_id, category_id@2 as category_id], aggr=[] │ ProjectionExec: expr=[i_brand_id@0 as brand_id, i_class_id@1 as class_id, i_category_id@2 as category_id] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[i_brand_id@2, i_class_id@3, i_category_id@4] + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[i_brand_id@1, i_class_id@2, i_category_id@3] │ CoalescePartitionsExec - │ [Stage 32] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ [Stage 30] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@1)], projection=[ss_sold_date_sk@4, i_brand_id@1, i_class_id@2, i_category_id@3] │ CoalescePartitionsExec - │ [Stage 33] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 31] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 32 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 30 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 >= 1999 AND d_year@1 <= 2001, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] └────────────────────────────────────────────────── - ┌───── Stage 33 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 31 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 36 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 34 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2001 AND d_moy@2 = 11, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (2001)] └────────────────────────────────────────────────── - ┌───── Stage 37 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 35 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 43 ── Tasks: t0:[p0..p1] + ┌───── Stage 41 ── Tasks: t0:[p0..p1] │ BroadcastExec: input_partitions=1, consumer_tasks=2, output_partitions=2 │ ProjectionExec: expr=[CAST(avg(sq2.quantity * sq2.list_price)@0 AS Decimal128(32, 6)) as avg_sales.average_sales] │ AggregateExec: mode=Final, gby=[], aggr=[avg(sq2.quantity * sq2.list_price)] │ CoalescePartitionsExec - │ [Stage 42] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 + │ [Stage 40] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 42 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + ┌───── Stage 40 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ AggregateExec: mode=Partial, gby=[], aggr=[avg(sq2.quantity * sq2.list_price)] │ DistributedUnionExec: t0:[c0(0/2)] t1:[c0(1/2)] t2:[c1] t3:[c2] │ ProjectionExec: expr=[ss_quantity@0 as quantity, ss_list_price@1 as list_price] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_quantity@2, ss_list_price@3] │ CoalescePartitionsExec - │ [Stage 39] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=6, input_tasks=4 + │ [Stage 37] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=6, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] │ ProjectionExec: expr=[cs_quantity@0 as quantity, cs_list_price@1 as list_price] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_quantity@2, cs_list_price@3] │ CoalescePartitionsExec - │ [Stage 40] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 + │ [Stage 38] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] │ ProjectionExec: expr=[ws_quantity@0 as quantity, ws_list_price@1 as list_price] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[ws_quantity@2, ws_list_price@3] │ CoalescePartitionsExec - │ [Stage 41] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 + │ [Stage 39] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 39 ── Tasks: t0:[p0..p5] t1:[p6..p11] t2:[p12..p17] t3:[p18..p23] + ┌───── Stage 37 ── Tasks: t0:[p0..p5] t1:[p6..p11] t2:[p12..p17] t3:[p18..p23] │ BroadcastExec: input_partitions=3, consumer_tasks=2, output_partitions=6 │ FilterExec: d_year@1 >= 1999 AND d_year@1 <= 2001, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] └────────────────────────────────────────────────── - ┌───── Stage 40 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + ┌───── Stage 38 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 │ FilterExec: d_year@1 >= 1999 AND d_year@1 <= 2001, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] └────────────────────────────────────────────────── - ┌───── Stage 41 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + ┌───── Stage 39 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 │ FilterExec: d_year@1 >= 1999 AND d_year@1 <= 2001, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] └────────────────────────────────────────────────── - ┌───── Stage 57 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] + ┌───── Stage 54 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([i_brand_id@0, i_class_id@1, i_category_id@2], 6), input_partitions=3 │ AggregateExec: mode=Partial, gby=[i_brand_id@2 as i_brand_id, i_class_id@3 as i_class_id, i_category_id@4 as i_category_id], aggr=[sum(web_sales.ws_quantity * web_sales.ws_list_price), count(Int64(1))] │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(ss_item_sk@0, ws_item_sk@0)], projection=[ws_quantity@1, ws_list_price@2, i_brand_id@3, i_class_id@4, i_category_id@5] │ CoalescePartitionsExec - │ [Stage 54] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ [Stage 51] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=1 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[ws_item_sk@2, ws_quantity@3, ws_list_price@4, i_brand_id@5, i_class_id@6, i_category_id@7] │ CoalescePartitionsExec - │ [Stage 55] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ [Stage 52] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ws_item_sk@1)], projection=[ws_sold_date_sk@4, ws_item_sk@5, ws_quantity@6, ws_list_price@7, i_brand_id@1, i_class_id@2, i_category_id@3] │ CoalescePartitionsExec - │ [Stage 56] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 53] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 54 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 51 ── Tasks: t0:[p0..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ ProjectionExec: expr=[i_item_sk@0 as ss_item_sk] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_brand_id@1, brand_id@0), (i_class_id@2, class_id@1), (i_category_id@3, category_id@2)], projection=[i_item_sk@0] + │ HashJoinExec: mode=CollectLeft, join_type=LeftSemi, on=[(i_brand_id@1, brand_id@0), (i_class_id@2, class_id@1), (i_category_id@3, category_id@2)], projection=[i_item_sk@0] │ CoalescePartitionsExec - │ [Stage 44] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet │ HashJoinExec: mode=Partitioned, join_type=RightSemi, on=[(i_brand_id@0, brand_id@0), (i_class_id@1, class_id@1), (i_category_id@2, category_id@2)], NullsEqual: true - │ [Stage 47] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 44] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ AggregateExec: mode=SinglePartitioned, gby=[brand_id@0 as brand_id, class_id@1 as class_id, category_id@2 as category_id], aggr=[] │ HashJoinExec: mode=Partitioned, join_type=RightSemi, on=[(i_brand_id@0, brand_id@0), (i_class_id@1, class_id@1), (i_category_id@2, category_id@2)], NullsEqual: true - │ [Stage 50] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 47] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ AggregateExec: mode=FinalPartitioned, gby=[brand_id@0 as brand_id, class_id@1 as class_id, category_id@2 as category_id], aggr=[] - │ [Stage 53] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 50] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 44 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - └────────────────────────────────────────────────── - ┌───── Stage 47 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([i_brand_id@0, i_class_id@1, i_category_id@2], 12), input_partitions=3 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[i_brand_id@2, i_class_id@3, i_category_id@4] + ┌───── Stage 44 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] + │ RepartitionExec: partitioning=Hash([i_brand_id@0, i_class_id@1, i_category_id@2], 3), input_partitions=3 + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[i_brand_id@1, i_class_id@2, i_category_id@3] │ CoalescePartitionsExec - │ [Stage 45] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ [Stage 42] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ws_item_sk@1)], projection=[ws_sold_date_sk@4, i_brand_id@1, i_class_id@2, i_category_id@3] │ CoalescePartitionsExec - │ [Stage 46] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 43] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 45 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 42 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 >= 1999 AND d_year@1 <= 2001, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] └────────────────────────────────────────────────── - ┌───── Stage 46 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 43 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 50 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([i_brand_id@0, i_class_id@1, i_category_id@2], 12), input_partitions=3 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[i_brand_id@2, i_class_id@3, i_category_id@4] + ┌───── Stage 47 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] + │ RepartitionExec: partitioning=Hash([i_brand_id@0, i_class_id@1, i_category_id@2], 3), input_partitions=3 + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[i_brand_id@1, i_class_id@2, i_category_id@3] │ CoalescePartitionsExec - │ [Stage 48] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ [Stage 45] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, cs_item_sk@1)], projection=[cs_sold_date_sk@4, i_brand_id@1, i_class_id@2, i_category_id@3] │ CoalescePartitionsExec - │ [Stage 49] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 46] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 48 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 45 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 >= 1999 AND d_year@1 <= 2001, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] └────────────────────────────────────────────────── - ┌───── Stage 49 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 46 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 53 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([brand_id@0, class_id@1, category_id@2], 12), input_partitions=3 + ┌───── Stage 50 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] + │ RepartitionExec: partitioning=Hash([brand_id@0, class_id@1, category_id@2], 3), input_partitions=3 │ AggregateExec: mode=Partial, gby=[brand_id@0 as brand_id, class_id@1 as class_id, category_id@2 as category_id], aggr=[] │ ProjectionExec: expr=[i_brand_id@0 as brand_id, i_class_id@1 as class_id, i_category_id@2 as category_id] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[i_brand_id@2, i_class_id@3, i_category_id@4] + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[i_brand_id@1, i_class_id@2, i_category_id@3] │ CoalescePartitionsExec - │ [Stage 51] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ [Stage 48] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@1)], projection=[ss_sold_date_sk@4, i_brand_id@1, i_class_id@2, i_category_id@3] │ CoalescePartitionsExec - │ [Stage 52] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 49] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 51 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 48 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 >= 1999 AND d_year@1 <= 2001, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 >= 1999 AND d_year@6 <= 2001, pruning_predicate=d_year_null_count@1 != row_count@2 AND d_year_max@0 >= 1999 AND d_year_null_count@1 != row_count@2 AND d_year_min@3 <= 2001, required_guarantees=[] └────────────────────────────────────────────────── - ┌───── Stage 52 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 49 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 55 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 52 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2001 AND d_moy@2 = 11, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (2001)] └────────────────────────────────────────────────── - ┌───── Stage 56 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 53 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet └────────────────────────────────────────────────── "); Ok(()) @@ -2315,7 +2240,7 @@ mod tests { #[tokio::test] async fn test_tpcds_15() -> Result<()> { let display = test_tpcds_query("q15").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [ca_zip@0 ASC], fetch=100 │ [Stage 5] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -2331,12 +2256,12 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_sales_price@2, ca_zip@3] │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, c_current_addr_sk@2)], filter=substr(ca_zip@2, 1, 5) IN (SET) ([85669, 86197, 88274, 83405, 86475, 85392, 85460, 80348, 81792]) OR ca_state@1 = CA OR ca_state@1 = WA OR ca_state@1 = GA OR cs_sales_price@0 > Some(50000),7,2, projection=[cs_sold_date_sk@3, cs_sales_price@4, ca_zip@2] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, c_current_addr_sk@2)], filter=substr(ca_zip@2, 1, 5) IN (SET) ([85669, 86197, 88274, 83405, 86475, 85392, 85460, 80348, 81792]) OR ca_state@1 = CA OR ca_state@1 = WA OR ca_state@1 = GA OR cs_sales_price@0 > 500.00, projection=[cs_sold_date_sk@3, cs_sales_price@4, ca_zip@2] │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, cs_bill_customer_sk@1)], projection=[cs_sold_date_sk@2, cs_sales_price@4, c_current_addr_sk@1] │ CoalescePartitionsExec - │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] @@ -2346,28 +2271,27 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_qoy@2 = 2 AND d_year@1 = 2001, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2001, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2001, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2001, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2001, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2001, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2001, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2001, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2001, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2001)] └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 3 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── "); Ok(()) @@ -2375,7 +2299,7 @@ mod tests { #[tokio::test] async fn test_tpcds_16() -> Result<()> { let display = test_tpcds_query("q16").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ ProjectionExec: expr=[count(alias1)@0 as order count, sum(alias2)@1 as total shipping cost, sum(alias3)@2 as total net profit] │ GlobalLimitExec: skip=0, fetch=100 @@ -2424,22 +2348,20 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: ca_state@1 = GA, projection=[ca_address_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = GA, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= GA AND GA <= ca_state_max@1, required_guarantees=[ca_state in (GA)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = GA, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= GA AND GA <= ca_state_max@1, required_guarantees=[ca_state in (GA)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = GA, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= GA AND GA <= ca_state_max@1, required_guarantees=[ca_state in (GA)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = GA, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= GA AND GA <= ca_state_max@1, required_guarantees=[ca_state in (GA)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = GA, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= GA AND GA <= ca_state_max@1, required_guarantees=[ca_state in (GA)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = GA, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= GA AND GA <= ca_state_max@1, required_guarantees=[ca_state in (GA)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = GA, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= GA AND GA <= ca_state_max@1, required_guarantees=[ca_state in (GA)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = GA, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= GA AND GA <= ca_state_max@1, required_guarantees=[ca_state in (GA)] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_date@1 >= 2002-02-01 AND d_date@1 <= 2002-04-02, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2002-02-01 AND d_date@2 <= 2002-04-02, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2002-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2002-04-02, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2002-02-01 AND d_date@2 <= 2002-04-02, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2002-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2002-04-02, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2002-02-01 AND d_date@2 <= 2002-04-02, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2002-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2002-04-02, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2002-02-01 AND d_date@2 <= 2002-04-02, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2002-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2002-04-02, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2002-02-01 AND d_date@2 <= 2002-04-02, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2002-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2002-04-02, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2002-02-01 AND d_date@2 <= 2002-04-02, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2002-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2002-04-02, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2002-02-01 AND d_date@2 <= 2002-04-02, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2002-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2002-04-02, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2002-02-01 AND d_date@2 <= 2002-04-02, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2002-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2002-04-02, required_guarantees=[] └────────────────────────────────────────────────── "); Ok(()) @@ -2447,7 +2369,7 @@ mod tests { #[tokio::test] async fn test_tpcds_17() -> Result<()> { let display = test_tpcds_query("q17").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [i_item_id@0 ASC, i_item_desc@1 ASC, s_state@2 ASC], fetch=100 │ [Stage 11] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -2464,7 +2386,7 @@ mod tests { │ ProjectionExec: expr=[CAST(ss_quantity@0 AS Float64) as __common_expr_1, CAST(sr_return_quantity@1 AS Float64) as __common_expr_2, CAST(cs_quantity@2 AS Float64) as __common_expr_3, ss_quantity@0 as ss_quantity, sr_return_quantity@1 as sr_return_quantity, cs_quantity@2 as cs_quantity, s_state@3 as s_state, i_item_id@4 as i_item_id, i_item_desc@5 as i_item_desc] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@0)], projection=[ss_quantity@4, sr_return_quantity@5, cs_quantity@6, s_state@7, i_item_id@1, i_item_desc@2] │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(s_store_sk@0, ss_store_sk@1)], projection=[ss_item_sk@2, ss_quantity@4, sr_return_quantity@5, cs_quantity@6, s_state@1] │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 @@ -2481,13 +2403,13 @@ mod tests { │ [Stage 6] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ [Stage 9] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -2500,32 +2422,29 @@ mod tests { ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_quarter_name@1 = 2001Q1 OR d_quarter_name@1 = 2001Q2 OR d_quarter_name@1 = 2001Q3, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_quarter_name], file_type=parquet, predicate=d_quarter_name@15 = 2001Q1 OR d_quarter_name@15 = 2001Q2 OR d_quarter_name@15 = 2001Q3, pruning_predicate=d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q1 AND 2001Q1 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q2 AND 2001Q2 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q3 AND 2001Q3 <= d_quarter_name_max@1, required_guarantees=[d_quarter_name in (2001Q1, 2001Q2, 2001Q3)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_quarter_name], file_type=parquet, predicate=d_quarter_name@15 = 2001Q1 OR d_quarter_name@15 = 2001Q2 OR d_quarter_name@15 = 2001Q3, pruning_predicate=d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q1 AND 2001Q1 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q2 AND 2001Q2 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q3 AND 2001Q3 <= d_quarter_name_max@1, required_guarantees=[d_quarter_name in (2001Q1, 2001Q2, 2001Q3)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_quarter_name], file_type=parquet, predicate=d_quarter_name@15 = 2001Q1 OR d_quarter_name@15 = 2001Q2 OR d_quarter_name@15 = 2001Q3, pruning_predicate=d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q1 AND 2001Q1 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q2 AND 2001Q2 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q3 AND 2001Q3 <= d_quarter_name_max@1, required_guarantees=[d_quarter_name in (2001Q1, 2001Q2, 2001Q3)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_quarter_name], file_type=parquet, predicate=d_quarter_name@15 = 2001Q1 OR d_quarter_name@15 = 2001Q2 OR d_quarter_name@15 = 2001Q3, pruning_predicate=d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q1 AND 2001Q1 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q2 AND 2001Q2 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q3 AND 2001Q3 <= d_quarter_name_max@1, required_guarantees=[d_quarter_name in (2001Q1, 2001Q2, 2001Q3)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_quarter_name], file_type=parquet, predicate=d_quarter_name@15 = 2001Q1 OR d_quarter_name@15 = 2001Q2 OR d_quarter_name@15 = 2001Q3, pruning_predicate=d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q1 AND 2001Q1 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q2 AND 2001Q2 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q3 AND 2001Q3 <= d_quarter_name_max@1, required_guarantees=[d_quarter_name in (2001Q1, 2001Q2, 2001Q3)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_quarter_name], file_type=parquet, predicate=d_quarter_name@15 = 2001Q1 OR d_quarter_name@15 = 2001Q2 OR d_quarter_name@15 = 2001Q3, pruning_predicate=d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q1 AND 2001Q1 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q2 AND 2001Q2 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q3 AND 2001Q3 <= d_quarter_name_max@1, required_guarantees=[d_quarter_name in (2001Q1, 2001Q2, 2001Q3)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_quarter_name], file_type=parquet, predicate=d_quarter_name@15 = 2001Q1 OR d_quarter_name@15 = 2001Q2 OR d_quarter_name@15 = 2001Q3, pruning_predicate=d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q1 AND 2001Q1 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q2 AND 2001Q2 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q3 AND 2001Q3 <= d_quarter_name_max@1, required_guarantees=[d_quarter_name in (2001Q1, 2001Q2, 2001Q3)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_quarter_name], file_type=parquet, predicate=d_quarter_name@15 = 2001Q1 OR d_quarter_name@15 = 2001Q2 OR d_quarter_name@15 = 2001Q3, pruning_predicate=d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q1 AND 2001Q1 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q2 AND 2001Q2 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q3 AND 2001Q3 <= d_quarter_name_max@1, required_guarantees=[d_quarter_name in (2001Q1, 2001Q2, 2001Q3)] └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_quarter_name@1 = 2001Q1 OR d_quarter_name@1 = 2001Q2 OR d_quarter_name@1 = 2001Q3, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_quarter_name], file_type=parquet, predicate=d_quarter_name@15 = 2001Q1 OR d_quarter_name@15 = 2001Q2 OR d_quarter_name@15 = 2001Q3, pruning_predicate=d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q1 AND 2001Q1 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q2 AND 2001Q2 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q3 AND 2001Q3 <= d_quarter_name_max@1, required_guarantees=[d_quarter_name in (2001Q1, 2001Q2, 2001Q3)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_quarter_name], file_type=parquet, predicate=d_quarter_name@15 = 2001Q1 OR d_quarter_name@15 = 2001Q2 OR d_quarter_name@15 = 2001Q3, pruning_predicate=d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q1 AND 2001Q1 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q2 AND 2001Q2 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q3 AND 2001Q3 <= d_quarter_name_max@1, required_guarantees=[d_quarter_name in (2001Q1, 2001Q2, 2001Q3)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_quarter_name], file_type=parquet, predicate=d_quarter_name@15 = 2001Q1 OR d_quarter_name@15 = 2001Q2 OR d_quarter_name@15 = 2001Q3, pruning_predicate=d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q1 AND 2001Q1 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q2 AND 2001Q2 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q3 AND 2001Q3 <= d_quarter_name_max@1, required_guarantees=[d_quarter_name in (2001Q1, 2001Q2, 2001Q3)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_quarter_name], file_type=parquet, predicate=d_quarter_name@15 = 2001Q1 OR d_quarter_name@15 = 2001Q2 OR d_quarter_name@15 = 2001Q3, pruning_predicate=d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q1 AND 2001Q1 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q2 AND 2001Q2 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q3 AND 2001Q3 <= d_quarter_name_max@1, required_guarantees=[d_quarter_name in (2001Q1, 2001Q2, 2001Q3)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_quarter_name], file_type=parquet, predicate=d_quarter_name@15 = 2001Q1 OR d_quarter_name@15 = 2001Q2 OR d_quarter_name@15 = 2001Q3, pruning_predicate=d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q1 AND 2001Q1 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q2 AND 2001Q2 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q3 AND 2001Q3 <= d_quarter_name_max@1, required_guarantees=[d_quarter_name in (2001Q1, 2001Q2, 2001Q3)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_quarter_name], file_type=parquet, predicate=d_quarter_name@15 = 2001Q1 OR d_quarter_name@15 = 2001Q2 OR d_quarter_name@15 = 2001Q3, pruning_predicate=d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q1 AND 2001Q1 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q2 AND 2001Q2 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q3 AND 2001Q3 <= d_quarter_name_max@1, required_guarantees=[d_quarter_name in (2001Q1, 2001Q2, 2001Q3)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_quarter_name], file_type=parquet, predicate=d_quarter_name@15 = 2001Q1 OR d_quarter_name@15 = 2001Q2 OR d_quarter_name@15 = 2001Q3, pruning_predicate=d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q1 AND 2001Q1 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q2 AND 2001Q2 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q3 AND 2001Q3 <= d_quarter_name_max@1, required_guarantees=[d_quarter_name in (2001Q1, 2001Q2, 2001Q3)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_quarter_name], file_type=parquet, predicate=d_quarter_name@15 = 2001Q1 OR d_quarter_name@15 = 2001Q2 OR d_quarter_name@15 = 2001Q3, pruning_predicate=d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q1 AND 2001Q1 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q2 AND 2001Q2 <= d_quarter_name_max@1 OR d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q3 AND 2001Q3 <= d_quarter_name_max@1, required_guarantees=[d_quarter_name in (2001Q1, 2001Q2, 2001Q3)] └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_quarter_name@1 = 2001Q1, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_quarter_name], file_type=parquet, predicate=d_quarter_name@15 = 2001Q1, pruning_predicate=d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q1 AND 2001Q1 <= d_quarter_name_max@1, required_guarantees=[d_quarter_name in (2001Q1)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_quarter_name], file_type=parquet, predicate=d_quarter_name@15 = 2001Q1, pruning_predicate=d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q1 AND 2001Q1 <= d_quarter_name_max@1, required_guarantees=[d_quarter_name in (2001Q1)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_quarter_name], file_type=parquet, predicate=d_quarter_name@15 = 2001Q1, pruning_predicate=d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q1 AND 2001Q1 <= d_quarter_name_max@1, required_guarantees=[d_quarter_name in (2001Q1)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_quarter_name], file_type=parquet, predicate=d_quarter_name@15 = 2001Q1, pruning_predicate=d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q1 AND 2001Q1 <= d_quarter_name_max@1, required_guarantees=[d_quarter_name in (2001Q1)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_quarter_name], file_type=parquet, predicate=d_quarter_name@15 = 2001Q1, pruning_predicate=d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q1 AND 2001Q1 <= d_quarter_name_max@1, required_guarantees=[d_quarter_name in (2001Q1)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_quarter_name], file_type=parquet, predicate=d_quarter_name@15 = 2001Q1, pruning_predicate=d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q1 AND 2001Q1 <= d_quarter_name_max@1, required_guarantees=[d_quarter_name in (2001Q1)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_quarter_name], file_type=parquet, predicate=d_quarter_name@15 = 2001Q1, pruning_predicate=d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q1 AND 2001Q1 <= d_quarter_name_max@1, required_guarantees=[d_quarter_name in (2001Q1)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_quarter_name], file_type=parquet, predicate=d_quarter_name@15 = 2001Q1, pruning_predicate=d_quarter_name_null_count@2 != row_count@3 AND d_quarter_name_min@0 <= 2001Q1 AND 2001Q1 <= d_quarter_name_max@1, required_guarantees=[d_quarter_name in (2001Q1)] └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cs_bill_customer_sk@1, cs_item_sk@2], 12), input_partitions=3 @@ -2563,7 +2482,7 @@ mod tests { #[tokio::test] async fn test_tpcds_18() -> Result<()> { let display = test_tpcds_query("q18").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [ca_country@1 ASC, ca_state@2 ASC, ca_county@3 ASC, i_item_id@0 ASC], fetch=100 │ [Stage 10] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -2580,12 +2499,11 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(cs_item_sk@0, i_item_sk@0)], projection=[cs_quantity@1, cs_list_price@2, cs_sales_price@3, cs_coupon_amt@4, cs_net_profit@5, cd_dep_count@6, c_birth_year@7, ca_county@8, ca_state@9, ca_country@10, i_item_id@12] │ CoalescePartitionsExec │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -2602,22 +2520,20 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 1998, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 1998, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1, required_guarantees=[d_year in (1998)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 1998, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1, required_guarantees=[d_year in (1998)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 1998, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1, required_guarantees=[d_year in (1998)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 1998, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1, required_guarantees=[d_year in (1998)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 1998, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1, required_guarantees=[d_year in (1998)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 1998, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1, required_guarantees=[d_year in (1998)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 1998, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1, required_guarantees=[d_year in (1998)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 1998, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1, required_guarantees=[d_year in (1998)] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: ca_state@2 IN (SET) ([MS, IN, ND, OK, NM, VA, MS]) - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_county, ca_state, ca_country], file_type=parquet, predicate=ca_state@8 IN (SET) ([MS, IN, ND, OK, NM, VA, MS]), pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= MS AND MS <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= IN AND IN <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= ND AND ND <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= OK AND OK <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= NM AND NM <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= VA AND VA <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= MS AND MS <= ca_state_max@1, required_guarantees=[ca_state in (IN, MS, ND, NM, OK, VA)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county, ca_state, ca_country], file_type=parquet, predicate=ca_state@8 IN (SET) ([MS, IN, ND, OK, NM, VA, MS]), pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= MS AND MS <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= IN AND IN <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= ND AND ND <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= OK AND OK <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= NM AND NM <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= VA AND VA <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= MS AND MS <= ca_state_max@1, required_guarantees=[ca_state in (IN, MS, ND, NM, OK, VA)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county, ca_state, ca_country], file_type=parquet, predicate=ca_state@8 IN (SET) ([MS, IN, ND, OK, NM, VA, MS]), pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= MS AND MS <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= IN AND IN <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= ND AND ND <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= OK AND OK <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= NM AND NM <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= VA AND VA <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= MS AND MS <= ca_state_max@1, required_guarantees=[ca_state in (IN, MS, ND, NM, OK, VA)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county, ca_state, ca_country], file_type=parquet, predicate=ca_state@8 IN (SET) ([MS, IN, ND, OK, NM, VA, MS]), pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= MS AND MS <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= IN AND IN <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= ND AND ND <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= OK AND OK <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= NM AND NM <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= VA AND VA <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= MS AND MS <= ca_state_max@1, required_guarantees=[ca_state in (IN, MS, ND, NM, OK, VA)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county, ca_state, ca_country], file_type=parquet, predicate=ca_state@8 IN (SET) ([MS, IN, ND, OK, NM, VA, MS]), pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= MS AND MS <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= IN AND IN <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= ND AND ND <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= OK AND OK <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= NM AND NM <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= VA AND VA <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= MS AND MS <= ca_state_max@1, required_guarantees=[ca_state in (IN, MS, ND, NM, OK, VA)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county, ca_state, ca_country], file_type=parquet, predicate=ca_state@8 IN (SET) ([MS, IN, ND, OK, NM, VA, MS]), pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= MS AND MS <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= IN AND IN <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= ND AND ND <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= OK AND OK <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= NM AND NM <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= VA AND VA <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= MS AND MS <= ca_state_max@1, required_guarantees=[ca_state in (IN, MS, ND, NM, OK, VA)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county, ca_state, ca_country], file_type=parquet, predicate=ca_state@8 IN (SET) ([MS, IN, ND, OK, NM, VA, MS]), pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= MS AND MS <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= IN AND IN <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= ND AND ND <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= OK AND OK <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= NM AND NM <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= VA AND VA <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= MS AND MS <= ca_state_max@1, required_guarantees=[ca_state in (IN, MS, ND, NM, OK, VA)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county, ca_state, ca_country], file_type=parquet, predicate=ca_state@8 IN (SET) ([MS, IN, ND, OK, NM, VA, MS]), pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= MS AND MS <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= IN AND IN <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= ND AND ND <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= OK AND OK <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= NM AND NM <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= VA AND VA <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= MS AND MS <= ca_state_max@1, required_guarantees=[ca_state in (IN, MS, ND, NM, OK, VA)] └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([c_current_cdemo_sk@8], 12), input_partitions=3 @@ -2631,12 +2547,11 @@ mod tests { ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: c_birth_month@3 IN (SET) ([1, 6, 8, 9, 12, 2]), projection=[c_customer_sk@0, c_current_cdemo_sk@1, c_current_addr_sk@2, c_birth_year@4] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk, c_birth_month, c_birth_year], file_type=parquet, predicate=c_birth_month@12 IN (SET) ([1, 6, 8, 9, 12, 2]) AND DynamicFilter [ empty ], pruning_predicate=c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 1 AND 1 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 6 AND 6 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 8 AND 8 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 9 AND 9 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 12 AND 12 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 2 AND 2 <= c_birth_month_max@1, required_guarantees=[c_birth_month in (1, 12, 2, 6, 8, 9)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk, c_birth_month, c_birth_year], file_type=parquet, predicate=c_birth_month@12 IN (SET) ([1, 6, 8, 9, 12, 2]) AND DynamicFilter [ empty ], pruning_predicate=c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 1 AND 1 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 6 AND 6 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 8 AND 8 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 9 AND 9 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 12 AND 12 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 2 AND 2 <= c_birth_month_max@1, required_guarantees=[c_birth_month in (1, 12, 2, 6, 8, 9)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk, c_birth_month, c_birth_year], file_type=parquet, predicate=c_birth_month@12 IN (SET) ([1, 6, 8, 9, 12, 2]) AND DynamicFilter [ empty ], pruning_predicate=c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 1 AND 1 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 6 AND 6 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 8 AND 8 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 9 AND 9 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 12 AND 12 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 2 AND 2 <= c_birth_month_max@1, required_guarantees=[c_birth_month in (1, 12, 2, 6, 8, 9)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk, c_birth_month, c_birth_year], file_type=parquet, predicate=c_birth_month@12 IN (SET) ([1, 6, 8, 9, 12, 2]) AND DynamicFilter [ empty ], pruning_predicate=c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 1 AND 1 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 6 AND 6 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 8 AND 8 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 9 AND 9 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 12 AND 12 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 2 AND 2 <= c_birth_month_max@1, required_guarantees=[c_birth_month in (1, 12, 2, 6, 8, 9)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk, c_birth_month, c_birth_year], file_type=parquet, predicate=c_birth_month@12 IN (SET) ([1, 6, 8, 9, 12, 2]) AND DynamicFilter [ empty ], pruning_predicate=c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 1 AND 1 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 6 AND 6 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 8 AND 8 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 9 AND 9 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 12 AND 12 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 2 AND 2 <= c_birth_month_max@1, required_guarantees=[c_birth_month in (1, 12, 2, 6, 8, 9)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk, c_birth_month, c_birth_year], file_type=parquet, predicate=c_birth_month@12 IN (SET) ([1, 6, 8, 9, 12, 2]) AND DynamicFilter [ empty ], pruning_predicate=c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 1 AND 1 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 6 AND 6 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 8 AND 8 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 9 AND 9 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 12 AND 12 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 2 AND 2 <= c_birth_month_max@1, required_guarantees=[c_birth_month in (1, 12, 2, 6, 8, 9)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk, c_birth_month, c_birth_year], file_type=parquet, predicate=c_birth_month@12 IN (SET) ([1, 6, 8, 9, 12, 2]) AND DynamicFilter [ empty ], pruning_predicate=c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 1 AND 1 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 6 AND 6 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 8 AND 8 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 9 AND 9 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 12 AND 12 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 2 AND 2 <= c_birth_month_max@1, required_guarantees=[c_birth_month in (1, 12, 2, 6, 8, 9)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk, c_birth_month, c_birth_year], file_type=parquet, predicate=c_birth_month@12 IN (SET) ([1, 6, 8, 9, 12, 2]) AND DynamicFilter [ empty ], pruning_predicate=c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 1 AND 1 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 6 AND 6 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 8 AND 8 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 9 AND 9 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 12 AND 12 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 2 AND 2 <= c_birth_month_max@1, required_guarantees=[c_birth_month in (1, 12, 2, 6, 8, 9)] └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cd_demo_sk@0], 12), input_partitions=3 @@ -2645,7 +2560,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_education_status, cd_dep_count], file_type=parquet, predicate=cd_gender@1 = F AND cd_education_status@3 = Unknown, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= F AND F <= cd_gender_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Unknown AND Unknown <= cd_education_status_max@5, required_guarantees=[cd_education_status in (Unknown), cd_gender in (F)] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_education_status, cd_dep_count], file_type=parquet, predicate=cd_gender@1 = F AND cd_education_status@3 = Unknown, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= F AND F <= cd_gender_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Unknown AND Unknown <= cd_education_status_max@5, required_guarantees=[cd_education_status in (Unknown), cd_gender in (F)] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_education_status, cd_dep_count], file_type=parquet, predicate=cd_gender@1 = F AND cd_education_status@3 = Unknown, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= F AND F <= cd_gender_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Unknown AND Unknown <= cd_education_status_max@5, required_guarantees=[cd_education_status in (Unknown), cd_gender in (F)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_education_status, cd_dep_count], file_type=parquet, predicate=cd_gender@1 = F AND cd_education_status@3 = Unknown, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= F AND F <= cd_gender_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Unknown AND Unknown <= cd_education_status_max@5, required_guarantees=[cd_education_status in (Unknown), cd_gender in (F)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_education_status, cd_dep_count], file_type=parquet, predicate=cd_gender@1 = F AND cd_education_status@3 = Unknown, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= F AND F <= cd_gender_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Unknown AND Unknown <= cd_education_status_max@5, required_guarantees=[cd_education_status in (Unknown), cd_gender in (F)] └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cs_bill_cdemo_sk@2], 12), input_partitions=3 @@ -2661,7 +2576,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk], file_type=parquet, predicate=DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk], file_type=parquet, predicate=DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── "); Ok(()) @@ -2669,7 +2584,7 @@ mod tests { #[tokio::test] async fn test_tpcds_19() -> Result<()> { let display = test_tpcds_query("q19").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [ext_price@4 DESC, brand@1 ASC NULLS LAST, brand_id@0 ASC NULLS LAST, i_manufact_id@2 ASC NULLS LAST, i_manufact@3 ASC NULLS LAST], fetch=100 │ [Stage 7] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -2689,12 +2604,11 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_current_addr_sk@6, ca_address_sk@0)], projection=[ss_store_sk@0, ss_ext_sales_price@1, i_brand_id@2, i_brand@3, i_manufact_id@4, i_manufact@5, ca_zip@8] │ CoalescePartitionsExec │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -2709,12 +2623,11 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ss_customer_sk@0, c_customer_sk@0)], projection=[ss_store_sk@1, ss_ext_sales_price@2, i_brand_id@3, i_brand@4, i_manufact_id@5, i_manufact@6, c_current_addr_sk@8] │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -2733,22 +2646,20 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_manager_id@5 = 8, projection=[i_item_sk@0, i_brand_id@1, i_brand@2, i_manufact_id@3, i_manufact@4] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manufact_id, i_manufact, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 8, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 8 AND 8 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (8)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manufact_id, i_manufact, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 8, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 8 AND 8 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (8)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manufact_id, i_manufact, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 8, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 8 AND 8 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (8)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manufact_id, i_manufact, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 8, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 8 AND 8 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (8)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manufact_id, i_manufact, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 8, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 8 AND 8 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (8)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manufact_id, i_manufact, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 8, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 8 AND 8 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (8)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manufact_id, i_manufact, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 8, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 8 AND 8 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (8)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manufact_id, i_manufact, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 8, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 8 AND 8 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (8)] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_moy@2 = 11 AND d_year@1 = 1998, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1998, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1998 AND 1998 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1998, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1998 AND 1998 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1998, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1998 AND 1998 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1998, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1998 AND 1998 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1998, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1998 AND 1998 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1998, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1998 AND 1998 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1998, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1998 AND 1998 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1998, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1998 AND 1998 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] └────────────────────────────────────────────────── "); Ok(()) @@ -2788,22 +2699,20 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_date@1 >= 1999-02-22 AND d_date@1 <= 1999-03-24, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-22 AND d_date@2 <= 1999-03-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-22 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-03-24, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-22 AND d_date@2 <= 1999-03-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-22 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-03-24, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-22 AND d_date@2 <= 1999-03-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-22 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-03-24, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-22 AND d_date@2 <= 1999-03-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-22 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-03-24, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-22 AND d_date@2 <= 1999-03-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-22 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-03-24, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-22 AND d_date@2 <= 1999-03-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-22 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-03-24, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-22 AND d_date@2 <= 1999-03-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-22 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-03-24, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-22 AND d_date@2 <= 1999-03-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-22 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-03-24, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_category@5 = Sports OR i_category@5 = Books OR i_category@5 = Home - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_class, i_category], file_type=parquet, predicate=i_category@12 = Sports OR i_category@12 = Books OR i_category@12 = Home, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Home AND Home <= i_category_max@1, required_guarantees=[i_category in (Books, Home, Sports)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_class, i_category], file_type=parquet, predicate=i_category@12 = Sports OR i_category@12 = Books OR i_category@12 = Home, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Home AND Home <= i_category_max@1, required_guarantees=[i_category in (Books, Home, Sports)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_class, i_category], file_type=parquet, predicate=i_category@12 = Sports OR i_category@12 = Books OR i_category@12 = Home, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Home AND Home <= i_category_max@1, required_guarantees=[i_category in (Books, Home, Sports)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_class, i_category], file_type=parquet, predicate=i_category@12 = Sports OR i_category@12 = Books OR i_category@12 = Home, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Home AND Home <= i_category_max@1, required_guarantees=[i_category in (Books, Home, Sports)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_class, i_category], file_type=parquet, predicate=i_category@12 = Sports OR i_category@12 = Books OR i_category@12 = Home, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Home AND Home <= i_category_max@1, required_guarantees=[i_category in (Books, Home, Sports)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_class, i_category], file_type=parquet, predicate=i_category@12 = Sports OR i_category@12 = Books OR i_category@12 = Home, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Home AND Home <= i_category_max@1, required_guarantees=[i_category in (Books, Home, Sports)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_class, i_category], file_type=parquet, predicate=i_category@12 = Sports OR i_category@12 = Books OR i_category@12 = Home, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Home AND Home <= i_category_max@1, required_guarantees=[i_category in (Books, Home, Sports)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_class, i_category], file_type=parquet, predicate=i_category@12 = Sports OR i_category@12 = Books OR i_category@12 = Home, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Home AND Home <= i_category_max@1, required_guarantees=[i_category in (Books, Home, Sports)] └────────────────────────────────────────────────── "#); Ok(()) @@ -2841,27 +2750,25 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_date@1 >= 2000-02-10 AND d_date@1 <= 2000-04-10 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-02-10 AND d_date@2 <= 2000-04-10, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-02-10 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-10, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-02-10 AND d_date@2 <= 2000-04-10, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-02-10 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-10, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-02-10 AND d_date@2 <= 2000-04-10, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-02-10 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-10, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-02-10 AND d_date@2 <= 2000-04-10, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-02-10 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-10, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-02-10 AND d_date@2 <= 2000-04-10, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-02-10 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-10, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-02-10 AND d_date@2 <= 2000-04-10, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-02-10 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-10, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-02-10 AND d_date@2 <= 2000-04-10, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-02-10 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-10, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-02-10 AND d_date@2 <= 2000-04-10, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-02-10 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-10, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: i_current_price@2 >= Some(99),7,2 AND i_current_price@2 <= Some(149),7,2, projection=[i_item_sk@0, i_item_id@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_current_price], file_type=parquet, predicate=i_current_price@5 >= Some(99),7,2 AND i_current_price@5 <= Some(149),7,2, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= Some(99),7,2 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= Some(149),7,2, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_current_price], file_type=parquet, predicate=i_current_price@5 >= Some(99),7,2 AND i_current_price@5 <= Some(149),7,2, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= Some(99),7,2 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= Some(149),7,2, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_current_price], file_type=parquet, predicate=i_current_price@5 >= Some(99),7,2 AND i_current_price@5 <= Some(149),7,2, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= Some(99),7,2 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= Some(149),7,2, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id, i_current_price], file_type=parquet, predicate=i_current_price@5 >= Some(99),7,2 AND i_current_price@5 <= Some(149),7,2, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= Some(99),7,2 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= Some(149),7,2, required_guarantees=[] + │ FilterExec: i_current_price@2 >= 0.99 AND i_current_price@2 <= 1.49, projection=[i_item_sk@0, i_item_id@1] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_current_price], file_type=parquet, predicate=i_current_price@5 >= 0.99 AND i_current_price@5 <= 1.49, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 0.99 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 1.49, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_current_price], file_type=parquet, predicate=i_current_price@5 >= 0.99 AND i_current_price@5 <= 1.49, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 0.99 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 1.49, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id, i_current_price], file_type=parquet, predicate=i_current_price@5 >= 0.99 AND i_current_price@5 <= 1.49, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 0.99 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 1.49, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id, i_current_price], file_type=parquet, predicate=i_current_price@5 >= 0.99 AND i_current_price@5 <= 1.49, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 0.99 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 1.49, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -2877,7 +2784,7 @@ mod tests { #[tokio::test] async fn test_tpcds_22() -> Result<()> { let display = test_tpcds_query("q22").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [qoh@4 ASC, i_product_name@0 ASC, i_brand@1 ASC, i_class@2 ASC, i_category@3 ASC], fetch=100 │ [Stage 4] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -2893,7 +2800,7 @@ mod tests { │ AggregateExec: mode=Partial, gby=[(NULL as i_product_name, NULL as i_brand, NULL as i_class, NULL as i_category), (i_product_name@4 as i_product_name, NULL as i_brand, NULL as i_class, NULL as i_category), (i_product_name@4 as i_product_name, i_brand@1 as i_brand, NULL as i_class, NULL as i_category), (i_product_name@4 as i_product_name, i_brand@1 as i_brand, i_class@2 as i_class, NULL as i_category), (i_product_name@4 as i_product_name, i_brand@1 as i_brand, i_class@2 as i_class, i_category@3 as i_category)], aggr=[avg(inventory.inv_quantity_on_hand)] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, inv_item_sk@0)], projection=[inv_quantity_on_hand@6, i_brand@1, i_class@2, i_category@3, i_product_name@4] │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, inv_date_sk@0)], projection=[inv_item_sk@2, inv_quantity_on_hand@3] │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -2901,25 +2808,24 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_product_name], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_product_name], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_product_name], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_product_name], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_product_name], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_product_name], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_product_name], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_product_name], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_month_seq@1 >= 1200 AND d_month_seq@1 <= 1211, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] └────────────────────────────────────────────────── "); Ok(()) @@ -2927,344 +2833,323 @@ mod tests { #[tokio::test] async fn test_tpcds_23() -> Result<()> { let display = test_tpcds_query("q23").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [c_last_name@0 ASC, c_first_name@1 ASC, sales@2 ASC], fetch=100 - │ [Stage 31] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 + │ SortExec: TopK(fetch=100), expr=[c_last_name@0 ASC, c_first_name@1 ASC, sales@2 ASC], preserve_partitioning=[true] + │ InterleaveExec + │ ProjectionExec: expr=[c_last_name@0 as c_last_name, c_first_name@1 as c_first_name, sum(catalog_sales.cs_quantity * catalog_sales.cs_list_price)@2 as sales] + │ AggregateExec: mode=FinalPartitioned, gby=[c_last_name@0 as c_last_name, c_first_name@1 as c_first_name], aggr=[sum(catalog_sales.cs_quantity * catalog_sales.cs_list_price)] + │ RepartitionExec: partitioning=Hash([c_last_name@0, c_first_name@1], 3), input_partitions=3 + │ AggregateExec: mode=Partial, gby=[c_last_name@3 as c_last_name, c_first_name@2 as c_first_name], aggr=[sum(catalog_sales.cs_quantity * catalog_sales.cs_list_price)] + │ HashJoinExec: mode=CollectLeft, join_type=LeftSemi, on=[(cs_bill_customer_sk@0, c_customer_sk@0)], projection=[cs_quantity@1, cs_list_price@2, c_first_name@3, c_last_name@4] + │ CoalescePartitionsExec + │ [Stage 7] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 + │ FilterExec: CAST(sum(store_sales.ss_quantity * store_sales.ss_sales_price)@1 AS Decimal128(38, 15)) > CAST(0.5 * CAST(max(max_store_sales.tpcds_cmax)@2 AS Float64) AS Decimal128(38, 15)), projection=[c_customer_sk@0] + │ AggregateExec: mode=FinalPartitioned, gby=[c_customer_sk@0 as c_customer_sk], aggr=[sum(store_sales.ss_quantity * store_sales.ss_sales_price), max(max_store_sales.tpcds_cmax)] + │ [Stage 14] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ ProjectionExec: expr=[c_last_name@0 as c_last_name, c_first_name@1 as c_first_name, sum(web_sales.ws_quantity * web_sales.ws_list_price)@2 as sales] + │ AggregateExec: mode=FinalPartitioned, gby=[c_last_name@0 as c_last_name, c_first_name@1 as c_first_name], aggr=[sum(web_sales.ws_quantity * web_sales.ws_list_price)] + │ RepartitionExec: partitioning=Hash([c_last_name@0, c_first_name@1], 3), input_partitions=3 + │ AggregateExec: mode=Partial, gby=[c_last_name@3 as c_last_name, c_first_name@2 as c_first_name], aggr=[sum(web_sales.ws_quantity * web_sales.ws_list_price)] + │ HashJoinExec: mode=CollectLeft, join_type=LeftSemi, on=[(ws_bill_customer_sk@0, c_customer_sk@0)], projection=[ws_quantity@1, ws_list_price@2, c_first_name@3, c_last_name@4] + │ CoalescePartitionsExec + │ [Stage 21] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 + │ FilterExec: CAST(sum(store_sales.ss_quantity * store_sales.ss_sales_price)@1 AS Decimal128(38, 15)) > CAST(0.5 * CAST(max(max_store_sales.tpcds_cmax)@2 AS Float64) AS Decimal128(38, 15)), projection=[c_customer_sk@0] + │ AggregateExec: mode=FinalPartitioned, gby=[c_customer_sk@0 as c_customer_sk], aggr=[sum(store_sales.ss_quantity * store_sales.ss_sales_price), max(max_store_sales.tpcds_cmax)] + │ [Stage 28] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 31 ── Tasks: t0:[p0..p2] t1:[p0..p2] - │ SortExec: TopK(fetch=100), expr=[c_last_name@0 ASC, c_first_name@1 ASC, sales@2 ASC], preserve_partitioning=[true] - │ InterleaveExec - │ ProjectionExec: expr=[c_last_name@0 as c_last_name, c_first_name@1 as c_first_name, sum(catalog_sales.cs_quantity * catalog_sales.cs_list_price)@2 as sales] - │ AggregateExec: mode=FinalPartitioned, gby=[c_last_name@0 as c_last_name, c_first_name@1 as c_first_name], aggr=[sum(catalog_sales.cs_quantity * catalog_sales.cs_list_price)] - │ [Stage 15] => NetworkShuffleExec: output_partitions=3, input_tasks=4 - │ ProjectionExec: expr=[c_last_name@0 as c_last_name, c_first_name@1 as c_first_name, sum(web_sales.ws_quantity * web_sales.ws_list_price)@2 as sales] - │ AggregateExec: mode=FinalPartitioned, gby=[c_last_name@0 as c_last_name, c_first_name@1 as c_first_name], aggr=[sum(web_sales.ws_quantity * web_sales.ws_list_price)] - │ [Stage 30] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + ┌───── Stage 7 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(cs_item_sk@1, item_sk@0)], projection=[cs_bill_customer_sk@0, cs_quantity@2, cs_list_price@3, c_first_name@4, c_last_name@5] + │ CoalescePartitionsExec + │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ ProjectionExec: expr=[i_item_sk@0 as item_sk] + │ FilterExec: count(Int64(1))@1 > 4, projection=[i_item_sk@0] + │ ProjectionExec: expr=[i_item_sk@1 as i_item_sk, count(Int64(1))@3 as count(Int64(1))] + │ AggregateExec: mode=FinalPartitioned, gby=[itemdesc@0 as itemdesc, i_item_sk@1 as i_item_sk, d_date@2 as d_date], aggr=[count(Int64(1))] + │ [Stage 6] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 15 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] - │ RepartitionExec: partitioning=Hash([c_last_name@0, c_first_name@1], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[c_last_name@3 as c_last_name, c_first_name@2 as c_first_name], aggr=[sum(catalog_sales.cs_quantity * catalog_sales.cs_list_price)] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(cs_bill_customer_sk@0, c_customer_sk@0)], projection=[cs_quantity@1, cs_list_price@2, c_first_name@3, c_last_name@4] + ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_bill_customer_sk@2, cs_item_sk@3, cs_quantity@4, cs_list_price@5, c_first_name@6, c_last_name@7] + │ CoalescePartitionsExec + │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, cs_bill_customer_sk@1)], projection=[cs_sold_date_sk@3, cs_bill_customer_sk@4, cs_item_sk@5, cs_quantity@6, cs_list_price@7, c_first_name@1, c_last_name@2] │ CoalescePartitionsExec - │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ FilterExec: CAST(sum(store_sales.ss_quantity * store_sales.ss_sales_price)@1 AS Decimal128(38, 15)) > CAST(0.5 * CAST(max(max_store_sales.tpcds_cmax)@2 AS Float64) AS Decimal128(38, 15)), projection=[c_customer_sk@0] - │ AggregateExec: mode=FinalPartitioned, gby=[c_customer_sk@0 as c_customer_sk], aggr=[sum(store_sales.ss_quantity * store_sales.ss_sales_price), max(max_store_sales.tpcds_cmax)] - │ [Stage 14] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(cs_item_sk@1, item_sk@0)], projection=[cs_bill_customer_sk@0, cs_quantity@2, cs_list_price@3, c_first_name@4, c_last_name@5] - │ CoalescePartitionsExec - │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ ProjectionExec: expr=[i_item_sk@0 as item_sk] - │ FilterExec: count(Int64(1))@1 > 4, projection=[i_item_sk@0] - │ ProjectionExec: expr=[i_item_sk@1 as i_item_sk, count(Int64(1))@3 as count(Int64(1))] - │ AggregateExec: mode=FinalPartitioned, gby=[itemdesc@0 as itemdesc, i_item_sk@1 as i_item_sk, d_date@2 as d_date], aggr=[count(Int64(1))] - │ [Stage 6] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ FilterExec: d_year@1 = 2000 AND d_moy@2 = 2, projection=[d_date_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2000 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2000 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2000 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2000 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2000)] └────────────────────────────────────────────────── - ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_bill_customer_sk@2, cs_item_sk@3, cs_quantity@4, cs_list_price@5, c_first_name@6, c_last_name@7] - │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, cs_bill_customer_sk@1)], projection=[cs_sold_date_sk@3, cs_bill_customer_sk@4, cs_item_sk@5, cs_quantity@6, cs_list_price@7, c_first_name@1, c_last_name@2] - │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: d_year@1 = 2000 AND d_moy@2 = 2, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2000 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2000 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2000 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2000 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2000)] - └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - └────────────────────────────────────────────────── - ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([itemdesc@0, i_item_sk@1, d_date@2], 12), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[itemdesc@1 as itemdesc, i_item_sk@2 as i_item_sk, d_date@0 as d_date], aggr=[count(Int64(1))] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@1, ss_item_sk@0)], projection=[d_date@3, itemdesc@0, i_item_sk@1] + ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + └────────────────────────────────────────────────── + ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] + │ RepartitionExec: partitioning=Hash([itemdesc@0, i_item_sk@1, d_date@2], 12), input_partitions=3 + │ AggregateExec: mode=Partial, gby=[itemdesc@1 as itemdesc, i_item_sk@2 as i_item_sk, d_date@0 as d_date], aggr=[count(Int64(1))] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@1, ss_item_sk@0)], projection=[d_date@3, itemdesc@0, i_item_sk@1] + │ CoalescePartitionsExec + │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_item_sk@3, d_date@1] + │ CoalescePartitionsExec + │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + └────────────────────────────────────────────────── + ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[substr(i_item_desc@4, 1, 30) as itemdesc, i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[substr(i_item_desc@4, 1, 30) as itemdesc, i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[substr(i_item_desc@4, 1, 30) as itemdesc, i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[substr(i_item_desc@4, 1, 30) as itemdesc, i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + └────────────────────────────────────────────────── + ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ FilterExec: d_year@2 IN (SET) ([2000, 2001, 2002, 2003]), projection=[d_date_sk@0, d_date@1] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] + └────────────────────────────────────────────────── + ┌───── Stage 14 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] + │ RepartitionExec: partitioning=Hash([c_customer_sk@0], 3), input_partitions=3 + │ AggregateExec: mode=Partial, gby=[c_customer_sk@2 as c_customer_sk], aggr=[sum(store_sales.ss_quantity * store_sales.ss_sales_price), max(max_store_sales.tpcds_cmax)] + │ ProjectionExec: expr=[ss_quantity@1 as ss_quantity, ss_sales_price@2 as ss_sales_price, c_customer_sk@3 as c_customer_sk, tpcds_cmax@0 as tpcds_cmax] + │ CrossJoinExec + │ CoalescePartitionsExec + │ [Stage 12] => NetworkBroadcastExec: partitions_per_consumer=1, stage_partitions=4, input_tasks=1 + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ss_customer_sk@0)], projection=[ss_quantity@2, ss_sales_price@3, c_customer_sk@0] + │ CoalescePartitionsExec + │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] + └────────────────────────────────────────────────── + ┌───── Stage 12 ── Tasks: t0:[p0..p3] + │ BroadcastExec: input_partitions=1, consumer_tasks=4, output_partitions=4 + │ ProjectionExec: expr=[max(sq2.csales)@0 as tpcds_cmax] + │ AggregateExec: mode=Final, gby=[], aggr=[max(sq2.csales)] + │ CoalescePartitionsExec + │ [Stage 11] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 + └────────────────────────────────────────────────── + ┌───── Stage 11 ── Tasks: t0:[p0..p2] t1:[p0..p2] + │ AggregateExec: mode=Partial, gby=[], aggr=[max(sq2.csales)] + │ ProjectionExec: expr=[sum(store_sales.ss_quantity * store_sales.ss_sales_price)@1 as csales] + │ AggregateExec: mode=FinalPartitioned, gby=[c_customer_sk@0 as c_customer_sk], aggr=[sum(store_sales.ss_quantity * store_sales.ss_sales_price)] + │ [Stage 10] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + └────────────────────────────────────────────────── + ┌───── Stage 10 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] + │ RepartitionExec: partitioning=Hash([c_customer_sk@0], 6), input_partitions=3 + │ AggregateExec: mode=Partial, gby=[c_customer_sk@2 as c_customer_sk], aggr=[sum(store_sales.ss_quantity * store_sales.ss_sales_price)] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_quantity@2, ss_sales_price@3, c_customer_sk@4] │ CoalescePartitionsExec - │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_item_sk@3, d_date@1] + │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ss_customer_sk@1)], projection=[ss_sold_date_sk@1, ss_quantity@3, ss_sales_price@4, c_customer_sk@0] │ CoalescePartitionsExec - │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ ProjectionExec: expr=[substr(i_item_desc@1, 1, 30) as itemdesc, i_item_sk@0 as i_item_sk] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_desc], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_desc], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_desc], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_desc], file_type=parquet, predicate=DynamicFilter [ empty ] + │ FilterExec: d_year@1 IN (SET) ([2000, 2001, 2002, 2003]), projection=[d_date_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] └────────────────────────────────────────────────── - ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: d_year@2 IN (SET) ([2000, 2001, 2002, 2003]), projection=[d_date_sk@0, d_date@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] - └────────────────────────────────────────────────── - ┌───── Stage 14 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([c_customer_sk@0], 12), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[c_customer_sk@2 as c_customer_sk], aggr=[sum(store_sales.ss_quantity * store_sales.ss_sales_price), max(max_store_sales.tpcds_cmax)] - │ ProjectionExec: expr=[ss_quantity@1 as ss_quantity, ss_sales_price@2 as ss_sales_price, c_customer_sk@3 as c_customer_sk, tpcds_cmax@0 as tpcds_cmax] - │ CrossJoinExec - │ CoalescePartitionsExec - │ [Stage 12] => NetworkBroadcastExec: partitions_per_consumer=1, stage_partitions=4, input_tasks=1 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ss_customer_sk@0)], projection=[ss_quantity@2, ss_sales_price@3, c_customer_sk@0] - │ CoalescePartitionsExec - │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - └────────────────────────────────────────────────── - ┌───── Stage 12 ── Tasks: t0:[p0..p3] - │ BroadcastExec: input_partitions=1, consumer_tasks=4, output_partitions=4 - │ ProjectionExec: expr=[max(sq2.csales)@0 as tpcds_cmax] - │ AggregateExec: mode=Final, gby=[], aggr=[max(sq2.csales)] - │ CoalescePartitionsExec - │ [Stage 11] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 - └────────────────────────────────────────────────── - ┌───── Stage 11 ── Tasks: t0:[p0..p2] t1:[p0..p2] - │ AggregateExec: mode=Partial, gby=[], aggr=[max(sq2.csales)] - │ ProjectionExec: expr=[sum(store_sales.ss_quantity * store_sales.ss_sales_price)@1 as csales] - │ AggregateExec: mode=FinalPartitioned, gby=[c_customer_sk@0 as c_customer_sk], aggr=[sum(store_sales.ss_quantity * store_sales.ss_sales_price)] - │ [Stage 10] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 10 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] - │ RepartitionExec: partitioning=Hash([c_customer_sk@0], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[c_customer_sk@2 as c_customer_sk], aggr=[sum(store_sales.ss_quantity * store_sales.ss_sales_price)] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_quantity@2, ss_sales_price@3, c_customer_sk@4] - │ CoalescePartitionsExec - │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ss_customer_sk@1)], projection=[ss_sold_date_sk@1, ss_quantity@3, ss_sales_price@4, c_customer_sk@0] - │ CoalescePartitionsExec - │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - └────────────────────────────────────────────────── - ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: d_year@1 IN (SET) ([2000, 2001, 2002, 2003]), projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] - └────────────────────────────────────────────────── - ┌───── Stage 9 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk], file_type=parquet - └────────────────────────────────────────────────── - ┌───── Stage 13 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk], file_type=parquet - └────────────────────────────────────────────────── - ┌───── Stage 30 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] - │ RepartitionExec: partitioning=Hash([c_last_name@0, c_first_name@1], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[c_last_name@3 as c_last_name, c_first_name@2 as c_first_name], aggr=[sum(web_sales.ws_quantity * web_sales.ws_list_price)] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ws_bill_customer_sk@0, c_customer_sk@0)], projection=[ws_quantity@1, ws_list_price@2, c_first_name@3, c_last_name@4] + ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk], file_type=parquet + └────────────────────────────────────────────────── + ┌───── Stage 21 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ws_item_sk@0, item_sk@0)], projection=[ws_bill_customer_sk@1, ws_quantity@2, ws_list_price@3, c_first_name@4, c_last_name@5] + │ CoalescePartitionsExec + │ [Stage 17] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ ProjectionExec: expr=[i_item_sk@0 as item_sk] + │ FilterExec: count(Int64(1))@1 > 4, projection=[i_item_sk@0] + │ ProjectionExec: expr=[i_item_sk@1 as i_item_sk, count(Int64(1))@3 as count(Int64(1))] + │ AggregateExec: mode=FinalPartitioned, gby=[itemdesc@0 as itemdesc, i_item_sk@1 as i_item_sk, d_date@2 as d_date], aggr=[count(Int64(1))] + │ [Stage 20] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + └────────────────────────────────────────────────── + ┌───── Stage 17 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[ws_item_sk@2, ws_bill_customer_sk@3, ws_quantity@4, ws_list_price@5, c_first_name@6, c_last_name@7] + │ CoalescePartitionsExec + │ [Stage 15] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ws_bill_customer_sk@2)], projection=[ws_sold_date_sk@3, ws_item_sk@4, ws_bill_customer_sk@5, ws_quantity@6, ws_list_price@7, c_first_name@1, c_last_name@2] │ CoalescePartitionsExec - │ [Stage 22] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ FilterExec: CAST(sum(store_sales.ss_quantity * store_sales.ss_sales_price)@1 AS Decimal128(38, 15)) > CAST(0.5 * CAST(max(max_store_sales.tpcds_cmax)@2 AS Float64) AS Decimal128(38, 15)), projection=[c_customer_sk@0] - │ AggregateExec: mode=FinalPartitioned, gby=[c_customer_sk@0 as c_customer_sk], aggr=[sum(store_sales.ss_quantity * store_sales.ss_sales_price), max(max_store_sales.tpcds_cmax)] - │ [Stage 29] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 16] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 22 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 15 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ws_item_sk@0, item_sk@0)], projection=[ws_bill_customer_sk@1, ws_quantity@2, ws_list_price@3, c_first_name@4, c_last_name@5] - │ CoalescePartitionsExec - │ [Stage 18] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ ProjectionExec: expr=[i_item_sk@0 as item_sk] - │ FilterExec: count(Int64(1))@1 > 4, projection=[i_item_sk@0] - │ ProjectionExec: expr=[i_item_sk@1 as i_item_sk, count(Int64(1))@3 as count(Int64(1))] - │ AggregateExec: mode=FinalPartitioned, gby=[itemdesc@0 as itemdesc, i_item_sk@1 as i_item_sk, d_date@2 as d_date], aggr=[count(Int64(1))] - │ [Stage 21] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ FilterExec: d_year@1 = 2000 AND d_moy@2 = 2, projection=[d_date_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2000 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2000 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2000 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2000 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2000)] └────────────────────────────────────────────────── - ┌───── Stage 18 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[ws_item_sk@2, ws_bill_customer_sk@3, ws_quantity@4, ws_list_price@5, c_first_name@6, c_last_name@7] - │ CoalescePartitionsExec - │ [Stage 16] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ws_bill_customer_sk@2)], projection=[ws_sold_date_sk@3, ws_item_sk@4, ws_bill_customer_sk@5, ws_quantity@6, ws_list_price@7, c_first_name@1, c_last_name@2] - │ CoalescePartitionsExec - │ [Stage 17] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - └────────────────────────────────────────────────── - ┌───── Stage 16 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: d_year@1 = 2000 AND d_moy@2 = 2, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2000 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2000 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2000 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2000 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2000)] - └────────────────────────────────────────────────── - ┌───── Stage 17 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - └────────────────────────────────────────────────── - ┌───── Stage 21 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([itemdesc@0, i_item_sk@1, d_date@2], 12), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[itemdesc@1 as itemdesc, i_item_sk@2 as i_item_sk, d_date@0 as d_date], aggr=[count(Int64(1))] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@1, ss_item_sk@0)], projection=[d_date@3, itemdesc@0, i_item_sk@1] + ┌───── Stage 16 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + └────────────────────────────────────────────────── + ┌───── Stage 20 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] + │ RepartitionExec: partitioning=Hash([itemdesc@0, i_item_sk@1, d_date@2], 12), input_partitions=3 + │ AggregateExec: mode=Partial, gby=[itemdesc@1 as itemdesc, i_item_sk@2 as i_item_sk, d_date@0 as d_date], aggr=[count(Int64(1))] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@1, ss_item_sk@0)], projection=[d_date@3, itemdesc@0, i_item_sk@1] + │ CoalescePartitionsExec + │ [Stage 18] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_item_sk@3, d_date@1] + │ CoalescePartitionsExec + │ [Stage 19] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + └────────────────────────────────────────────────── + ┌───── Stage 18 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[substr(i_item_desc@4, 1, 30) as itemdesc, i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[substr(i_item_desc@4, 1, 30) as itemdesc, i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[substr(i_item_desc@4, 1, 30) as itemdesc, i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[substr(i_item_desc@4, 1, 30) as itemdesc, i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + └────────────────────────────────────────────────── + ┌───── Stage 19 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ FilterExec: d_year@2 IN (SET) ([2000, 2001, 2002, 2003]), projection=[d_date_sk@0, d_date@1] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] + └────────────────────────────────────────────────── + ┌───── Stage 28 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] + │ RepartitionExec: partitioning=Hash([c_customer_sk@0], 3), input_partitions=3 + │ AggregateExec: mode=Partial, gby=[c_customer_sk@2 as c_customer_sk], aggr=[sum(store_sales.ss_quantity * store_sales.ss_sales_price), max(max_store_sales.tpcds_cmax)] + │ ProjectionExec: expr=[ss_quantity@1 as ss_quantity, ss_sales_price@2 as ss_sales_price, c_customer_sk@3 as c_customer_sk, tpcds_cmax@0 as tpcds_cmax] + │ CrossJoinExec + │ CoalescePartitionsExec + │ [Stage 26] => NetworkBroadcastExec: partitions_per_consumer=1, stage_partitions=4, input_tasks=1 + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ss_customer_sk@0)], projection=[ss_quantity@2, ss_sales_price@3, c_customer_sk@0] + │ CoalescePartitionsExec + │ [Stage 27] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] + └────────────────────────────────────────────────── + ┌───── Stage 26 ── Tasks: t0:[p0..p3] + │ BroadcastExec: input_partitions=1, consumer_tasks=4, output_partitions=4 + │ ProjectionExec: expr=[max(sq2.csales)@0 as tpcds_cmax] + │ AggregateExec: mode=Final, gby=[], aggr=[max(sq2.csales)] + │ CoalescePartitionsExec + │ [Stage 25] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 + └────────────────────────────────────────────────── + ┌───── Stage 25 ── Tasks: t0:[p0..p2] t1:[p0..p2] + │ AggregateExec: mode=Partial, gby=[], aggr=[max(sq2.csales)] + │ ProjectionExec: expr=[sum(store_sales.ss_quantity * store_sales.ss_sales_price)@1 as csales] + │ AggregateExec: mode=FinalPartitioned, gby=[c_customer_sk@0 as c_customer_sk], aggr=[sum(store_sales.ss_quantity * store_sales.ss_sales_price)] + │ [Stage 24] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + └────────────────────────────────────────────────── + ┌───── Stage 24 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] + │ RepartitionExec: partitioning=Hash([c_customer_sk@0], 6), input_partitions=3 + │ AggregateExec: mode=Partial, gby=[c_customer_sk@2 as c_customer_sk], aggr=[sum(store_sales.ss_quantity * store_sales.ss_sales_price)] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_quantity@2, ss_sales_price@3, c_customer_sk@4] │ CoalescePartitionsExec - │ [Stage 19] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_item_sk@3, d_date@1] + │ [Stage 22] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ss_customer_sk@1)], projection=[ss_sold_date_sk@1, ss_quantity@3, ss_sales_price@4, c_customer_sk@0] │ CoalescePartitionsExec - │ [Stage 20] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ [Stage 23] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 19 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 22 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ ProjectionExec: expr=[substr(i_item_desc@1, 1, 30) as itemdesc, i_item_sk@0 as i_item_sk] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_desc], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_desc], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_desc], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_desc], file_type=parquet, predicate=DynamicFilter [ empty ] + │ FilterExec: d_year@1 IN (SET) ([2000, 2001, 2002, 2003]), projection=[d_date_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] └────────────────────────────────────────────────── - ┌───── Stage 20 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 23 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: d_year@2 IN (SET) ([2000, 2001, 2002, 2003]), projection=[d_date_sk@0, d_date@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] - └────────────────────────────────────────────────── - ┌───── Stage 29 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([c_customer_sk@0], 12), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[c_customer_sk@2 as c_customer_sk], aggr=[sum(store_sales.ss_quantity * store_sales.ss_sales_price), max(max_store_sales.tpcds_cmax)] - │ ProjectionExec: expr=[ss_quantity@1 as ss_quantity, ss_sales_price@2 as ss_sales_price, c_customer_sk@3 as c_customer_sk, tpcds_cmax@0 as tpcds_cmax] - │ CrossJoinExec - │ CoalescePartitionsExec - │ [Stage 27] => NetworkBroadcastExec: partitions_per_consumer=1, stage_partitions=4, input_tasks=1 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ss_customer_sk@0)], projection=[ss_quantity@2, ss_sales_price@3, c_customer_sk@0] - │ CoalescePartitionsExec - │ [Stage 28] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - └────────────────────────────────────────────────── - ┌───── Stage 27 ── Tasks: t0:[p0..p3] - │ BroadcastExec: input_partitions=1, consumer_tasks=4, output_partitions=4 - │ ProjectionExec: expr=[max(sq2.csales)@0 as tpcds_cmax] - │ AggregateExec: mode=Final, gby=[], aggr=[max(sq2.csales)] - │ CoalescePartitionsExec - │ [Stage 26] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 - └────────────────────────────────────────────────── - ┌───── Stage 26 ── Tasks: t0:[p0..p2] t1:[p0..p2] - │ AggregateExec: mode=Partial, gby=[], aggr=[max(sq2.csales)] - │ ProjectionExec: expr=[sum(store_sales.ss_quantity * store_sales.ss_sales_price)@1 as csales] - │ AggregateExec: mode=FinalPartitioned, gby=[c_customer_sk@0 as c_customer_sk], aggr=[sum(store_sales.ss_quantity * store_sales.ss_sales_price)] - │ [Stage 25] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 25 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] - │ RepartitionExec: partitioning=Hash([c_customer_sk@0], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[c_customer_sk@2 as c_customer_sk], aggr=[sum(store_sales.ss_quantity * store_sales.ss_sales_price)] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_quantity@2, ss_sales_price@3, c_customer_sk@4] - │ CoalescePartitionsExec - │ [Stage 23] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ss_customer_sk@1)], projection=[ss_sold_date_sk@1, ss_quantity@3, ss_sales_price@4, c_customer_sk@0] - │ CoalescePartitionsExec - │ [Stage 24] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - └────────────────────────────────────────────────── - ┌───── Stage 23 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: d_year@1 IN (SET) ([2000, 2001, 2002, 2003]), projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 IN (SET) ([2000, 2001, 2002, 2003]), pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2003 AND 2003 <= d_year_max@1, required_guarantees=[d_year in (2000, 2001, 2002, 2003)] - └────────────────────────────────────────────────── - ┌───── Stage 24 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk], file_type=parquet - └────────────────────────────────────────────────── - ┌───── Stage 28 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk], file_type=parquet - └────────────────────────────────────────────────── + ┌───── Stage 27 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk], file_type=parquet + └────────────────────────────────────────────────── "); Ok(()) } #[tokio::test] async fn test_tpcds_24() -> Result<()> { let display = test_tpcds_query("q24").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [c_last_name@0 ASC NULLS LAST, c_first_name@1 ASC NULLS LAST, s_store_name@2 ASC NULLS LAST] │ SortExec: expr=[c_last_name@0 ASC NULLS LAST, c_first_name@1 ASC NULLS LAST, s_store_name@2 ASC NULLS LAST], preserve_partitioning=[true] @@ -3291,13 +3176,13 @@ mod tests { │ AggregateExec: mode=Partial, gby=[c_last_name@9 as c_last_name, c_first_name@8 as c_first_name, s_store_name@1 as s_store_name, ca_state@10 as ca_state, s_state@2 as s_state, i_color@5 as i_color, i_current_price@3 as i_current_price, i_manager_id@7 as i_manager_id, i_units@6 as i_units, i_size@4 as i_size], aggr=[sum(store_sales.ss_net_paid)] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, c_current_addr_sk@9), (ca_zip@2, s_zip@3)], filter=c_birth_country@0 != upper(ca_country@1), projection=[ss_net_paid@4, s_store_name@5, s_state@6, i_current_price@8, i_size@9, i_color@10, i_units@11, i_manager_id@12, c_first_name@14, c_last_name@15, ca_state@1] │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ss_customer_sk@0)], projection=[ss_net_paid@6, s_store_name@7, s_state@8, s_zip@9, i_current_price@10, i_size@11, i_color@12, i_units@13, i_manager_id@14, c_current_addr_sk@1, c_first_name@2, c_last_name@3, c_birth_country@4] │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@0)], projection=[ss_customer_sk@7, ss_net_paid@8, s_store_name@9, s_state@10, s_zip@11, i_current_price@1, i_size@2, i_color@3, i_units@4, i_manager_id@5] │ CoalescePartitionsExec - │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(s_store_sk@0, ss_store_sk@2)], projection=[ss_item_sk@4, ss_customer_sk@5, ss_net_paid@7, s_store_name@1, s_state@2, s_zip@3] │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -3305,29 +3190,29 @@ mod tests { │ [Stage 5] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ [Stage 6] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip, ca_country], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip, ca_country], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip, ca_country], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip, ca_country], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip, ca_country], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip, ca_country], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip, ca_country], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip, ca_country], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name, c_birth_country], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name, c_birth_country], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name, c_birth_country], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name, c_birth_country], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name, c_birth_country], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name, c_birth_country], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name, c_birth_country], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name, c_birth_country], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 3 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_size, i_color, i_units, i_manager_id], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_size, i_color, i_units, i_manager_id], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_size, i_color, i_units, i_manager_id], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_current_price, i_size, i_color, i_units, i_manager_id], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_size, i_color, i_units, i_manager_id], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_size, i_color, i_units, i_manager_id], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_current_price, i_size, i_color, i_units, i_manager_id], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_current_price, i_size, i_color, i_units, i_manager_id], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -3367,10 +3252,10 @@ mod tests { │ AggregateExec: mode=Partial, gby=[c_last_name@9 as c_last_name, c_first_name@8 as c_first_name, s_store_name@1 as s_store_name, ca_state@10 as ca_state, s_state@2 as s_state, i_color@5 as i_color, i_current_price@3 as i_current_price, i_manager_id@7 as i_manager_id, i_units@6 as i_units, i_size@4 as i_size], aggr=[sum(store_sales.ss_net_paid)], ordering_mode=PartiallySorted([5]) │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, c_current_addr_sk@9), (ca_zip@2, s_zip@3)], filter=c_birth_country@0 != upper(ca_country@1), projection=[ss_net_paid@4, s_store_name@5, s_state@6, i_current_price@8, i_size@9, i_color@10, i_units@11, i_manager_id@12, c_first_name@14, c_last_name@15, ca_state@1] │ CoalescePartitionsExec - │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ss_customer_sk@0)], projection=[ss_net_paid@6, s_store_name@7, s_state@8, s_zip@9, i_current_price@10, i_size@11, i_color@12, i_units@13, i_manager_id@14, c_current_addr_sk@1, c_first_name@2, c_last_name@3, c_birth_country@4] │ CoalescePartitionsExec - │ [Stage 10] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 10] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@0)], projection=[ss_customer_sk@7, ss_net_paid@8, s_store_name@9, s_state@10, s_zip@11, i_current_price@1, i_size@2, i_color@3, i_units@4, i_manager_id@5] │ CoalescePartitionsExec │ [Stage 11] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -3381,31 +3266,30 @@ mod tests { │ [Stage 13] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ [Stage 14] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 9 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip, ca_country], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip, ca_country], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip, ca_country], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip, ca_country], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip, ca_country], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip, ca_country], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip, ca_country], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip, ca_country], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 10 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 10 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name, c_birth_country], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name, c_birth_country], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name, c_birth_country], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name, c_birth_country], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name, c_birth_country], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name, c_birth_country], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name, c_birth_country], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name, c_birth_country], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 11 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_color@3 = peach - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_size, i_color, i_units, i_manager_id], file_type=parquet, predicate=i_color@17 = peach, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= peach AND peach <= i_color_max@1, required_guarantees=[i_color in (peach)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_size, i_color, i_units, i_manager_id], file_type=parquet, predicate=i_color@17 = peach, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= peach AND peach <= i_color_max@1, required_guarantees=[i_color in (peach)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_size, i_color, i_units, i_manager_id], file_type=parquet, predicate=i_color@17 = peach, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= peach AND peach <= i_color_max@1, required_guarantees=[i_color in (peach)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_current_price, i_size, i_color, i_units, i_manager_id], file_type=parquet, predicate=i_color@17 = peach, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= peach AND peach <= i_color_max@1, required_guarantees=[i_color in (peach)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_size, i_color, i_units, i_manager_id], file_type=parquet, predicate=i_color@17 = peach, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= peach AND peach <= i_color_max@1, required_guarantees=[i_color in (peach)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_size, i_color, i_units, i_manager_id], file_type=parquet, predicate=i_color@17 = peach, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= peach AND peach <= i_color_max@1, required_guarantees=[i_color in (peach)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_current_price, i_size, i_color, i_units, i_manager_id], file_type=parquet, predicate=i_color@17 = peach, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= peach AND peach <= i_color_max@1, required_guarantees=[i_color in (peach)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_current_price, i_size, i_color, i_units, i_manager_id], file_type=parquet, predicate=i_color@17 = peach, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= peach AND peach <= i_color_max@1, required_guarantees=[i_color in (peach)] └────────────────────────────────────────────────── ┌───── Stage 12 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -3439,7 +3323,7 @@ mod tests { #[tokio::test] async fn test_tpcds_25() -> Result<()> { let display = test_tpcds_query("q25").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [i_item_id@0 ASC NULLS LAST, i_item_desc@1 ASC NULLS LAST, s_store_id@2 ASC NULLS LAST, s_store_name@3 ASC NULLS LAST], fetch=100 │ [Stage 11] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -3453,108 +3337,105 @@ mod tests { ┌───── Stage 10 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([i_item_id@0, i_item_desc@1, s_store_id@2, s_store_name@3], 6), input_partitions=3 │ AggregateExec: mode=Partial, gby=[i_item_id@5 as i_item_id, i_item_desc@6 as i_item_desc, s_store_id@3 as s_store_id, s_store_name@4 as s_store_name], aggr=[sum(store_sales.ss_net_profit), sum(store_returns.sr_net_loss), sum(catalog_sales.cs_net_profit)] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@0)], projection=[ss_net_profit@4, sr_net_loss@5, cs_net_profit@6, s_store_id@7, s_store_name@8, i_item_id@1, i_item_desc@2] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ss_item_sk@0, i_item_sk@0)], projection=[ss_net_profit@1, sr_net_loss@2, cs_net_profit@3, s_store_id@4, s_store_name@5, i_item_id@7, i_item_desc@8] │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(s_store_sk@0, ss_store_sk@1)], projection=[ss_item_sk@3, ss_net_profit@5, sr_net_loss@6, cs_net_profit@7, s_store_id@1, s_store_name@2] - │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@4)], projection=[ss_item_sk@1, ss_store_sk@2, ss_net_profit@3, sr_net_loss@4, cs_net_profit@6] - │ CoalescePartitionsExec - │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, sr_returned_date_sk@3)], projection=[ss_item_sk@1, ss_store_sk@2, ss_net_profit@3, sr_net_loss@5, cs_sold_date_sk@6, cs_net_profit@7] - │ CoalescePartitionsExec - │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_item_sk@2, ss_store_sk@3, ss_net_profit@4, sr_returned_date_sk@5, sr_net_loss@6, cs_sold_date_sk@7, cs_net_profit@8] - │ CoalescePartitionsExec - │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(cs_bill_customer_sk@1, sr_customer_sk@6), (cs_item_sk@2, sr_item_sk@5)], projection=[ss_sold_date_sk@4, ss_item_sk@5, ss_store_sk@6, ss_net_profit@7, sr_returned_date_sk@8, sr_net_loss@11, cs_sold_date_sk@0, cs_net_profit@3] - │ [Stage 6] => NetworkShuffleExec: output_partitions=3, input_tasks=4 - │ [Stage 9] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet - └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:..]]}, projection=[s_store_sk, s_store_id, s_store_name], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:..]]}, projection=[s_store_sk, s_store_id, s_store_name], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_store_id, s_store_name], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_store_id, s_store_name], file_type=parquet - └────────────────────────────────────────────────── - ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: d_moy@2 >= 4 AND d_moy@2 <= 10 AND d_year@1 = 2001, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 >= 4 AND d_moy@8 <= 10 AND d_year@6 = 2001, pruning_predicate=d_moy_null_count@1 != row_count@2 AND d_moy_max@0 >= 4 AND d_moy_null_count@1 != row_count@2 AND d_moy_min@3 <= 10 AND d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 >= 4 AND d_moy@8 <= 10 AND d_year@6 = 2001, pruning_predicate=d_moy_null_count@1 != row_count@2 AND d_moy_max@0 >= 4 AND d_moy_null_count@1 != row_count@2 AND d_moy_min@3 <= 10 AND d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 >= 4 AND d_moy@8 <= 10 AND d_year@6 = 2001, pruning_predicate=d_moy_null_count@1 != row_count@2 AND d_moy_max@0 >= 4 AND d_moy_null_count@1 != row_count@2 AND d_moy_min@3 <= 10 AND d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 >= 4 AND d_moy@8 <= 10 AND d_year@6 = 2001, pruning_predicate=d_moy_null_count@1 != row_count@2 AND d_moy_max@0 >= 4 AND d_moy_null_count@1 != row_count@2 AND d_moy_min@3 <= 10 AND d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_year in (2001)] - └────────────────────────────────────────────────── - ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: d_moy@2 >= 4 AND d_moy@2 <= 10 AND d_year@1 = 2001, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 >= 4 AND d_moy@8 <= 10 AND d_year@6 = 2001, pruning_predicate=d_moy_null_count@1 != row_count@2 AND d_moy_max@0 >= 4 AND d_moy_null_count@1 != row_count@2 AND d_moy_min@3 <= 10 AND d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 >= 4 AND d_moy@8 <= 10 AND d_year@6 = 2001, pruning_predicate=d_moy_null_count@1 != row_count@2 AND d_moy_max@0 >= 4 AND d_moy_null_count@1 != row_count@2 AND d_moy_min@3 <= 10 AND d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 >= 4 AND d_moy@8 <= 10 AND d_year@6 = 2001, pruning_predicate=d_moy_null_count@1 != row_count@2 AND d_moy_max@0 >= 4 AND d_moy_null_count@1 != row_count@2 AND d_moy_min@3 <= 10 AND d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 >= 4 AND d_moy@8 <= 10 AND d_year@6 = 2001, pruning_predicate=d_moy_null_count@1 != row_count@2 AND d_moy_max@0 >= 4 AND d_moy_null_count@1 != row_count@2 AND d_moy_min@3 <= 10 AND d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_year in (2001)] - └────────────────────────────────────────────────── - ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: d_moy@2 = 4 AND d_year@1 = 2001, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 4 AND d_year@6 = 2001, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 4 AND 4 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_moy in (4), d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 4 AND d_year@6 = 2001, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 4 AND 4 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_moy in (4), d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 4 AND d_year@6 = 2001, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 4 AND 4 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_moy in (4), d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 4 AND d_year@6 = 2001, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 4 AND 4 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_moy in (4), d_year in (2001)] - └────────────────────────────────────────────────── - ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([cs_bill_customer_sk@1, cs_item_sk@2], 12), input_partitions=3 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] - └────────────────────────────────────────────────── - ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([sr_customer_sk@6, sr_item_sk@5], 12), input_partitions=3 - │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(sr_customer_sk@2, ss_customer_sk@2), (sr_item_sk@1, ss_item_sk@1), (sr_ticket_number@3, ss_ticket_number@4)], projection=[ss_sold_date_sk@5, ss_item_sk@6, ss_store_sk@8, ss_net_profit@10, sr_returned_date_sk@0, sr_item_sk@1, sr_customer_sk@2, sr_net_loss@4] - │ [Stage 7] => NetworkShuffleExec: output_partitions=3, input_tasks=4 - │ [Stage 8] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(s_store_sk@0, ss_store_sk@1)], projection=[ss_item_sk@3, ss_net_profit@5, sr_net_loss@6, cs_net_profit@7, s_store_id@1, s_store_name@2] + │ CoalescePartitionsExec + │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@4)], projection=[ss_item_sk@1, ss_store_sk@2, ss_net_profit@3, sr_net_loss@4, cs_net_profit@6] + │ CoalescePartitionsExec + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, sr_returned_date_sk@3)], projection=[ss_item_sk@1, ss_store_sk@2, ss_net_profit@3, sr_net_loss@5, cs_sold_date_sk@6, cs_net_profit@7] + │ CoalescePartitionsExec + │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_item_sk@2, ss_store_sk@3, ss_net_profit@4, sr_returned_date_sk@5, sr_net_loss@6, cs_sold_date_sk@7, cs_net_profit@8] + │ CoalescePartitionsExec + │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(cs_bill_customer_sk@1, sr_customer_sk@6), (cs_item_sk@2, sr_item_sk@5)], projection=[ss_sold_date_sk@4, ss_item_sk@5, ss_store_sk@6, ss_net_profit@7, sr_returned_date_sk@8, sr_net_loss@11, cs_sold_date_sk@0, cs_net_profit@3] + │ [Stage 5] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 8] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([sr_customer_sk@2, sr_item_sk@1, sr_ticket_number@3], 12), input_partitions=3 + ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] + │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:..]]}, projection=[s_store_sk, s_store_id, s_store_name], file_type=parquet + │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:..]]}, projection=[s_store_sk, s_store_id, s_store_name], file_type=parquet + │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_store_id, s_store_name], file_type=parquet + │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_store_id, s_store_name], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([ss_customer_sk@2, ss_item_sk@1, ss_ticket_number@4], 12), input_partitions=3 + ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ FilterExec: d_moy@2 >= 4 AND d_moy@2 <= 10 AND d_year@1 = 2001, projection=[d_date_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 >= 4 AND d_moy@8 <= 10 AND d_year@6 = 2001, pruning_predicate=d_moy_null_count@1 != row_count@2 AND d_moy_max@0 >= 4 AND d_moy_null_count@1 != row_count@2 AND d_moy_min@3 <= 10 AND d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 >= 4 AND d_moy@8 <= 10 AND d_year@6 = 2001, pruning_predicate=d_moy_null_count@1 != row_count@2 AND d_moy_max@0 >= 4 AND d_moy_null_count@1 != row_count@2 AND d_moy_min@3 <= 10 AND d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 >= 4 AND d_moy@8 <= 10 AND d_year@6 = 2001, pruning_predicate=d_moy_null_count@1 != row_count@2 AND d_moy_max@0 >= 4 AND d_moy_null_count@1 != row_count@2 AND d_moy_min@3 <= 10 AND d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 >= 4 AND d_moy@8 <= 10 AND d_year@6 = 2001, pruning_predicate=d_moy_null_count@1 != row_count@2 AND d_moy_max@0 >= 4 AND d_moy_null_count@1 != row_count@2 AND d_moy_min@3 <= 10 AND d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_year in (2001)] + └────────────────────────────────────────────────── + ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ FilterExec: d_moy@2 >= 4 AND d_moy@2 <= 10 AND d_year@1 = 2001, projection=[d_date_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 >= 4 AND d_moy@8 <= 10 AND d_year@6 = 2001, pruning_predicate=d_moy_null_count@1 != row_count@2 AND d_moy_max@0 >= 4 AND d_moy_null_count@1 != row_count@2 AND d_moy_min@3 <= 10 AND d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 >= 4 AND d_moy@8 <= 10 AND d_year@6 = 2001, pruning_predicate=d_moy_null_count@1 != row_count@2 AND d_moy_max@0 >= 4 AND d_moy_null_count@1 != row_count@2 AND d_moy_min@3 <= 10 AND d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 >= 4 AND d_moy@8 <= 10 AND d_year@6 = 2001, pruning_predicate=d_moy_null_count@1 != row_count@2 AND d_moy_max@0 >= 4 AND d_moy_null_count@1 != row_count@2 AND d_moy_min@3 <= 10 AND d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 >= 4 AND d_moy@8 <= 10 AND d_year@6 = 2001, pruning_predicate=d_moy_null_count@1 != row_count@2 AND d_moy_max@0 >= 4 AND d_moy_null_count@1 != row_count@2 AND d_moy_min@3 <= 10 AND d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_year in (2001)] + └────────────────────────────────────────────────── + ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ FilterExec: d_moy@2 = 4 AND d_year@1 = 2001, projection=[d_date_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 4 AND d_year@6 = 2001, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 4 AND 4 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_moy in (4), d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 4 AND d_year@6 = 2001, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 4 AND 4 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_moy in (4), d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 4 AND d_year@6 = 2001, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 4 AND 4 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_moy in (4), d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 4 AND d_year@6 = 2001, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 4 AND 4 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_moy in (4), d_year in (2001)] + └────────────────────────────────────────────────── + ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] + │ RepartitionExec: partitioning=Hash([cs_bill_customer_sk@1, cs_item_sk@2], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── + ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] + │ RepartitionExec: partitioning=Hash([sr_customer_sk@6, sr_item_sk@5], 12), input_partitions=3 + │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(sr_customer_sk@2, ss_customer_sk@2), (sr_item_sk@1, ss_item_sk@1), (sr_ticket_number@3, ss_ticket_number@4)], projection=[ss_sold_date_sk@5, ss_item_sk@6, ss_store_sk@8, ss_net_profit@10, sr_returned_date_sk@0, sr_item_sk@1, sr_customer_sk@2, sr_net_loss@4] + │ [Stage 6] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 7] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + └────────────────────────────────────────────────── + ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] + │ RepartitionExec: partitioning=Hash([sr_customer_sk@2, sr_item_sk@1, sr_ticket_number@3], 12), input_partitions=3 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + └────────────────────────────────────────────────── + ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] + │ RepartitionExec: partitioning=Hash([ss_customer_sk@2, ss_item_sk@1, ss_ticket_number@4], 12), input_partitions=3 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + └────────────────────────────────────────────────── "); Ok(()) } #[tokio::test] async fn test_tpcds_26() -> Result<()> { let display = test_tpcds_query("q26").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [i_item_id@0 ASC NULLS LAST], fetch=100 │ [Stage 7] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -3573,7 +3454,7 @@ mod tests { │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, cs_item_sk@0)], projection=[cs_promo_sk@3, cs_quantity@4, cs_list_price@5, cs_sales_price@6, cs_coupon_amt@7, i_item_id@1] │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_item_sk@2, cs_promo_sk@3, cs_quantity@4, cs_list_price@5, cs_sales_price@6, cs_coupon_amt@7] │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -3591,23 +3472,22 @@ mod tests { │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/promotion/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/promotion/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/promotion/part-1.parquet:..]]}, projection=[p_promo_sk, p_channel_email, p_channel_event], file_type=parquet, predicate=p_channel_email@9 = N OR p_channel_event@14 = N, pruning_predicate=p_channel_email_null_count@2 != row_count@3 AND p_channel_email_min@0 <= N AND N <= p_channel_email_max@1 OR p_channel_event_null_count@6 != row_count@3 AND p_channel_event_min@4 <= N AND N <= p_channel_event_max@5, required_guarantees=[] │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/promotion/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/promotion/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/promotion/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/promotion/part-3.parquet:..]]}, projection=[p_promo_sk, p_channel_email, p_channel_event], file_type=parquet, predicate=p_channel_email@9 = N OR p_channel_event@14 = N, pruning_predicate=p_channel_email_null_count@2 != row_count@3 AND p_channel_email_min@0 <= N AND N <= p_channel_email_max@1 OR p_channel_event_null_count@6 != row_count@3 AND p_channel_event_min@4 <= N AND N <= p_channel_event_max@5, required_guarantees=[] └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2000, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cd_demo_sk@0], 12), input_partitions=3 @@ -3616,7 +3496,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cs_bill_cdemo_sk@1], 12), input_partitions=3 @@ -3632,7 +3512,7 @@ mod tests { #[tokio::test] async fn test_tpcds_27() -> Result<()> { let display = test_tpcds_query("q27").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [i_item_id@0 ASC, s_state@1 ASC], fetch=100 │ [Stage 19] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 @@ -3657,7 +3537,7 @@ mod tests { │ ProjectionExec: expr=[i_item_id@0 as i_item_id, s_state@1 as s_state, ss_quantity@2 as agg1, ss_list_price@3 as agg2, ss_coupon_amt@4 as agg3, ss_sales_price@5 as agg4] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@0)], projection=[i_item_id@1, s_state@7, ss_quantity@3, ss_list_price@4, ss_coupon_amt@6, ss_sales_price@5] │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(s_store_sk@0, ss_store_sk@1)], projection=[ss_item_sk@2, ss_quantity@4, ss_list_price@5, ss_sales_price@6, ss_coupon_amt@7, s_state@1] │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -3668,13 +3548,13 @@ mod tests { │ [Stage 4] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ [Stage 5] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -3689,12 +3569,11 @@ mod tests { ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2002, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cd_demo_sk@0], 12), input_partitions=3 @@ -3703,7 +3582,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_cdemo_sk@2], 12), input_partitions=3 @@ -3719,7 +3598,7 @@ mod tests { │ ProjectionExec: expr=[i_item_id@0 as i_item_id, ss_quantity@1 as agg1, ss_list_price@2 as agg2, ss_coupon_amt@3 as agg3, ss_sales_price@4 as agg4] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@0)], projection=[i_item_id@1, ss_quantity@3, ss_list_price@4, ss_coupon_amt@6, ss_sales_price@5] │ CoalescePartitionsExec - │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(s_store_sk@0, ss_store_sk@1)], projection=[ss_item_sk@1, ss_quantity@3, ss_list_price@4, ss_sales_price@5, ss_coupon_amt@6] │ CoalescePartitionsExec │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -3730,13 +3609,13 @@ mod tests { │ [Stage 10] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ [Stage 11] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 7 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -3751,12 +3630,11 @@ mod tests { ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2002, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] └────────────────────────────────────────────────── ┌───── Stage 10 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cd_demo_sk@0], 12), input_partitions=3 @@ -3765,7 +3643,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] └────────────────────────────────────────────────── ┌───── Stage 11 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_cdemo_sk@2], 12), input_partitions=3 @@ -3780,7 +3658,7 @@ mod tests { │ ProjectionExec: expr=[ss_quantity@0 as agg1, ss_list_price@1 as agg2, ss_coupon_amt@2 as agg3, ss_sales_price@3 as agg4] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@0)], projection=[ss_quantity@2, ss_list_price@3, ss_coupon_amt@5, ss_sales_price@4] │ CoalescePartitionsExec - │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(s_store_sk@0, ss_store_sk@1)], projection=[ss_item_sk@1, ss_quantity@3, ss_list_price@4, ss_sales_price@5, ss_coupon_amt@6] │ CoalescePartitionsExec │ [Stage 14] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -3791,13 +3669,13 @@ mod tests { │ [Stage 16] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ [Stage 17] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 13 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 14 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -3812,12 +3690,11 @@ mod tests { ┌───── Stage 15 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2002, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002 AND DynamicFilter [ empty ], pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002 AND DynamicFilter [ empty ], pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002 AND DynamicFilter [ empty ], pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002 AND DynamicFilter [ empty ], pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002 AND DynamicFilter [ empty ], pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002 AND DynamicFilter [ empty ], pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002 AND DynamicFilter [ empty ], pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002 AND DynamicFilter [ empty ], pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] └────────────────────────────────────────────────── ┌───── Stage 16 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cd_demo_sk@0], 12), input_partitions=3 @@ -3826,7 +3703,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College AND DynamicFilter [ empty ], pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College AND DynamicFilter [ empty ], pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College AND DynamicFilter [ empty ], pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College AND DynamicFilter [ empty ], pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College AND DynamicFilter [ empty ], pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] └────────────────────────────────────────────────── ┌───── Stage 17 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_cdemo_sk@2], 12), input_partitions=3 @@ -3842,7 +3719,7 @@ mod tests { #[tokio::test] async fn test_tpcds_28() -> Result<()> { let display = test_tpcds_query("q28").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ ProjectionExec: expr=[b1_lp@3 as b1_lp, b1_cnt@4 as b1_cnt, b1_cntd@5 as b1_cntd, b2_lp@6 as b2_lp, b2_cnt@7 as b2_cnt, b2_cntd@8 as b2_cntd, b3_lp@9 as b3_lp, b3_cnt@10 as b3_cnt, b3_cntd@11 as b3_cntd, b4_lp@12 as b4_lp, b4_cnt@13 as b4_cnt, b4_cntd@14 as b4_cntd, b5_lp@15 as b5_lp, b5_cnt@16 as b5_cnt, b5_cntd@17 as b5_cntd, b6_lp@0 as b6_lp, b6_cnt@1 as b6_cnt, b6_cntd@2 as b6_cntd] │ GlobalLimitExec: skip=0, fetch=100 @@ -3901,57 +3778,57 @@ mod tests { └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ AggregateExec: mode=Partial, gby=[], aggr=[avg(store_sales.ss_list_price), count(store_sales.ss_list_price), count(DISTINCT store_sales.ss_list_price)] - │ FilterExec: ss_quantity@0 >= 26 AND ss_quantity@0 <= 30 AND (ss_list_price@2 >= Some(15400),7,2 AND ss_list_price@2 <= Some(16400),7,2 OR ss_coupon_amt@3 >= Some(732600),7,2 AND ss_coupon_amt@3 <= Some(832600),7,2 OR ss_wholesale_cost@1 >= Some(700),7,2 AND ss_wholesale_cost@1 <= Some(2700),7,2), projection=[ss_list_price@2] + │ FilterExec: ss_quantity@0 >= 26 AND ss_quantity@0 <= 30 AND (ss_list_price@2 >= 154.00 AND ss_list_price@2 <= 164.00 OR ss_coupon_amt@3 >= 7326.00 AND ss_coupon_amt@3 <= 8326.00 OR ss_wholesale_cost@1 >= 7.00 AND ss_wholesale_cost@1 <= 27.00), projection=[ss_list_price@2] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 26 AND ss_quantity@10 <= 30 AND (ss_list_price@12 >= Some(15400),7,2 AND ss_list_price@12 <= Some(16400),7,2 OR ss_coupon_amt@19 >= Some(732600),7,2 AND ss_coupon_amt@19 <= Some(832600),7,2 OR ss_wholesale_cost@11 >= Some(700),7,2 AND ss_wholesale_cost@11 <= Some(2700),7,2), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 26 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 30 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= Some(15400),7,2 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= Some(16400),7,2 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= Some(732600),7,2 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= Some(832600),7,2 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= Some(700),7,2 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= Some(2700),7,2), required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 26 AND ss_quantity@10 <= 30 AND (ss_list_price@12 >= Some(15400),7,2 AND ss_list_price@12 <= Some(16400),7,2 OR ss_coupon_amt@19 >= Some(732600),7,2 AND ss_coupon_amt@19 <= Some(832600),7,2 OR ss_wholesale_cost@11 >= Some(700),7,2 AND ss_wholesale_cost@11 <= Some(2700),7,2), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 26 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 30 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= Some(15400),7,2 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= Some(16400),7,2 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= Some(732600),7,2 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= Some(832600),7,2 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= Some(700),7,2 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= Some(2700),7,2), required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 26 AND ss_quantity@10 <= 30 AND (ss_list_price@12 >= Some(15400),7,2 AND ss_list_price@12 <= Some(16400),7,2 OR ss_coupon_amt@19 >= Some(732600),7,2 AND ss_coupon_amt@19 <= Some(832600),7,2 OR ss_wholesale_cost@11 >= Some(700),7,2 AND ss_wholesale_cost@11 <= Some(2700),7,2), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 26 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 30 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= Some(15400),7,2 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= Some(16400),7,2 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= Some(732600),7,2 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= Some(832600),7,2 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= Some(700),7,2 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= Some(2700),7,2), required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 26 AND ss_quantity@10 <= 30 AND (ss_list_price@12 >= Some(15400),7,2 AND ss_list_price@12 <= Some(16400),7,2 OR ss_coupon_amt@19 >= Some(732600),7,2 AND ss_coupon_amt@19 <= Some(832600),7,2 OR ss_wholesale_cost@11 >= Some(700),7,2 AND ss_wholesale_cost@11 <= Some(2700),7,2), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 26 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 30 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= Some(15400),7,2 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= Some(16400),7,2 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= Some(732600),7,2 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= Some(832600),7,2 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= Some(700),7,2 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= Some(2700),7,2), required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 26 AND ss_quantity@10 <= 30 AND (ss_list_price@12 >= 154.00 AND ss_list_price@12 <= 164.00 OR ss_coupon_amt@19 >= 7326.00 AND ss_coupon_amt@19 <= 8326.00 OR ss_wholesale_cost@11 >= 7.00 AND ss_wholesale_cost@11 <= 27.00), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 26 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 30 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= 154.00 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= 164.00 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= 7326.00 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= 8326.00 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= 7.00 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= 27.00), required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 26 AND ss_quantity@10 <= 30 AND (ss_list_price@12 >= 154.00 AND ss_list_price@12 <= 164.00 OR ss_coupon_amt@19 >= 7326.00 AND ss_coupon_amt@19 <= 8326.00 OR ss_wholesale_cost@11 >= 7.00 AND ss_wholesale_cost@11 <= 27.00), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 26 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 30 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= 154.00 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= 164.00 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= 7326.00 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= 8326.00 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= 7.00 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= 27.00), required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 26 AND ss_quantity@10 <= 30 AND (ss_list_price@12 >= 154.00 AND ss_list_price@12 <= 164.00 OR ss_coupon_amt@19 >= 7326.00 AND ss_coupon_amt@19 <= 8326.00 OR ss_wholesale_cost@11 >= 7.00 AND ss_wholesale_cost@11 <= 27.00), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 26 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 30 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= 154.00 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= 164.00 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= 7326.00 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= 8326.00 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= 7.00 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= 27.00), required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 26 AND ss_quantity@10 <= 30 AND (ss_list_price@12 >= 154.00 AND ss_list_price@12 <= 164.00 OR ss_coupon_amt@19 >= 7326.00 AND ss_coupon_amt@19 <= 8326.00 OR ss_wholesale_cost@11 >= 7.00 AND ss_wholesale_cost@11 <= 27.00), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 26 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 30 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= 154.00 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= 164.00 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= 7326.00 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= 8326.00 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= 7.00 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= 27.00), required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ AggregateExec: mode=Partial, gby=[], aggr=[avg(store_sales.ss_list_price), count(store_sales.ss_list_price), count(DISTINCT store_sales.ss_list_price)] - │ FilterExec: ss_quantity@0 >= 21 AND ss_quantity@0 <= 25 AND (ss_list_price@2 >= Some(12200),7,2 AND ss_list_price@2 <= Some(13200),7,2 OR ss_coupon_amt@3 >= Some(83600),7,2 AND ss_coupon_amt@3 <= Some(183600),7,2 OR ss_wholesale_cost@1 >= Some(1700),7,2 AND ss_wholesale_cost@1 <= Some(3700),7,2), projection=[ss_list_price@2] + │ FilterExec: ss_quantity@0 >= 21 AND ss_quantity@0 <= 25 AND (ss_list_price@2 >= 122.00 AND ss_list_price@2 <= 132.00 OR ss_coupon_amt@3 >= 836.00 AND ss_coupon_amt@3 <= 1836.00 OR ss_wholesale_cost@1 >= 17.00 AND ss_wholesale_cost@1 <= 37.00), projection=[ss_list_price@2] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 21 AND ss_quantity@10 <= 25 AND (ss_list_price@12 >= Some(12200),7,2 AND ss_list_price@12 <= Some(13200),7,2 OR ss_coupon_amt@19 >= Some(83600),7,2 AND ss_coupon_amt@19 <= Some(183600),7,2 OR ss_wholesale_cost@11 >= Some(1700),7,2 AND ss_wholesale_cost@11 <= Some(3700),7,2), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 21 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 25 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= Some(12200),7,2 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= Some(13200),7,2 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= Some(83600),7,2 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= Some(183600),7,2 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= Some(1700),7,2 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= Some(3700),7,2), required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 21 AND ss_quantity@10 <= 25 AND (ss_list_price@12 >= Some(12200),7,2 AND ss_list_price@12 <= Some(13200),7,2 OR ss_coupon_amt@19 >= Some(83600),7,2 AND ss_coupon_amt@19 <= Some(183600),7,2 OR ss_wholesale_cost@11 >= Some(1700),7,2 AND ss_wholesale_cost@11 <= Some(3700),7,2), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 21 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 25 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= Some(12200),7,2 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= Some(13200),7,2 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= Some(83600),7,2 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= Some(183600),7,2 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= Some(1700),7,2 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= Some(3700),7,2), required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 21 AND ss_quantity@10 <= 25 AND (ss_list_price@12 >= Some(12200),7,2 AND ss_list_price@12 <= Some(13200),7,2 OR ss_coupon_amt@19 >= Some(83600),7,2 AND ss_coupon_amt@19 <= Some(183600),7,2 OR ss_wholesale_cost@11 >= Some(1700),7,2 AND ss_wholesale_cost@11 <= Some(3700),7,2), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 21 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 25 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= Some(12200),7,2 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= Some(13200),7,2 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= Some(83600),7,2 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= Some(183600),7,2 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= Some(1700),7,2 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= Some(3700),7,2), required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 21 AND ss_quantity@10 <= 25 AND (ss_list_price@12 >= Some(12200),7,2 AND ss_list_price@12 <= Some(13200),7,2 OR ss_coupon_amt@19 >= Some(83600),7,2 AND ss_coupon_amt@19 <= Some(183600),7,2 OR ss_wholesale_cost@11 >= Some(1700),7,2 AND ss_wholesale_cost@11 <= Some(3700),7,2), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 21 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 25 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= Some(12200),7,2 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= Some(13200),7,2 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= Some(83600),7,2 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= Some(183600),7,2 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= Some(1700),7,2 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= Some(3700),7,2), required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 21 AND ss_quantity@10 <= 25 AND (ss_list_price@12 >= 122.00 AND ss_list_price@12 <= 132.00 OR ss_coupon_amt@19 >= 836.00 AND ss_coupon_amt@19 <= 1836.00 OR ss_wholesale_cost@11 >= 17.00 AND ss_wholesale_cost@11 <= 37.00), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 21 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 25 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= 122.00 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= 132.00 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= 836.00 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= 1836.00 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= 17.00 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= 37.00), required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 21 AND ss_quantity@10 <= 25 AND (ss_list_price@12 >= 122.00 AND ss_list_price@12 <= 132.00 OR ss_coupon_amt@19 >= 836.00 AND ss_coupon_amt@19 <= 1836.00 OR ss_wholesale_cost@11 >= 17.00 AND ss_wholesale_cost@11 <= 37.00), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 21 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 25 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= 122.00 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= 132.00 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= 836.00 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= 1836.00 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= 17.00 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= 37.00), required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 21 AND ss_quantity@10 <= 25 AND (ss_list_price@12 >= 122.00 AND ss_list_price@12 <= 132.00 OR ss_coupon_amt@19 >= 836.00 AND ss_coupon_amt@19 <= 1836.00 OR ss_wholesale_cost@11 >= 17.00 AND ss_wholesale_cost@11 <= 37.00), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 21 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 25 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= 122.00 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= 132.00 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= 836.00 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= 1836.00 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= 17.00 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= 37.00), required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 21 AND ss_quantity@10 <= 25 AND (ss_list_price@12 >= 122.00 AND ss_list_price@12 <= 132.00 OR ss_coupon_amt@19 >= 836.00 AND ss_coupon_amt@19 <= 1836.00 OR ss_wholesale_cost@11 >= 17.00 AND ss_wholesale_cost@11 <= 37.00), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 21 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 25 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= 122.00 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= 132.00 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= 836.00 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= 1836.00 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= 17.00 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= 37.00), required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ AggregateExec: mode=Partial, gby=[], aggr=[avg(store_sales.ss_list_price), count(store_sales.ss_list_price), count(DISTINCT store_sales.ss_list_price)] - │ FilterExec: ss_quantity@0 >= 16 AND ss_quantity@0 <= 20 AND (ss_list_price@2 >= Some(13500),7,2 AND ss_list_price@2 <= Some(14500),7,2 OR ss_coupon_amt@3 >= Some(607100),7,2 AND ss_coupon_amt@3 <= Some(707100),7,2 OR ss_wholesale_cost@1 >= Some(3800),7,2 AND ss_wholesale_cost@1 <= Some(5800),7,2), projection=[ss_list_price@2] + │ FilterExec: ss_quantity@0 >= 16 AND ss_quantity@0 <= 20 AND (ss_list_price@2 >= 135.00 AND ss_list_price@2 <= 145.00 OR ss_coupon_amt@3 >= 6071.00 AND ss_coupon_amt@3 <= 7071.00 OR ss_wholesale_cost@1 >= 38.00 AND ss_wholesale_cost@1 <= 58.00), projection=[ss_list_price@2] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 16 AND ss_quantity@10 <= 20 AND (ss_list_price@12 >= Some(13500),7,2 AND ss_list_price@12 <= Some(14500),7,2 OR ss_coupon_amt@19 >= Some(607100),7,2 AND ss_coupon_amt@19 <= Some(707100),7,2 OR ss_wholesale_cost@11 >= Some(3800),7,2 AND ss_wholesale_cost@11 <= Some(5800),7,2), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 16 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 20 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= Some(13500),7,2 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= Some(14500),7,2 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= Some(607100),7,2 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= Some(707100),7,2 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= Some(3800),7,2 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= Some(5800),7,2), required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 16 AND ss_quantity@10 <= 20 AND (ss_list_price@12 >= Some(13500),7,2 AND ss_list_price@12 <= Some(14500),7,2 OR ss_coupon_amt@19 >= Some(607100),7,2 AND ss_coupon_amt@19 <= Some(707100),7,2 OR ss_wholesale_cost@11 >= Some(3800),7,2 AND ss_wholesale_cost@11 <= Some(5800),7,2), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 16 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 20 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= Some(13500),7,2 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= Some(14500),7,2 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= Some(607100),7,2 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= Some(707100),7,2 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= Some(3800),7,2 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= Some(5800),7,2), required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 16 AND ss_quantity@10 <= 20 AND (ss_list_price@12 >= Some(13500),7,2 AND ss_list_price@12 <= Some(14500),7,2 OR ss_coupon_amt@19 >= Some(607100),7,2 AND ss_coupon_amt@19 <= Some(707100),7,2 OR ss_wholesale_cost@11 >= Some(3800),7,2 AND ss_wholesale_cost@11 <= Some(5800),7,2), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 16 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 20 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= Some(13500),7,2 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= Some(14500),7,2 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= Some(607100),7,2 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= Some(707100),7,2 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= Some(3800),7,2 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= Some(5800),7,2), required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 16 AND ss_quantity@10 <= 20 AND (ss_list_price@12 >= Some(13500),7,2 AND ss_list_price@12 <= Some(14500),7,2 OR ss_coupon_amt@19 >= Some(607100),7,2 AND ss_coupon_amt@19 <= Some(707100),7,2 OR ss_wholesale_cost@11 >= Some(3800),7,2 AND ss_wholesale_cost@11 <= Some(5800),7,2), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 16 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 20 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= Some(13500),7,2 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= Some(14500),7,2 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= Some(607100),7,2 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= Some(707100),7,2 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= Some(3800),7,2 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= Some(5800),7,2), required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 16 AND ss_quantity@10 <= 20 AND (ss_list_price@12 >= 135.00 AND ss_list_price@12 <= 145.00 OR ss_coupon_amt@19 >= 6071.00 AND ss_coupon_amt@19 <= 7071.00 OR ss_wholesale_cost@11 >= 38.00 AND ss_wholesale_cost@11 <= 58.00), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 16 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 20 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= 135.00 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= 145.00 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= 6071.00 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= 7071.00 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= 38.00 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= 58.00), required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 16 AND ss_quantity@10 <= 20 AND (ss_list_price@12 >= 135.00 AND ss_list_price@12 <= 145.00 OR ss_coupon_amt@19 >= 6071.00 AND ss_coupon_amt@19 <= 7071.00 OR ss_wholesale_cost@11 >= 38.00 AND ss_wholesale_cost@11 <= 58.00), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 16 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 20 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= 135.00 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= 145.00 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= 6071.00 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= 7071.00 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= 38.00 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= 58.00), required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 16 AND ss_quantity@10 <= 20 AND (ss_list_price@12 >= 135.00 AND ss_list_price@12 <= 145.00 OR ss_coupon_amt@19 >= 6071.00 AND ss_coupon_amt@19 <= 7071.00 OR ss_wholesale_cost@11 >= 38.00 AND ss_wholesale_cost@11 <= 58.00), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 16 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 20 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= 135.00 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= 145.00 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= 6071.00 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= 7071.00 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= 38.00 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= 58.00), required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 16 AND ss_quantity@10 <= 20 AND (ss_list_price@12 >= 135.00 AND ss_list_price@12 <= 145.00 OR ss_coupon_amt@19 >= 6071.00 AND ss_coupon_amt@19 <= 7071.00 OR ss_wholesale_cost@11 >= 38.00 AND ss_wholesale_cost@11 <= 58.00), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 16 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 20 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= 135.00 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= 145.00 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= 6071.00 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= 7071.00 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= 38.00 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= 58.00), required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ AggregateExec: mode=Partial, gby=[], aggr=[avg(store_sales.ss_list_price), count(store_sales.ss_list_price), count(DISTINCT store_sales.ss_list_price)] - │ FilterExec: ss_quantity@0 >= 11 AND ss_quantity@0 <= 15 AND (ss_list_price@2 >= Some(14200),7,2 AND ss_list_price@2 <= Some(15200),7,2 OR ss_coupon_amt@3 >= Some(1221400),7,2 AND ss_coupon_amt@3 <= Some(1321400),7,2 OR ss_wholesale_cost@1 >= Some(7900),7,2 AND ss_wholesale_cost@1 <= Some(9900),7,2), projection=[ss_list_price@2] + │ FilterExec: ss_quantity@0 >= 11 AND ss_quantity@0 <= 15 AND (ss_list_price@2 >= 142.00 AND ss_list_price@2 <= 152.00 OR ss_coupon_amt@3 >= 12214.00 AND ss_coupon_amt@3 <= 13214.00 OR ss_wholesale_cost@1 >= 79.00 AND ss_wholesale_cost@1 <= 99.00), projection=[ss_list_price@2] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 11 AND ss_quantity@10 <= 15 AND (ss_list_price@12 >= Some(14200),7,2 AND ss_list_price@12 <= Some(15200),7,2 OR ss_coupon_amt@19 >= Some(1221400),7,2 AND ss_coupon_amt@19 <= Some(1321400),7,2 OR ss_wholesale_cost@11 >= Some(7900),7,2 AND ss_wholesale_cost@11 <= Some(9900),7,2), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 11 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 15 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= Some(14200),7,2 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= Some(15200),7,2 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= Some(1221400),7,2 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= Some(1321400),7,2 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= Some(7900),7,2 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= Some(9900),7,2), required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 11 AND ss_quantity@10 <= 15 AND (ss_list_price@12 >= Some(14200),7,2 AND ss_list_price@12 <= Some(15200),7,2 OR ss_coupon_amt@19 >= Some(1221400),7,2 AND ss_coupon_amt@19 <= Some(1321400),7,2 OR ss_wholesale_cost@11 >= Some(7900),7,2 AND ss_wholesale_cost@11 <= Some(9900),7,2), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 11 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 15 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= Some(14200),7,2 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= Some(15200),7,2 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= Some(1221400),7,2 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= Some(1321400),7,2 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= Some(7900),7,2 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= Some(9900),7,2), required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 11 AND ss_quantity@10 <= 15 AND (ss_list_price@12 >= Some(14200),7,2 AND ss_list_price@12 <= Some(15200),7,2 OR ss_coupon_amt@19 >= Some(1221400),7,2 AND ss_coupon_amt@19 <= Some(1321400),7,2 OR ss_wholesale_cost@11 >= Some(7900),7,2 AND ss_wholesale_cost@11 <= Some(9900),7,2), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 11 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 15 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= Some(14200),7,2 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= Some(15200),7,2 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= Some(1221400),7,2 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= Some(1321400),7,2 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= Some(7900),7,2 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= Some(9900),7,2), required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 11 AND ss_quantity@10 <= 15 AND (ss_list_price@12 >= Some(14200),7,2 AND ss_list_price@12 <= Some(15200),7,2 OR ss_coupon_amt@19 >= Some(1221400),7,2 AND ss_coupon_amt@19 <= Some(1321400),7,2 OR ss_wholesale_cost@11 >= Some(7900),7,2 AND ss_wholesale_cost@11 <= Some(9900),7,2), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 11 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 15 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= Some(14200),7,2 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= Some(15200),7,2 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= Some(1221400),7,2 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= Some(1321400),7,2 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= Some(7900),7,2 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= Some(9900),7,2), required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 11 AND ss_quantity@10 <= 15 AND (ss_list_price@12 >= 142.00 AND ss_list_price@12 <= 152.00 OR ss_coupon_amt@19 >= 12214.00 AND ss_coupon_amt@19 <= 13214.00 OR ss_wholesale_cost@11 >= 79.00 AND ss_wholesale_cost@11 <= 99.00), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 11 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 15 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= 142.00 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= 152.00 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= 12214.00 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= 13214.00 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= 79.00 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= 99.00), required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 11 AND ss_quantity@10 <= 15 AND (ss_list_price@12 >= 142.00 AND ss_list_price@12 <= 152.00 OR ss_coupon_amt@19 >= 12214.00 AND ss_coupon_amt@19 <= 13214.00 OR ss_wholesale_cost@11 >= 79.00 AND ss_wholesale_cost@11 <= 99.00), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 11 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 15 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= 142.00 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= 152.00 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= 12214.00 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= 13214.00 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= 79.00 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= 99.00), required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 11 AND ss_quantity@10 <= 15 AND (ss_list_price@12 >= 142.00 AND ss_list_price@12 <= 152.00 OR ss_coupon_amt@19 >= 12214.00 AND ss_coupon_amt@19 <= 13214.00 OR ss_wholesale_cost@11 >= 79.00 AND ss_wholesale_cost@11 <= 99.00), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 11 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 15 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= 142.00 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= 152.00 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= 12214.00 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= 13214.00 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= 79.00 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= 99.00), required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 11 AND ss_quantity@10 <= 15 AND (ss_list_price@12 >= 142.00 AND ss_list_price@12 <= 152.00 OR ss_coupon_amt@19 >= 12214.00 AND ss_coupon_amt@19 <= 13214.00 OR ss_wholesale_cost@11 >= 79.00 AND ss_wholesale_cost@11 <= 99.00), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 11 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 15 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= 142.00 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= 152.00 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= 12214.00 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= 13214.00 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= 79.00 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= 99.00), required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ AggregateExec: mode=Partial, gby=[], aggr=[avg(store_sales.ss_list_price), count(store_sales.ss_list_price), count(DISTINCT store_sales.ss_list_price)] - │ FilterExec: ss_quantity@0 >= 0 AND ss_quantity@0 <= 5 AND (ss_list_price@2 >= Some(800),7,2 AND ss_list_price@2 <= Some(1800),7,2 OR ss_coupon_amt@3 >= Some(45900),7,2 AND ss_coupon_amt@3 <= Some(145900),7,2 OR ss_wholesale_cost@1 >= Some(5700),7,2 AND ss_wholesale_cost@1 <= Some(7700),7,2), projection=[ss_list_price@2] + │ FilterExec: ss_quantity@0 >= 0 AND ss_quantity@0 <= 5 AND (ss_list_price@2 >= 8.00 AND ss_list_price@2 <= 18.00 OR ss_coupon_amt@3 >= 459.00 AND ss_coupon_amt@3 <= 1459.00 OR ss_wholesale_cost@1 >= 57.00 AND ss_wholesale_cost@1 <= 77.00), projection=[ss_list_price@2] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 0 AND ss_quantity@10 <= 5 AND (ss_list_price@12 >= Some(800),7,2 AND ss_list_price@12 <= Some(1800),7,2 OR ss_coupon_amt@19 >= Some(45900),7,2 AND ss_coupon_amt@19 <= Some(145900),7,2 OR ss_wholesale_cost@11 >= Some(5700),7,2 AND ss_wholesale_cost@11 <= Some(7700),7,2), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 0 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 5 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= Some(800),7,2 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= Some(1800),7,2 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= Some(45900),7,2 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= Some(145900),7,2 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= Some(5700),7,2 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= Some(7700),7,2), required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 0 AND ss_quantity@10 <= 5 AND (ss_list_price@12 >= Some(800),7,2 AND ss_list_price@12 <= Some(1800),7,2 OR ss_coupon_amt@19 >= Some(45900),7,2 AND ss_coupon_amt@19 <= Some(145900),7,2 OR ss_wholesale_cost@11 >= Some(5700),7,2 AND ss_wholesale_cost@11 <= Some(7700),7,2), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 0 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 5 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= Some(800),7,2 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= Some(1800),7,2 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= Some(45900),7,2 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= Some(145900),7,2 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= Some(5700),7,2 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= Some(7700),7,2), required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 0 AND ss_quantity@10 <= 5 AND (ss_list_price@12 >= Some(800),7,2 AND ss_list_price@12 <= Some(1800),7,2 OR ss_coupon_amt@19 >= Some(45900),7,2 AND ss_coupon_amt@19 <= Some(145900),7,2 OR ss_wholesale_cost@11 >= Some(5700),7,2 AND ss_wholesale_cost@11 <= Some(7700),7,2), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 0 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 5 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= Some(800),7,2 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= Some(1800),7,2 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= Some(45900),7,2 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= Some(145900),7,2 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= Some(5700),7,2 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= Some(7700),7,2), required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 0 AND ss_quantity@10 <= 5 AND (ss_list_price@12 >= Some(800),7,2 AND ss_list_price@12 <= Some(1800),7,2 OR ss_coupon_amt@19 >= Some(45900),7,2 AND ss_coupon_amt@19 <= Some(145900),7,2 OR ss_wholesale_cost@11 >= Some(5700),7,2 AND ss_wholesale_cost@11 <= Some(7700),7,2), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 0 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 5 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= Some(800),7,2 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= Some(1800),7,2 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= Some(45900),7,2 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= Some(145900),7,2 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= Some(5700),7,2 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= Some(7700),7,2), required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 0 AND ss_quantity@10 <= 5 AND (ss_list_price@12 >= 8.00 AND ss_list_price@12 <= 18.00 OR ss_coupon_amt@19 >= 459.00 AND ss_coupon_amt@19 <= 1459.00 OR ss_wholesale_cost@11 >= 57.00 AND ss_wholesale_cost@11 <= 77.00), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 0 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 5 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= 8.00 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= 18.00 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= 459.00 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= 1459.00 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= 57.00 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= 77.00), required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 0 AND ss_quantity@10 <= 5 AND (ss_list_price@12 >= 8.00 AND ss_list_price@12 <= 18.00 OR ss_coupon_amt@19 >= 459.00 AND ss_coupon_amt@19 <= 1459.00 OR ss_wholesale_cost@11 >= 57.00 AND ss_wholesale_cost@11 <= 77.00), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 0 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 5 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= 8.00 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= 18.00 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= 459.00 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= 1459.00 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= 57.00 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= 77.00), required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 0 AND ss_quantity@10 <= 5 AND (ss_list_price@12 >= 8.00 AND ss_list_price@12 <= 18.00 OR ss_coupon_amt@19 >= 459.00 AND ss_coupon_amt@19 <= 1459.00 OR ss_wholesale_cost@11 >= 57.00 AND ss_wholesale_cost@11 <= 77.00), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 0 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 5 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= 8.00 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= 18.00 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= 459.00 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= 1459.00 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= 57.00 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= 77.00), required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 0 AND ss_quantity@10 <= 5 AND (ss_list_price@12 >= 8.00 AND ss_list_price@12 <= 18.00 OR ss_coupon_amt@19 >= 459.00 AND ss_coupon_amt@19 <= 1459.00 OR ss_wholesale_cost@11 >= 57.00 AND ss_wholesale_cost@11 <= 77.00), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 0 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 5 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= 8.00 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= 18.00 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= 459.00 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= 1459.00 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= 57.00 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= 77.00), required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ AggregateExec: mode=Partial, gby=[], aggr=[avg(store_sales.ss_list_price), count(store_sales.ss_list_price), count(DISTINCT store_sales.ss_list_price)] - │ FilterExec: ss_quantity@0 >= 6 AND ss_quantity@0 <= 10 AND (ss_list_price@2 >= Some(9000),7,2 AND ss_list_price@2 <= Some(10000),7,2 OR ss_coupon_amt@3 >= Some(232300),7,2 AND ss_coupon_amt@3 <= Some(332300),7,2 OR ss_wholesale_cost@1 >= Some(3100),7,2 AND ss_wholesale_cost@1 <= Some(5100),7,2), projection=[ss_list_price@2] + │ FilterExec: ss_quantity@0 >= 6 AND ss_quantity@0 <= 10 AND (ss_list_price@2 >= 90.00 AND ss_list_price@2 <= 100.00 OR ss_coupon_amt@3 >= 2323.00 AND ss_coupon_amt@3 <= 3323.00 OR ss_wholesale_cost@1 >= 31.00 AND ss_wholesale_cost@1 <= 51.00), projection=[ss_list_price@2] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 6 AND ss_quantity@10 <= 10 AND (ss_list_price@12 >= Some(9000),7,2 AND ss_list_price@12 <= Some(10000),7,2 OR ss_coupon_amt@19 >= Some(232300),7,2 AND ss_coupon_amt@19 <= Some(332300),7,2 OR ss_wholesale_cost@11 >= Some(3100),7,2 AND ss_wholesale_cost@11 <= Some(5100),7,2), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 6 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 10 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= Some(9000),7,2 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= Some(10000),7,2 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= Some(232300),7,2 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= Some(332300),7,2 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= Some(3100),7,2 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= Some(5100),7,2), required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 6 AND ss_quantity@10 <= 10 AND (ss_list_price@12 >= Some(9000),7,2 AND ss_list_price@12 <= Some(10000),7,2 OR ss_coupon_amt@19 >= Some(232300),7,2 AND ss_coupon_amt@19 <= Some(332300),7,2 OR ss_wholesale_cost@11 >= Some(3100),7,2 AND ss_wholesale_cost@11 <= Some(5100),7,2), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 6 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 10 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= Some(9000),7,2 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= Some(10000),7,2 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= Some(232300),7,2 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= Some(332300),7,2 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= Some(3100),7,2 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= Some(5100),7,2), required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 6 AND ss_quantity@10 <= 10 AND (ss_list_price@12 >= Some(9000),7,2 AND ss_list_price@12 <= Some(10000),7,2 OR ss_coupon_amt@19 >= Some(232300),7,2 AND ss_coupon_amt@19 <= Some(332300),7,2 OR ss_wholesale_cost@11 >= Some(3100),7,2 AND ss_wholesale_cost@11 <= Some(5100),7,2), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 6 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 10 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= Some(9000),7,2 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= Some(10000),7,2 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= Some(232300),7,2 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= Some(332300),7,2 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= Some(3100),7,2 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= Some(5100),7,2), required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 6 AND ss_quantity@10 <= 10 AND (ss_list_price@12 >= Some(9000),7,2 AND ss_list_price@12 <= Some(10000),7,2 OR ss_coupon_amt@19 >= Some(232300),7,2 AND ss_coupon_amt@19 <= Some(332300),7,2 OR ss_wholesale_cost@11 >= Some(3100),7,2 AND ss_wholesale_cost@11 <= Some(5100),7,2), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 6 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 10 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= Some(9000),7,2 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= Some(10000),7,2 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= Some(232300),7,2 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= Some(332300),7,2 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= Some(3100),7,2 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= Some(5100),7,2), required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 6 AND ss_quantity@10 <= 10 AND (ss_list_price@12 >= 90.00 AND ss_list_price@12 <= 100.00 OR ss_coupon_amt@19 >= 2323.00 AND ss_coupon_amt@19 <= 3323.00 OR ss_wholesale_cost@11 >= 31.00 AND ss_wholesale_cost@11 <= 51.00), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 6 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 10 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= 90.00 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= 100.00 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= 2323.00 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= 3323.00 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= 31.00 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= 51.00), required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 6 AND ss_quantity@10 <= 10 AND (ss_list_price@12 >= 90.00 AND ss_list_price@12 <= 100.00 OR ss_coupon_amt@19 >= 2323.00 AND ss_coupon_amt@19 <= 3323.00 OR ss_wholesale_cost@11 >= 31.00 AND ss_wholesale_cost@11 <= 51.00), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 6 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 10 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= 90.00 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= 100.00 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= 2323.00 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= 3323.00 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= 31.00 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= 51.00), required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 6 AND ss_quantity@10 <= 10 AND (ss_list_price@12 >= 90.00 AND ss_list_price@12 <= 100.00 OR ss_coupon_amt@19 >= 2323.00 AND ss_coupon_amt@19 <= 3323.00 OR ss_wholesale_cost@11 >= 31.00 AND ss_wholesale_cost@11 <= 51.00), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 6 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 10 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= 90.00 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= 100.00 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= 2323.00 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= 3323.00 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= 31.00 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= 51.00), required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_quantity, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=ss_quantity@10 >= 6 AND ss_quantity@10 <= 10 AND (ss_list_price@12 >= 90.00 AND ss_list_price@12 <= 100.00 OR ss_coupon_amt@19 >= 2323.00 AND ss_coupon_amt@19 <= 3323.00 OR ss_wholesale_cost@11 >= 31.00 AND ss_wholesale_cost@11 <= 51.00), pruning_predicate=ss_quantity_null_count@1 != row_count@2 AND ss_quantity_max@0 >= 6 AND ss_quantity_null_count@1 != row_count@2 AND ss_quantity_min@3 <= 10 AND (ss_list_price_null_count@5 != row_count@2 AND ss_list_price_max@4 >= 90.00 AND ss_list_price_null_count@5 != row_count@2 AND ss_list_price_min@6 <= 100.00 OR ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_max@7 >= 2323.00 AND ss_coupon_amt_null_count@8 != row_count@2 AND ss_coupon_amt_min@9 <= 3323.00 OR ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_max@10 >= 31.00 AND ss_wholesale_cost_null_count@11 != row_count@2 AND ss_wholesale_cost_min@12 <= 51.00), required_guarantees=[] └────────────────────────────────────────────────── "); Ok(()) @@ -3959,7 +3836,7 @@ mod tests { #[tokio::test] async fn test_tpcds_29() -> Result<()> { let display = test_tpcds_query("q29").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [i_item_id@0 ASC NULLS LAST, i_item_desc@1 ASC NULLS LAST, s_store_id@2 ASC NULLS LAST, s_store_name@3 ASC NULLS LAST], fetch=100 │ [Stage 11] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -3975,7 +3852,7 @@ mod tests { │ AggregateExec: mode=Partial, gby=[i_item_id@5 as i_item_id, i_item_desc@6 as i_item_desc, s_store_id@3 as s_store_id, s_store_name@4 as s_store_name], aggr=[sum(store_sales.ss_quantity), sum(store_returns.sr_return_quantity), sum(catalog_sales.cs_quantity)] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@0)], projection=[ss_quantity@4, sr_return_quantity@5, cs_quantity@6, s_store_id@7, s_store_name@8, i_item_id@1, i_item_desc@2] │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(s_store_sk@0, ss_store_sk@1)], projection=[ss_item_sk@3, ss_quantity@5, sr_return_quantity@6, cs_quantity@7, s_store_id@1, s_store_name@2] │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 @@ -3992,13 +3869,13 @@ mod tests { │ [Stage 6] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ [Stage 9] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -4011,32 +3888,29 @@ mod tests { ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 1999 OR d_year@1 = 2000 OR d_year@1 = 2001, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (1999, 2000, 2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (1999, 2000, 2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (1999, 2000, 2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (1999, 2000, 2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (1999, 2000, 2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (1999, 2000, 2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (1999, 2000, 2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (1999, 2000, 2001)] └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_moy@2 >= 9 AND d_moy@2 <= 12 AND d_year@1 = 1999, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 >= 9 AND d_moy@8 <= 12 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@1 != row_count@2 AND d_moy_max@0 >= 9 AND d_moy_null_count@1 != row_count@2 AND d_moy_min@3 <= 12 AND d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_year in (1999)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 >= 9 AND d_moy@8 <= 12 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@1 != row_count@2 AND d_moy_max@0 >= 9 AND d_moy_null_count@1 != row_count@2 AND d_moy_min@3 <= 12 AND d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_year in (1999)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 >= 9 AND d_moy@8 <= 12 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@1 != row_count@2 AND d_moy_max@0 >= 9 AND d_moy_null_count@1 != row_count@2 AND d_moy_min@3 <= 12 AND d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_year in (1999)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 >= 9 AND d_moy@8 <= 12 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@1 != row_count@2 AND d_moy_max@0 >= 9 AND d_moy_null_count@1 != row_count@2 AND d_moy_min@3 <= 12 AND d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_year in (1999)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 >= 9 AND d_moy@8 <= 12 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@1 != row_count@2 AND d_moy_max@0 >= 9 AND d_moy_null_count@1 != row_count@2 AND d_moy_min@3 <= 12 AND d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_year in (1999)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 >= 9 AND d_moy@8 <= 12 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@1 != row_count@2 AND d_moy_max@0 >= 9 AND d_moy_null_count@1 != row_count@2 AND d_moy_min@3 <= 12 AND d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_year in (1999)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 >= 9 AND d_moy@8 <= 12 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@1 != row_count@2 AND d_moy_max@0 >= 9 AND d_moy_null_count@1 != row_count@2 AND d_moy_min@3 <= 12 AND d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_year in (1999)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 >= 9 AND d_moy@8 <= 12 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@1 != row_count@2 AND d_moy_max@0 >= 9 AND d_moy_null_count@1 != row_count@2 AND d_moy_min@3 <= 12 AND d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_year in (1999)] └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_moy@2 = 9 AND d_year@1 = 1999, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 9 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 9 AND 9 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (9), d_year in (1999)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 9 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 9 AND 9 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (9), d_year in (1999)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 9 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 9 AND 9 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (9), d_year in (1999)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 9 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 9 AND 9 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (9), d_year in (1999)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 9 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 9 AND 9 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (9), d_year in (1999)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 9 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 9 AND 9 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (9), d_year in (1999)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 9 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 9 AND 9 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (9), d_year in (1999)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 9 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 9 AND 9 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (9), d_year in (1999)] └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cs_bill_customer_sk@1, cs_item_sk@2], 12), input_partitions=3 @@ -4180,7 +4054,7 @@ mod tests { #[tokio::test] async fn test_tpcds_31() -> Result<()> { let display = test_tpcds_query("q31").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [ca_county@0 ASC NULLS LAST] │ [Stage 25] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -4189,7 +4063,7 @@ mod tests { │ SortExec: expr=[ca_county@0 ASC NULLS LAST], preserve_partitioning=[true] │ ProjectionExec: expr=[ca_county@2 as ca_county, d_year@3 as d_year, __common_expr_1@0 / CAST(web_sales@6 AS Float64) as web_q1_q2_increase, __common_expr_2@1 / CAST(store_sales@4 AS Float64) as store_q1_q2_increase, CAST(web_sales@7 AS Float64) / __common_expr_1@0 as web_q2_q3_increase, CAST(store_sales@5 AS Float64) / __common_expr_2@1 as store_q2_q3_increase] │ ProjectionExec: expr=[CAST(web_sales@0 AS Float64) as __common_expr_1, CAST(store_sales@1 AS Float64) as __common_expr_2, ca_county@2 as ca_county, d_year@3 as d_year, store_sales@4 as store_sales, store_sales@5 as store_sales, web_sales@6 as web_sales, web_sales@7 as web_sales] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_county@5, ca_county@0)], filter=CASE WHEN web_sales@2 > Some(0),17,2 THEN CAST(web_sales@3 AS Float64) / CAST(web_sales@2 AS Float64) END > CASE WHEN store_sales@0 > Some(0),17,2 THEN CAST(store_sales@1 AS Float64) / CAST(store_sales@0 AS Float64) END, projection=[web_sales@7, store_sales@3, ca_county@0, d_year@1, store_sales@2, store_sales@4, web_sales@6, web_sales@9] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_county@5, ca_county@0)], filter=CASE WHEN web_sales@2 > 0.00 THEN CAST(web_sales@3 AS Float64) / CAST(web_sales@2 AS Float64) END > CASE WHEN store_sales@0 > 0.00 THEN CAST(store_sales@1 AS Float64) / CAST(store_sales@0 AS Float64) END, projection=[web_sales@7, store_sales@3, ca_county@0, d_year@1, store_sales@2, store_sales@4, web_sales@6, web_sales@9] │ CoalescePartitionsExec │ [Stage 21] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=6, input_tasks=2 │ ProjectionExec: expr=[ca_county@0 as ca_county, sum(web_sales.ws_ext_sales_price)@3 as web_sales] @@ -4198,7 +4072,7 @@ mod tests { └────────────────────────────────────────────────── ┌───── Stage 21 ── Tasks: t0:[p0..p5] t1:[p6..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=2, output_partitions=6 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_county@5, ca_county@0)], filter=CASE WHEN web_sales@2 > Some(0),17,2 THEN CAST(web_sales@3 AS Float64) / CAST(web_sales@2 AS Float64) END > CASE WHEN store_sales@0 > Some(0),17,2 THEN CAST(store_sales@1 AS Float64) / CAST(store_sales@0 AS Float64) END, projection=[ca_county@0, d_year@1, store_sales@2, store_sales@3, store_sales@4, ca_county@5, web_sales@6, web_sales@8] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_county@5, ca_county@0)], filter=CASE WHEN web_sales@2 > 0.00 THEN CAST(web_sales@3 AS Float64) / CAST(web_sales@2 AS Float64) END > CASE WHEN store_sales@0 > 0.00 THEN CAST(store_sales@1 AS Float64) / CAST(store_sales@0 AS Float64) END, projection=[ca_county@0, d_year@1, store_sales@2, store_sales@3, store_sales@4, ca_county@5, web_sales@6, web_sales@8] │ CoalescePartitionsExec │ [Stage 17] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=6, input_tasks=1 │ ProjectionExec: expr=[ca_county@0 as ca_county, sum(web_sales.ws_ext_sales_price)@3 as web_sales] @@ -4228,12 +4102,11 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ws_bill_addr_sk@0, ca_address_sk@0)], projection=[ws_ext_sales_price@1, d_year@2, d_qoy@3, ca_county@5] │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -4249,12 +4122,11 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_qoy@2 = 1 AND d_year@1 = 2000 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 1 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 1 AND 1 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (1), d_year in (2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 1 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 1 AND 1 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (1), d_year in (2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 1 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 1 AND 1 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (1), d_year in (2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 1 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 1 AND 1 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (1), d_year in (2000)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 1 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 1 AND 1 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (1), d_year in (2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 1 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 1 AND 1 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (1), d_year in (2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 1 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 1 AND 1 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (1), d_year in (2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 1 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 1 AND 1 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (1), d_year in (2000)] └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p2] t1:[p0..p2] │ RepartitionExec: partitioning=Hash([ca_county@0], 3), input_partitions=3 @@ -4267,7 +4139,7 @@ mod tests { │ AggregateExec: mode=Partial, gby=[ca_county@3 as ca_county, d_qoy@2 as d_qoy, d_year@1 as d_year], aggr=[sum(store_sales.ss_ext_sales_price)], ordering_mode=PartiallySorted([1, 2]) │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, ss_addr_sk@0)], projection=[ss_ext_sales_price@3, d_year@4, d_qoy@5, ca_county@1] │ CoalescePartitionsExec - │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_addr_sk@4, ss_ext_sales_price@5, d_year@1, d_qoy@2] │ CoalescePartitionsExec │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -4277,23 +4149,22 @@ mod tests { │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 5 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_qoy@2 = 1 AND d_year@1 = 2000 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 1 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 1 AND 1 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (1), d_year in (2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 1 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 1 AND 1 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (1), d_year in (2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 1 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 1 AND 1 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (1), d_year in (2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 1 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 1 AND 1 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (1), d_year in (2000)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 1 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 1 AND 1 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (1), d_year in (2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 1 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 1 AND 1 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (1), d_year in (2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 1 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 1 AND 1 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (1), d_year in (2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 1 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 1 AND 1 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (1), d_year in (2000)] └────────────────────────────────────────────────── ┌───── Stage 12 ── Tasks: t0:[p0..p2] t1:[p0..p2] │ RepartitionExec: partitioning=Hash([ca_county@0], 3), input_partitions=3 @@ -4306,7 +4177,7 @@ mod tests { │ AggregateExec: mode=Partial, gby=[ca_county@3 as ca_county, d_qoy@2 as d_qoy, d_year@1 as d_year], aggr=[sum(store_sales.ss_ext_sales_price)], ordering_mode=PartiallySorted([1, 2]) │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, ss_addr_sk@0)], projection=[ss_ext_sales_price@3, d_year@4, d_qoy@5, ca_county@1] │ CoalescePartitionsExec - │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_addr_sk@4, ss_ext_sales_price@5, d_year@1, d_qoy@2] │ CoalescePartitionsExec │ [Stage 10] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -4316,23 +4187,22 @@ mod tests { │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 9 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 10 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_qoy@2 = 2 AND d_year@1 = 2000 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2000)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2000)] └────────────────────────────────────────────────── ┌───── Stage 16 ── Tasks: t0:[p0..p2] t1:[p0..p2] │ RepartitionExec: partitioning=Hash([ca_county@0], 3), input_partitions=3 @@ -4345,7 +4215,7 @@ mod tests { │ AggregateExec: mode=Partial, gby=[ca_county@3 as ca_county, d_qoy@2 as d_qoy, d_year@1 as d_year], aggr=[sum(store_sales.ss_ext_sales_price)], ordering_mode=PartiallySorted([1, 2]) │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, ss_addr_sk@0)], projection=[ss_ext_sales_price@3, d_year@4, d_qoy@5, ca_county@1] │ CoalescePartitionsExec - │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_addr_sk@4, ss_ext_sales_price@5, d_year@1, d_qoy@2] │ CoalescePartitionsExec │ [Stage 14] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -4355,23 +4225,22 @@ mod tests { │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 13 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 14 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_qoy@2 = 3 AND d_year@1 = 2000 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 3 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 3 AND 3 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (3), d_year in (2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 3 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 3 AND 3 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (3), d_year in (2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 3 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 3 AND 3 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (3), d_year in (2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 3 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 3 AND 3 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (3), d_year in (2000)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 3 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 3 AND 3 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (3), d_year in (2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 3 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 3 AND 3 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (3), d_year in (2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 3 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 3 AND 3 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (3), d_year in (2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 3 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 3 AND 3 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (3), d_year in (2000)] └────────────────────────────────────────────────── ┌───── Stage 20 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([ca_county@0, d_qoy@1, d_year@2], 6), input_partitions=3 @@ -4379,12 +4248,11 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ws_bill_addr_sk@0, ca_address_sk@0)], projection=[ws_ext_sales_price@1, d_year@2, d_qoy@3, ca_county@5] │ CoalescePartitionsExec │ [Stage 19] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 19 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -4400,12 +4268,11 @@ mod tests { ┌───── Stage 18 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_qoy@2 = 2 AND d_year@1 = 2000 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2000)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2000)] └────────────────────────────────────────────────── ┌───── Stage 24 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([ca_county@0, d_qoy@1, d_year@2], 6), input_partitions=3 @@ -4413,12 +4280,11 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ws_bill_addr_sk@0, ca_address_sk@0)], projection=[ws_ext_sales_price@1, d_year@2, d_qoy@3, ca_county@5] │ CoalescePartitionsExec │ [Stage 23] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 23 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -4434,12 +4300,11 @@ mod tests { ┌───── Stage 22 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_qoy@2 = 3 AND d_year@1 = 2000 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 3 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 3 AND 3 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (3), d_year in (2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 3 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 3 AND 3 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (3), d_year in (2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 3 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 3 AND 3 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (3), d_year in (2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 3 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 3 AND 3 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (3), d_year in (2000)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 3 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 3 AND 3 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (3), d_year in (2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 3 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 3 AND 3 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (3), d_year in (2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 3 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 3 AND 3 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (3), d_year in (2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 3 AND d_year@6 = 2000, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 3 AND 3 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_qoy in (3), d_year in (2000)] └────────────────────────────────────────────────── "); Ok(()) @@ -4447,7 +4312,7 @@ mod tests { #[tokio::test] async fn test_tpcds_32() -> Result<()> { let display = test_tpcds_query("q32").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ ProjectionExec: expr=[sum(catalog_sales.cs_ext_discount_amt)@0 as excess discount amount] │ GlobalLimitExec: skip=0, fetch=100 @@ -4457,7 +4322,7 @@ mod tests { └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ AggregateExec: mode=Partial, gby=[], aggr=[sum(catalog_sales.cs_ext_discount_amt)] - │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(i_item_sk@1, cs_item_sk@1)], filter=CAST(cs_ext_discount_amt@0 AS Decimal128(30, 15)) > Float64(1.3) * avg(catalog_sales.cs_ext_discount_amt)@1, projection=[cs_ext_discount_amt@0] + │ HashJoinExec: mode=Partitioned, join_type=LeftSemi, on=[(i_item_sk@1, cs_item_sk@1)], filter=CAST(cs_ext_discount_amt@0 AS Decimal128(30, 15)) > Float64(1.3) * avg(catalog_sales.cs_ext_discount_amt)@1, projection=[cs_ext_discount_amt@0] │ [Stage 3] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ ProjectionExec: expr=[CAST(1.3 * CAST(avg(catalog_sales.cs_ext_discount_amt)@1 AS Float64) AS Decimal128(30, 15)) as Float64(1.3) * avg(catalog_sales.cs_ext_discount_amt), cs_item_sk@0 as cs_item_sk] │ AggregateExec: mode=FinalPartitioned, gby=[cs_item_sk@0 as cs_item_sk], aggr=[avg(catalog_sales.cs_ext_discount_amt)] @@ -4480,22 +4345,20 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_date@1 >= 2000-01-27 AND d_date@1 <= 2000-04-26, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_manufact_id@1 = 977, projection=[i_item_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=i_manufact_id@13 = 977, pruning_predicate=i_manufact_id_null_count@2 != row_count@3 AND i_manufact_id_min@0 <= 977 AND 977 <= i_manufact_id_max@1, required_guarantees=[i_manufact_id in (977)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=i_manufact_id@13 = 977, pruning_predicate=i_manufact_id_null_count@2 != row_count@3 AND i_manufact_id_min@0 <= 977 AND 977 <= i_manufact_id_max@1, required_guarantees=[i_manufact_id in (977)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=i_manufact_id@13 = 977, pruning_predicate=i_manufact_id_null_count@2 != row_count@3 AND i_manufact_id_min@0 <= 977 AND 977 <= i_manufact_id_max@1, required_guarantees=[i_manufact_id in (977)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=i_manufact_id@13 = 977, pruning_predicate=i_manufact_id_null_count@2 != row_count@3 AND i_manufact_id_min@0 <= 977 AND 977 <= i_manufact_id_max@1, required_guarantees=[i_manufact_id in (977)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=i_manufact_id@13 = 977, pruning_predicate=i_manufact_id_null_count@2 != row_count@3 AND i_manufact_id_min@0 <= 977 AND 977 <= i_manufact_id_max@1, required_guarantees=[i_manufact_id in (977)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=i_manufact_id@13 = 977, pruning_predicate=i_manufact_id_null_count@2 != row_count@3 AND i_manufact_id_min@0 <= 977 AND 977 <= i_manufact_id_max@1, required_guarantees=[i_manufact_id in (977)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=i_manufact_id@13 = 977, pruning_predicate=i_manufact_id_null_count@2 != row_count@3 AND i_manufact_id_min@0 <= 977 AND 977 <= i_manufact_id_max@1, required_guarantees=[i_manufact_id in (977)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=i_manufact_id@13 = 977, pruning_predicate=i_manufact_id_null_count@2 != row_count@3 AND i_manufact_id_min@0 <= 977 AND 977 <= i_manufact_id_max@1, required_guarantees=[i_manufact_id in (977)] └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cs_item_sk@0], 12), input_partitions=3 @@ -4512,12 +4375,11 @@ mod tests { ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_date@1 >= 2000-01-27 AND d_date@1 <= 2000-04-26, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] └────────────────────────────────────────────────── "); Ok(()) @@ -4525,7 +4387,7 @@ mod tests { #[tokio::test] async fn test_tpcds_33() -> Result<()> { let display = test_tpcds_query("q33").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [total_sales@1 ASC NULLS LAST], fetch=100 │ [Stage 16] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -4553,7 +4415,7 @@ mod tests { │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@0)], projection=[ss_ext_sales_price@3, i_manufact_id@1] │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, ss_addr_sk@1)], projection=[ss_item_sk@1, ss_ext_sales_price@3] │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -4569,40 +4431,37 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_category@0 = Electronics, projection=[i_manufact_id@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Electronics, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1, required_guarantees=[i_category in (Electronics)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Electronics, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1, required_guarantees=[i_category in (Electronics)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Electronics, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1, required_guarantees=[i_category in (Electronics)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Electronics, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1, required_guarantees=[i_category in (Electronics)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Electronics, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1, required_guarantees=[i_category in (Electronics)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Electronics, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1, required_guarantees=[i_category in (Electronics)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Electronics, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1, required_guarantees=[i_category in (Electronics)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Electronics, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1, required_guarantees=[i_category in (Electronics)] └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: ca_gmt_offset@1 = Some(-500),5,2, projection=[ca_address_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] + │ FilterExec: ca_gmt_offset@1 = -5.00, projection=[ca_address_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 1998 AND d_moy@2 = 5, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 5, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 5 AND 5 <= d_moy_max@5, required_guarantees=[d_moy in (5), d_year in (1998)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 5, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 5 AND 5 <= d_moy_max@5, required_guarantees=[d_moy in (5), d_year in (1998)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 5, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 5 AND 5 <= d_moy_max@5, required_guarantees=[d_moy in (5), d_year in (1998)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 5, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 5 AND 5 <= d_moy_max@5, required_guarantees=[d_moy in (5), d_year in (1998)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 5, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 5 AND 5 <= d_moy_max@5, required_guarantees=[d_moy in (5), d_year in (1998)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 5, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 5 AND 5 <= d_moy_max@5, required_guarantees=[d_moy in (5), d_year in (1998)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 5, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 5 AND 5 <= d_moy_max@5, required_guarantees=[d_moy in (5), d_year in (1998)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 5, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 5 AND 5 <= d_moy_max@5, required_guarantees=[d_moy in (5), d_year in (1998)] └────────────────────────────────────────────────── ┌───── Stage 10 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([i_manufact_id@0], 6), input_partitions=3 @@ -4612,7 +4471,7 @@ mod tests { │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, cs_item_sk@0)], projection=[cs_ext_sales_price@3, i_manufact_id@1] │ CoalescePartitionsExec - │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, cs_bill_addr_sk@0)], projection=[cs_item_sk@2, cs_ext_sales_price@3] │ CoalescePartitionsExec │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -4628,40 +4487,37 @@ mod tests { ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_category@0 = Electronics, projection=[i_manufact_id@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Electronics, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1, required_guarantees=[i_category in (Electronics)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Electronics, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1, required_guarantees=[i_category in (Electronics)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Electronics, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1, required_guarantees=[i_category in (Electronics)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Electronics, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1, required_guarantees=[i_category in (Electronics)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Electronics, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1, required_guarantees=[i_category in (Electronics)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Electronics, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1, required_guarantees=[i_category in (Electronics)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Electronics, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1, required_guarantees=[i_category in (Electronics)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Electronics, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1, required_guarantees=[i_category in (Electronics)] └────────────────────────────────────────────────── - ┌───── Stage 7 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: ca_gmt_offset@1 = Some(-500),5,2, projection=[ca_address_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] + │ FilterExec: ca_gmt_offset@1 = -5.00, projection=[ca_address_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] └────────────────────────────────────────────────── ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 1998 AND d_moy@2 = 5, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 5, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 5 AND 5 <= d_moy_max@5, required_guarantees=[d_moy in (5), d_year in (1998)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 5, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 5 AND 5 <= d_moy_max@5, required_guarantees=[d_moy in (5), d_year in (1998)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 5, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 5 AND 5 <= d_moy_max@5, required_guarantees=[d_moy in (5), d_year in (1998)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 5, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 5 AND 5 <= d_moy_max@5, required_guarantees=[d_moy in (5), d_year in (1998)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 5, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 5 AND 5 <= d_moy_max@5, required_guarantees=[d_moy in (5), d_year in (1998)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 5, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 5 AND 5 <= d_moy_max@5, required_guarantees=[d_moy in (5), d_year in (1998)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 5, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 5 AND 5 <= d_moy_max@5, required_guarantees=[d_moy in (5), d_year in (1998)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 5, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 5 AND 5 <= d_moy_max@5, required_guarantees=[d_moy in (5), d_year in (1998)] └────────────────────────────────────────────────── ┌───── Stage 15 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([i_manufact_id@0], 6), input_partitions=3 @@ -4671,7 +4527,7 @@ mod tests { │ [Stage 11] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ws_item_sk@0)], projection=[ws_ext_sales_price@3, i_manufact_id@1] │ CoalescePartitionsExec - │ [Stage 12] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 12] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, ws_bill_addr_sk@1)], projection=[ws_item_sk@1, ws_ext_sales_price@3] │ CoalescePartitionsExec │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -4687,40 +4543,37 @@ mod tests { ┌───── Stage 11 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_category@0 = Electronics, projection=[i_manufact_id@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Electronics, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1, required_guarantees=[i_category in (Electronics)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Electronics, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1, required_guarantees=[i_category in (Electronics)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Electronics, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1, required_guarantees=[i_category in (Electronics)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Electronics, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1, required_guarantees=[i_category in (Electronics)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Electronics, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1, required_guarantees=[i_category in (Electronics)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Electronics, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1, required_guarantees=[i_category in (Electronics)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Electronics, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1, required_guarantees=[i_category in (Electronics)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Electronics, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1, required_guarantees=[i_category in (Electronics)] └────────────────────────────────────────────────── - ┌───── Stage 12 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 12 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: ca_gmt_offset@1 = Some(-500),5,2, projection=[ca_address_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] + │ FilterExec: ca_gmt_offset@1 = -5.00, projection=[ca_address_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] └────────────────────────────────────────────────── ┌───── Stage 14 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 1998 AND d_moy@2 = 5, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 5, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 5 AND 5 <= d_moy_max@5, required_guarantees=[d_moy in (5), d_year in (1998)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 5, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 5 AND 5 <= d_moy_max@5, required_guarantees=[d_moy in (5), d_year in (1998)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 5, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 5 AND 5 <= d_moy_max@5, required_guarantees=[d_moy in (5), d_year in (1998)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 5, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 5 AND 5 <= d_moy_max@5, required_guarantees=[d_moy in (5), d_year in (1998)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 5, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 5 AND 5 <= d_moy_max@5, required_guarantees=[d_moy in (5), d_year in (1998)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 5, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 5 AND 5 <= d_moy_max@5, required_guarantees=[d_moy in (5), d_year in (1998)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 5, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 5 AND 5 <= d_moy_max@5, required_guarantees=[d_moy in (5), d_year in (1998)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 5, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 5 AND 5 <= d_moy_max@5, required_guarantees=[d_moy in (5), d_year in (1998)] └────────────────────────────────────────────────── "); Ok(()) @@ -4728,7 +4581,7 @@ mod tests { #[tokio::test] async fn test_tpcds_34() -> Result<()> { let display = test_tpcds_query("q34").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [c_last_name@0 ASC, c_first_name@1 ASC, c_salutation@2 ASC, c_preferred_cust_flag@3 DESC, ss_ticket_number@4 ASC] │ [Stage 6] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 @@ -4737,19 +4590,19 @@ mod tests { │ SortExec: expr=[c_last_name@0 ASC, c_first_name@1 ASC, c_salutation@2 ASC, c_preferred_cust_flag@3 DESC, ss_ticket_number@4 ASC], preserve_partitioning=[true] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ss_customer_sk@1)], projection=[c_last_name@3, c_first_name@2, c_salutation@1, c_preferred_cust_flag@4, ss_ticket_number@5, cnt@7] │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ ProjectionExec: expr=[ss_ticket_number@0 as ss_ticket_number, ss_customer_sk@1 as ss_customer_sk, count(Int64(1))@2 as cnt] │ FilterExec: count(Int64(1))@2 >= 15 AND count(Int64(1))@2 <= 20 │ AggregateExec: mode=FinalPartitioned, gby=[ss_ticket_number@0 as ss_ticket_number, ss_customer_sk@1 as ss_customer_sk], aggr=[count(Int64(1))] │ [Stage 5] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_salutation, c_first_name, c_last_name, c_preferred_cust_flag], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_salutation, c_first_name, c_last_name, c_preferred_cust_flag], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_salutation, c_first_name, c_last_name, c_preferred_cust_flag], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_salutation, c_first_name, c_last_name, c_preferred_cust_flag], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_salutation, c_first_name, c_last_name, c_preferred_cust_flag], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_salutation, c_first_name, c_last_name, c_preferred_cust_flag], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_salutation, c_first_name, c_last_name, c_preferred_cust_flag], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_salutation, c_first_name, c_last_name, c_preferred_cust_flag], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_ticket_number@0, ss_customer_sk@1], 12), input_partitions=3 @@ -4792,12 +4645,11 @@ mod tests { ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: (d_dom@2 >= 1 AND d_dom@2 <= 3 OR d_dom@2 >= 25 AND d_dom@2 <= 28) AND (d_year@1 = 1999 OR d_year@1 = 2000 OR d_year@1 = 2001), projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_dom], file_type=parquet, predicate=(d_dom@9 >= 1 AND d_dom@9 <= 3 OR d_dom@9 >= 25 AND d_dom@9 <= 28) AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=(d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 1 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 3 OR d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 25 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 28) AND (d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_year in (1999, 2000, 2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_dom], file_type=parquet, predicate=(d_dom@9 >= 1 AND d_dom@9 <= 3 OR d_dom@9 >= 25 AND d_dom@9 <= 28) AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=(d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 1 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 3 OR d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 25 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 28) AND (d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_year in (1999, 2000, 2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_dom], file_type=parquet, predicate=(d_dom@9 >= 1 AND d_dom@9 <= 3 OR d_dom@9 >= 25 AND d_dom@9 <= 28) AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=(d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 1 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 3 OR d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 25 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 28) AND (d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_year in (1999, 2000, 2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_dom], file_type=parquet, predicate=(d_dom@9 >= 1 AND d_dom@9 <= 3 OR d_dom@9 >= 25 AND d_dom@9 <= 28) AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=(d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 1 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 3 OR d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 25 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 28) AND (d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_year in (1999, 2000, 2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_dom], file_type=parquet, predicate=(d_dom@9 >= 1 AND d_dom@9 <= 3 OR d_dom@9 >= 25 AND d_dom@9 <= 28) AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=(d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 1 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 3 OR d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 25 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 28) AND (d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_year in (1999, 2000, 2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_dom], file_type=parquet, predicate=(d_dom@9 >= 1 AND d_dom@9 <= 3 OR d_dom@9 >= 25 AND d_dom@9 <= 28) AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=(d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 1 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 3 OR d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 25 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 28) AND (d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_year in (1999, 2000, 2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_dom], file_type=parquet, predicate=(d_dom@9 >= 1 AND d_dom@9 <= 3 OR d_dom@9 >= 25 AND d_dom@9 <= 28) AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=(d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 1 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 3 OR d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 25 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 28) AND (d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_year in (1999, 2000, 2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_dom], file_type=parquet, predicate=(d_dom@9 >= 1 AND d_dom@9 <= 3 OR d_dom@9 >= 25 AND d_dom@9 <= 28) AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=(d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 1 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 3 OR d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 25 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 28) AND (d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_year in (1999, 2000, 2001)] └────────────────────────────────────────────────── "); Ok(()) @@ -4805,7 +4657,7 @@ mod tests { #[tokio::test] async fn test_tpcds_35() -> Result<()> { let display = test_tpcds_query("q35").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [ca_state@0 ASC, cd_gender@1 ASC, cd_marital_status@2 ASC, cd_dep_count@3 ASC, cd_dep_employed_count@8 ASC, cd_dep_college_count@13 ASC], fetch=100 │ SortExec: TopK(fetch=100), expr=[ca_state@0 ASC, cd_gender@1 ASC, cd_marital_status@2 ASC, cd_dep_count@3 ASC, cd_dep_employed_count@8 ASC, cd_dep_college_count@13 ASC], preserve_partitioning=[true] @@ -4816,86 +4668,89 @@ mod tests { │ FilterExec: mark@6 OR mark@7, projection=[ca_state@0, cd_gender@1, cd_marital_status@2, cd_dep_count@3, cd_dep_employed_count@4, cd_dep_college_count@5] │ HashJoinExec: mode=CollectLeft, join_type=LeftMark, on=[(c_customer_sk@0, cs_ship_customer_sk@0)], projection=[ca_state@1, cd_gender@2, cd_marital_status@3, cd_dep_count@4, cd_dep_employed_count@5, cd_dep_college_count@6, mark@7, mark@8] │ CoalescePartitionsExec - │ HashJoinExec: mode=CollectLeft, join_type=LeftMark, on=[(c_customer_sk@0, ws_bill_customer_sk@0)] + │ HashJoinExec: mode=CollectLeft, join_type=RightMark, on=[(ws_bill_customer_sk@0, c_customer_sk@0)] │ CoalescePartitionsExec - │ HashJoinExec: mode=CollectLeft, join_type=LeftSemi, on=[(c_customer_sk@0, ss_customer_sk@0)] - │ CoalescePartitionsExec - │ [Stage 3] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_customer_sk@2] - │ CoalescePartitionsExec - │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[ws_bill_customer_sk@2] + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=LeftSemi, on=[(c_customer_sk@0, ss_customer_sk@0)] │ CoalescePartitionsExec - │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_ship_customer_sk@2] + │ [Stage 5] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_customer_sk@1] + │ CoalescePartitionsExec + │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_ship_customer_sk@1] │ CoalescePartitionsExec - │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 + │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_ship_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 3 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + ┌───── Stage 2 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[ws_bill_customer_sk@1] + │ CoalescePartitionsExec + │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + └────────────────────────────────────────────────── + ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ FilterExec: d_year@1 = 2002 AND d_qoy@2 < 4, projection=[d_date_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_year@6 = 2002 AND d_qoy@10 < 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_qoy_null_count@5 != row_count@3 AND d_qoy_min@4 < 4, required_guarantees=[d_year in (2002)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_year@6 = 2002 AND d_qoy@10 < 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_qoy_null_count@5 != row_count@3 AND d_qoy_min@4 < 4, required_guarantees=[d_year in (2002)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_year@6 = 2002 AND d_qoy@10 < 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_qoy_null_count@5 != row_count@3 AND d_qoy_min@4 < 4, required_guarantees=[d_year in (2002)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_year@6 = 2002 AND d_qoy@10 < 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_qoy_null_count@5 != row_count@3 AND d_qoy_min@4 < 4, required_guarantees=[d_year in (2002)] + └────────────────────────────────────────────────── + ┌───── Stage 5 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_current_cdemo_sk@1, cd_demo_sk@0)], projection=[c_customer_sk@0, ca_state@2, cd_gender@4, cd_marital_status@5, cd_dep_count@6, cd_dep_employed_count@7, cd_dep_college_count@8] │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, c_current_addr_sk@2)], projection=[c_customer_sk@2, c_current_cdemo_sk@3, ca_state@1] │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 4 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] - │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 - │ FilterExec: d_year@1 = 2002 AND d_qoy@2 < 4, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_year@6 = 2002 AND d_qoy@10 < 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_qoy_null_count@5 != row_count@3 AND d_qoy_min@4 < 4, required_guarantees=[d_year in (2002)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_year@6 = 2002 AND d_qoy@10 < 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_qoy_null_count@5 != row_count@3 AND d_qoy_min@4 < 4, required_guarantees=[d_year in (2002)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_year@6 = 2002 AND d_qoy@10 < 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_qoy_null_count@5 != row_count@3 AND d_qoy_min@4 < 4, required_guarantees=[d_year in (2002)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_year@6 = 2002 AND d_qoy@10 < 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_qoy_null_count@5 != row_count@3 AND d_qoy_min@4 < 4, required_guarantees=[d_year in (2002)] - └────────────────────────────────────────────────── - ┌───── Stage 5 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + ┌───── Stage 6 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 │ FilterExec: d_year@1 = 2002 AND d_qoy@2 < 4, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_year@6 = 2002 AND d_qoy@10 < 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_qoy_null_count@5 != row_count@3 AND d_qoy_min@4 < 4, required_guarantees=[d_year in (2002)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_year@6 = 2002 AND d_qoy@10 < 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_qoy_null_count@5 != row_count@3 AND d_qoy_min@4 < 4, required_guarantees=[d_year in (2002)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_year@6 = 2002 AND d_qoy@10 < 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_qoy_null_count@5 != row_count@3 AND d_qoy_min@4 < 4, required_guarantees=[d_year in (2002)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_year@6 = 2002 AND d_qoy@10 < 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_qoy_null_count@5 != row_count@3 AND d_qoy_min@4 < 4, required_guarantees=[d_year in (2002)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_year@6 = 2002 AND d_qoy@10 < 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_qoy_null_count@5 != row_count@3 AND d_qoy_min@4 < 4, required_guarantees=[d_year in (2002)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_year@6 = 2002 AND d_qoy@10 < 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_qoy_null_count@5 != row_count@3 AND d_qoy_min@4 < 4, required_guarantees=[d_year in (2002)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_year@6 = 2002 AND d_qoy@10 < 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_qoy_null_count@5 != row_count@3 AND d_qoy_min@4 < 4, required_guarantees=[d_year in (2002)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_year@6 = 2002 AND d_qoy@10 < 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_qoy_null_count@5 != row_count@3 AND d_qoy_min@4 < 4, required_guarantees=[d_year in (2002)] └────────────────────────────────────────────────── - ┌───── Stage 6 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + ┌───── Stage 7 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 │ FilterExec: d_year@1 = 2002 AND d_qoy@2 < 4, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_year@6 = 2002 AND d_qoy@10 < 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_qoy_null_count@5 != row_count@3 AND d_qoy_min@4 < 4, required_guarantees=[d_year in (2002)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_year@6 = 2002 AND d_qoy@10 < 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_qoy_null_count@5 != row_count@3 AND d_qoy_min@4 < 4, required_guarantees=[d_year in (2002)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_year@6 = 2002 AND d_qoy@10 < 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_qoy_null_count@5 != row_count@3 AND d_qoy_min@4 < 4, required_guarantees=[d_year in (2002)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_year@6 = 2002 AND d_qoy@10 < 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_qoy_null_count@5 != row_count@3 AND d_qoy_min@4 < 4, required_guarantees=[d_year in (2002)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_year@6 = 2002 AND d_qoy@10 < 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_qoy_null_count@5 != row_count@3 AND d_qoy_min@4 < 4, required_guarantees=[d_year in (2002)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_year@6 = 2002 AND d_qoy@10 < 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_qoy_null_count@5 != row_count@3 AND d_qoy_min@4 < 4, required_guarantees=[d_year in (2002)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_year@6 = 2002 AND d_qoy@10 < 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_qoy_null_count@5 != row_count@3 AND d_qoy_min@4 < 4, required_guarantees=[d_year in (2002)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_year@6 = 2002 AND d_qoy@10 < 4, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1 AND d_qoy_null_count@5 != row_count@3 AND d_qoy_min@4 < 4, required_guarantees=[d_year in (2002)] └────────────────────────────────────────────────── "); Ok(()) @@ -4946,7 +4801,7 @@ mod tests { │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@0)], projection=[ss_store_sk@4, ss_ext_sales_price@5, ss_net_profit@6, i_class@1, i_category@2] │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_item_sk@2, ss_store_sk@3, ss_ext_sales_price@4, ss_net_profit@5] │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -4966,23 +4821,22 @@ mod tests { │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_state], file_type=parquet, predicate=s_state@24 = TN, pruning_predicate=s_state_null_count@2 != row_count@3 AND s_state_min@0 <= TN AND TN <= s_state_max@1, required_guarantees=[s_state in (TN)] │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_state], file_type=parquet, predicate=s_state@24 = TN, pruning_predicate=s_state_null_count@2 != row_count@3 AND s_state_min@0 <= TN AND TN <= s_state_max@1, required_guarantees=[s_state in (TN)] └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2001, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] └────────────────────────────────────────────────── ┌───── Stage 9 ── Tasks: t0:[p0..p2] t1:[p0..p2] │ RepartitionExec: partitioning=Hash([i_category@0], 3), input_partitions=3 @@ -4999,7 +4853,7 @@ mod tests { │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@0)], projection=[ss_store_sk@4, ss_ext_sales_price@5, ss_net_profit@6, i_class@1, i_category@2] │ CoalescePartitionsExec - │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_item_sk@2, ss_store_sk@3, ss_ext_sales_price@4, ss_net_profit@5] │ CoalescePartitionsExec │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -5019,23 +4873,22 @@ mod tests { │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_state], file_type=parquet, predicate=s_state@24 = TN, pruning_predicate=s_state_null_count@2 != row_count@3 AND s_state_min@0 <= TN AND TN <= s_state_max@1, required_guarantees=[s_state in (TN)] │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_state], file_type=parquet, predicate=s_state@24 = TN, pruning_predicate=s_state_null_count@2 != row_count@3 AND s_state_min@0 <= TN AND TN <= s_state_max@1, required_guarantees=[s_state in (TN)] └────────────────────────────────────────────────── - ┌───── Stage 6 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2001, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] └────────────────────────────────────────────────── ┌───── Stage 15 ── Tasks: t0:[p0..p2] t1:[p0..p2] │ AggregateExec: mode=Partial, gby=[], aggr=[sum(results.ss_net_profit), sum(results.ss_ext_sales_price)] @@ -5051,7 +4904,7 @@ mod tests { │ [Stage 11] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@0)], projection=[ss_store_sk@4, ss_ext_sales_price@5, ss_net_profit@6, i_class@1, i_category@2] │ CoalescePartitionsExec - │ [Stage 12] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 12] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_item_sk@2, ss_store_sk@3, ss_ext_sales_price@4, ss_net_profit@5] │ CoalescePartitionsExec │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -5071,23 +4924,22 @@ mod tests { │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_state], file_type=parquet, predicate=s_state@24 = TN, pruning_predicate=s_state_null_count@2 != row_count@3 AND s_state_min@0 <= TN AND TN <= s_state_max@1, required_guarantees=[s_state in (TN)] │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_state], file_type=parquet, predicate=s_state@24 = TN, pruning_predicate=s_state_null_count@2 != row_count@3 AND s_state_min@0 <= TN AND TN <= s_state_max@1, required_guarantees=[s_state in (TN)] └────────────────────────────────────────────────── - ┌───── Stage 12 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 12 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2001, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] └────────────────────────────────────────────────── "#); Ok(()) @@ -5095,70 +4947,58 @@ mod tests { #[tokio::test] async fn test_tpcds_37() -> Result<()> { let display = test_tpcds_query("q37").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [i_item_id@0 ASC NULLS LAST], fetch=100 - │ [Stage 5] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 + │ SortExec: TopK(fetch=100), expr=[i_item_id@0 ASC NULLS LAST], preserve_partitioning=[true] + │ AggregateExec: mode=FinalPartitioned, gby=[i_item_id@0 as i_item_id, i_item_desc@1 as i_item_desc, i_current_price@2 as i_current_price], aggr=[] + │ RepartitionExec: partitioning=Hash([i_item_id@0, i_item_desc@1, i_current_price@2], 3), input_partitions=3 + │ AggregateExec: mode=Partial, gby=[i_item_id@0 as i_item_id, i_item_desc@1 as i_item_desc, i_current_price@2 as i_current_price], aggr=[] + │ HashJoinExec: mode=CollectLeft, join_type=LeftSemi, on=[(i_item_sk@0, cs_item_sk@0)], projection=[i_item_id@1, i_item_desc@2, i_current_price@3] + │ CoalescePartitionsExec + │ [Stage 3] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 5 ── Tasks: t0:[p0..p2] t1:[p0..p2] - │ SortExec: TopK(fetch=100), expr=[i_item_id@0 ASC NULLS LAST], preserve_partitioning=[true] - │ AggregateExec: mode=FinalPartitioned, gby=[i_item_id@0 as i_item_id, i_item_desc@1 as i_item_desc, i_current_price@2 as i_current_price], aggr=[] - │ [Stage 4] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + ┌───── Stage 3 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_date_sk@0, inv_date_sk@4)], projection=[i_item_sk@0, i_item_id@1, i_item_desc@2, i_current_price@3] + │ CoalescePartitionsExec + │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, inv_item_sk@1)], projection=[i_item_sk@0, i_item_id@1, i_item_desc@2, i_current_price@3, inv_date_sk@4] + │ CoalescePartitionsExec + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ FilterExec: inv_quantity_on_hand@2 >= 100 AND inv_quantity_on_hand@2 <= 500, projection=[inv_date_sk@0, inv_item_sk@1] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] └────────────────────────────────────────────────── - ┌───── Stage 4 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] - │ RepartitionExec: partitioning=Hash([i_item_id@0, i_item_desc@1, i_current_price@2], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[i_item_id@0 as i_item_id, i_item_desc@1 as i_item_desc, i_current_price@2 as i_current_price], aggr=[] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, cs_item_sk@0)], projection=[i_item_id@1, i_item_desc@2, i_current_price@3] - │ CoalescePartitionsExec - │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ FilterExec: d_date@1 >= 2000-02-01 AND d_date@1 <= 2000-04-01, projection=[d_date_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-02-01 AND d_date@2 <= 2000-04-01, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-01, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-02-01 AND d_date@2 <= 2000-04-01, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-01, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-02-01 AND d_date@2 <= 2000-04-01, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-01, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-02-01 AND d_date@2 <= 2000-04-01, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-01, required_guarantees=[] + └────────────────────────────────────────────────── + ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ FilterExec: i_current_price@3 >= 68.00 AND i_current_price@3 <= 98.00 AND i_manufact_id@4 IN (SET) ([677, 940, 694, 808]), projection=[i_item_sk@0, i_item_id@1, i_item_desc@2, i_current_price@3] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= 68.00 AND i_current_price@5 <= 98.00 AND i_manufact_id@13 IN (SET) ([677, 940, 694, 808]) AND DynamicFilter [ empty ], pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 68.00 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 98.00 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 677 AND 677 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 940 AND 940 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 694 AND 694 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 808 AND 808 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (677, 694, 808, 940)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= 68.00 AND i_current_price@5 <= 98.00 AND i_manufact_id@13 IN (SET) ([677, 940, 694, 808]) AND DynamicFilter [ empty ], pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 68.00 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 98.00 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 677 AND 677 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 940 AND 940 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 694 AND 694 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 808 AND 808 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (677, 694, 808, 940)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= 68.00 AND i_current_price@5 <= 98.00 AND i_manufact_id@13 IN (SET) ([677, 940, 694, 808]) AND DynamicFilter [ empty ], pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 68.00 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 98.00 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 677 AND 677 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 940 AND 940 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 694 AND 694 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 808 AND 808 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (677, 694, 808, 940)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= 68.00 AND i_current_price@5 <= 98.00 AND i_manufact_id@13 IN (SET) ([677, 940, 694, 808]) AND DynamicFilter [ empty ], pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 68.00 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 98.00 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 677 AND 677 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 940 AND 940 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 694 AND 694 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 808 AND 808 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (677, 694, 808, 940)] └────────────────────────────────────────────────── - ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, inv_date_sk@4)], projection=[i_item_sk@1, i_item_id@2, i_item_desc@3, i_current_price@4] - │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, inv_item_sk@1)], projection=[i_item_sk@0, i_item_id@1, i_item_desc@2, i_current_price@3, inv_date_sk@4] - │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ FilterExec: inv_quantity_on_hand@2 >= 100 AND inv_quantity_on_hand@2 <= 500, projection=[inv_date_sk@0, inv_item_sk@1] - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] - └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: d_date@1 >= 2000-02-01 AND d_date@1 <= 2000-04-01, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-02-01 AND d_date@2 <= 2000-04-01, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-01, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-02-01 AND d_date@2 <= 2000-04-01, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-01, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-02-01 AND d_date@2 <= 2000-04-01, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-01, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-02-01 AND d_date@2 <= 2000-04-01, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-01, required_guarantees=[] - └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: i_current_price@3 >= Some(6800),7,2 AND i_current_price@3 <= Some(9800),7,2 AND i_manufact_id@4 IN (SET) ([677, 940, 694, 808]), projection=[i_item_sk@0, i_item_id@1, i_item_desc@2, i_current_price@3] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= Some(6800),7,2 AND i_current_price@5 <= Some(9800),7,2 AND i_manufact_id@13 IN (SET) ([677, 940, 694, 808]) AND DynamicFilter [ empty ], pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= Some(6800),7,2 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= Some(9800),7,2 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 677 AND 677 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 940 AND 940 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 694 AND 694 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 808 AND 808 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (677, 694, 808, 940)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= Some(6800),7,2 AND i_current_price@5 <= Some(9800),7,2 AND i_manufact_id@13 IN (SET) ([677, 940, 694, 808]) AND DynamicFilter [ empty ], pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= Some(6800),7,2 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= Some(9800),7,2 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 677 AND 677 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 940 AND 940 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 694 AND 694 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 808 AND 808 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (677, 694, 808, 940)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= Some(6800),7,2 AND i_current_price@5 <= Some(9800),7,2 AND i_manufact_id@13 IN (SET) ([677, 940, 694, 808]) AND DynamicFilter [ empty ], pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= Some(6800),7,2 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= Some(9800),7,2 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 677 AND 677 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 940 AND 940 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 694 AND 694 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 808 AND 808 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (677, 694, 808, 940)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= Some(6800),7,2 AND i_current_price@5 <= Some(9800),7,2 AND i_manufact_id@13 IN (SET) ([677, 940, 694, 808]) AND DynamicFilter [ empty ], pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= Some(6800),7,2 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= Some(9800),7,2 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 677 AND 677 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 940 AND 940 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 694 AND 694 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 808 AND 808 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (677, 694, 808, 940)] - └────────────────────────────────────────────────── "); Ok(()) } #[tokio::test] async fn test_tpcds_38() -> Result<()> { let display = test_tpcds_query("q38").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ ProjectionExec: expr=[count(Int64(1))@0 as count(*)] │ GlobalLimitExec: skip=0, fetch=100 @@ -5184,7 +5024,7 @@ mod tests { │ AggregateExec: mode=Partial, gby=[c_last_name@0 as c_last_name, c_first_name@1 as c_first_name, d_date@2 as d_date], aggr=[] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, cs_bill_customer_sk@0)], projection=[c_last_name@2, c_first_name@1, d_date@4] │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_bill_customer_sk@3, d_date@1] │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -5194,30 +5034,29 @@ mod tests { │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_month_seq@2 >= 1200 AND d_month_seq@2 <= 1211, projection=[d_date_sk@0, d_date@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([c_last_name@0, c_first_name@1, d_date@2], 6), input_partitions=3 │ AggregateExec: mode=Partial, gby=[c_last_name@0 as c_last_name, c_first_name@1 as c_first_name, d_date@2 as d_date], aggr=[] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ss_customer_sk@0)], projection=[c_last_name@2, c_first_name@1, d_date@4] │ CoalescePartitionsExec - │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_customer_sk@3, d_date@1] │ CoalescePartitionsExec │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -5227,30 +5066,29 @@ mod tests { │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 4 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_month_seq@2 >= 1200 AND d_month_seq@2 <= 1211, projection=[d_date_sk@0, d_date@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 9 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([c_last_name@0, c_first_name@1, d_date@2], 6), input_partitions=3 │ AggregateExec: mode=Partial, gby=[c_last_name@0 as c_last_name, c_first_name@1 as c_first_name, d_date@2 as d_date], aggr=[] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ws_bill_customer_sk@0)], projection=[c_last_name@2, c_first_name@1, d_date@4] │ CoalescePartitionsExec - │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[ws_bill_customer_sk@3, d_date@1] │ CoalescePartitionsExec │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -5260,23 +5098,22 @@ mod tests { │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 7 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_month_seq@2 >= 1200 AND d_month_seq@2 <= 1211, projection=[d_date_sk@0, d_date@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] └────────────────────────────────────────────────── "); Ok(()) @@ -5284,7 +5121,7 @@ mod tests { #[tokio::test] async fn test_tpcds_39() -> Result<()> { let display = test_tpcds_query("q39").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [wsk1@0 ASC, isk1@1 ASC, dmoy1@2 ASC, mean1@3 ASC, cov1@4 ASC, d_moy@7 ASC, mean@8 ASC, cov@9 ASC] │ SortExec: expr=[wsk1@0 ASC, isk1@1 ASC, mean1@3 ASC, cov1@4 ASC, mean@8 ASC, cov@9 ASC], preserve_partitioning=[true] @@ -5313,22 +5150,21 @@ mod tests { │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, inv_item_sk@1)], projection=[inv_date_sk@1, inv_warehouse_sk@3, inv_quantity_on_hand@4, i_item_sk@0] │ CoalescePartitionsExec - │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2001 AND d_moy@2 = 1, projection=[d_date_sk@0, d_moy@2] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_moy in (1), d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_moy in (1), d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_moy in (1), d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_moy in (1), d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_moy in (1), d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_moy in (1), d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_moy in (1), d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_moy in (1), d_year in (2001)] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -5338,13 +5174,13 @@ mod tests { │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/warehouse/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/warehouse/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/warehouse/part-3.parquet:..]]}, projection=[w_warehouse_sk, w_warehouse_name], file_type=parquet │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/warehouse/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/warehouse/part-3.parquet:..]]}, projection=[w_warehouse_sk, w_warehouse_name], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 3 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 10 ── Tasks: t0:[p0..p2] t1:[p0..p2] │ RepartitionExec: partitioning=Hash([i_item_sk@1, w_warehouse_sk@0], 3), input_partitions=3 @@ -5366,22 +5202,21 @@ mod tests { │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, inv_item_sk@1)], projection=[inv_date_sk@1, inv_warehouse_sk@3, inv_quantity_on_hand@4, i_item_sk@0] │ CoalescePartitionsExec - │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2001 AND d_moy@2 = 2, projection=[d_date_sk@0, d_moy@2] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -5391,13 +5226,13 @@ mod tests { │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/warehouse/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/warehouse/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/warehouse/part-3.parquet:..]]}, projection=[w_warehouse_sk, w_warehouse_name], file_type=parquet │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/warehouse/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/warehouse/part-3.parquet:..]]}, projection=[w_warehouse_sk, w_warehouse_name], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 8 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk], file_type=parquet └────────────────────────────────────────────────── "); Ok(()) @@ -5413,12 +5248,12 @@ mod tests { ┌───── Stage 7 ── Tasks: t0:[p0..p2] t1:[p0..p2] │ SortExec: TopK(fetch=100), expr=[w_state@0 ASC NULLS LAST, i_item_id@1 ASC NULLS LAST], preserve_partitioning=[true] │ ProjectionExec: expr=[w_state@0 as w_state, i_item_id@1 as i_item_id, sum(CASE WHEN date_dim.d_date < Utf8("2000-03-11") THEN catalog_sales.cs_sales_price - coalesce(catalog_returns.cr_refunded_cash,Int64(0)) ELSE Int64(0) END)@2 as sales_before, sum(CASE WHEN date_dim.d_date >= Utf8("2000-03-11") THEN catalog_sales.cs_sales_price - coalesce(catalog_returns.cr_refunded_cash,Int64(0)) ELSE Int64(0) END)@3 as sales_after] - │ AggregateExec: mode=FinalPartitioned, gby=[w_state@0 as w_state, i_item_id@1 as i_item_id], aggr=[sum(CASE WHEN __common_expr_1 < 2000-03-11 THEN catalog_sales.cs_sales_price - CASE WHEN catalog_returns.cr_refunded_cash IS NOT NULL THEN catalog_returns.cr_refunded_cash ELSE Some(0),22,2 END ELSE Some(0),23,2 END) as sum(CASE WHEN date_dim.d_date < Utf8("2000-03-11") THEN catalog_sales.cs_sales_price - coalesce(catalog_returns.cr_refunded_cash,Int64(0)) ELSE Int64(0) END), sum(CASE WHEN __common_expr_1 >= 2000-03-11 THEN catalog_sales.cs_sales_price - CASE WHEN catalog_returns.cr_refunded_cash IS NOT NULL THEN catalog_returns.cr_refunded_cash ELSE Some(0),22,2 END ELSE Some(0),23,2 END) as sum(CASE WHEN date_dim.d_date >= Utf8("2000-03-11") THEN catalog_sales.cs_sales_price - coalesce(catalog_returns.cr_refunded_cash,Int64(0)) ELSE Int64(0) END)] + │ AggregateExec: mode=FinalPartitioned, gby=[w_state@0 as w_state, i_item_id@1 as i_item_id], aggr=[sum(CASE WHEN __common_expr_1 < 2000-03-11 THEN catalog_sales.cs_sales_price - CASE WHEN catalog_returns.cr_refunded_cash IS NOT NULL THEN catalog_returns.cr_refunded_cash ELSE 0.00 END ELSE 0.00 END) as sum(CASE WHEN date_dim.d_date < Utf8("2000-03-11") THEN catalog_sales.cs_sales_price - coalesce(catalog_returns.cr_refunded_cash,Int64(0)) ELSE Int64(0) END), sum(CASE WHEN __common_expr_1 >= 2000-03-11 THEN catalog_sales.cs_sales_price - CASE WHEN catalog_returns.cr_refunded_cash IS NOT NULL THEN catalog_returns.cr_refunded_cash ELSE 0.00 END ELSE 0.00 END) as sum(CASE WHEN date_dim.d_date >= Utf8("2000-03-11") THEN catalog_sales.cs_sales_price - coalesce(catalog_returns.cr_refunded_cash,Int64(0)) ELSE Int64(0) END)] │ [Stage 6] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([w_state@0, i_item_id@1], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[w_state@3 as w_state, i_item_id@4 as i_item_id], aggr=[sum(CASE WHEN __common_expr_1 < 2000-03-11 THEN catalog_sales.cs_sales_price - CASE WHEN catalog_returns.cr_refunded_cash IS NOT NULL THEN catalog_returns.cr_refunded_cash ELSE Some(0),22,2 END ELSE Some(0),23,2 END) as sum(CASE WHEN date_dim.d_date < Utf8("2000-03-11") THEN catalog_sales.cs_sales_price - coalesce(catalog_returns.cr_refunded_cash,Int64(0)) ELSE Int64(0) END), sum(CASE WHEN __common_expr_1 >= 2000-03-11 THEN catalog_sales.cs_sales_price - CASE WHEN catalog_returns.cr_refunded_cash IS NOT NULL THEN catalog_returns.cr_refunded_cash ELSE Some(0),22,2 END ELSE Some(0),23,2 END) as sum(CASE WHEN date_dim.d_date >= Utf8("2000-03-11") THEN catalog_sales.cs_sales_price - coalesce(catalog_returns.cr_refunded_cash,Int64(0)) ELSE Int64(0) END)] + │ AggregateExec: mode=Partial, gby=[w_state@3 as w_state, i_item_id@4 as i_item_id], aggr=[sum(CASE WHEN __common_expr_1 < 2000-03-11 THEN catalog_sales.cs_sales_price - CASE WHEN catalog_returns.cr_refunded_cash IS NOT NULL THEN catalog_returns.cr_refunded_cash ELSE 0.00 END ELSE 0.00 END) as sum(CASE WHEN date_dim.d_date < Utf8("2000-03-11") THEN catalog_sales.cs_sales_price - coalesce(catalog_returns.cr_refunded_cash,Int64(0)) ELSE Int64(0) END), sum(CASE WHEN __common_expr_1 >= 2000-03-11 THEN catalog_sales.cs_sales_price - CASE WHEN catalog_returns.cr_refunded_cash IS NOT NULL THEN catalog_returns.cr_refunded_cash ELSE 0.00 END ELSE 0.00 END) as sum(CASE WHEN date_dim.d_date >= Utf8("2000-03-11") THEN catalog_sales.cs_sales_price - coalesce(catalog_returns.cr_refunded_cash,Int64(0)) ELSE Int64(0) END)] │ ProjectionExec: expr=[d_date@0 as __common_expr_1, cs_sales_price@1 as cs_sales_price, cr_refunded_cash@2 as cr_refunded_cash, w_state@3 as w_state, i_item_id@4 as i_item_id] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[d_date@1, cs_sales_price@3, cr_refunded_cash@4, w_state@5, i_item_id@6] │ CoalescePartitionsExec @@ -5436,22 +5271,20 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_date@1 >= 2000-02-10 AND d_date@1 <= 2000-04-10 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-02-10 AND d_date@2 <= 2000-04-10, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-02-10 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-10, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-02-10 AND d_date@2 <= 2000-04-10, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-02-10 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-10, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-02-10 AND d_date@2 <= 2000-04-10, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-02-10 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-10, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-02-10 AND d_date@2 <= 2000-04-10, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-02-10 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-10, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-02-10 AND d_date@2 <= 2000-04-10, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-02-10 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-10, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-02-10 AND d_date@2 <= 2000-04-10, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-02-10 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-10, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-02-10 AND d_date@2 <= 2000-04-10, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-02-10 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-10, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-02-10 AND d_date@2 <= 2000-04-10, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-02-10 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-10, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: i_current_price@2 >= Some(99),7,2 AND i_current_price@2 <= Some(149),7,2, projection=[i_item_sk@0, i_item_id@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_current_price], file_type=parquet, predicate=i_current_price@5 >= Some(99),7,2 AND i_current_price@5 <= Some(149),7,2, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= Some(99),7,2 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= Some(149),7,2, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_current_price], file_type=parquet, predicate=i_current_price@5 >= Some(99),7,2 AND i_current_price@5 <= Some(149),7,2, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= Some(99),7,2 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= Some(149),7,2, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_current_price], file_type=parquet, predicate=i_current_price@5 >= Some(99),7,2 AND i_current_price@5 <= Some(149),7,2, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= Some(99),7,2 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= Some(149),7,2, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id, i_current_price], file_type=parquet, predicate=i_current_price@5 >= Some(99),7,2 AND i_current_price@5 <= Some(149),7,2, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= Some(99),7,2 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= Some(149),7,2, required_guarantees=[] + │ FilterExec: i_current_price@2 >= 0.99 AND i_current_price@2 <= 1.49, projection=[i_item_sk@0, i_item_id@1] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_current_price], file_type=parquet, predicate=i_current_price@5 >= 0.99 AND i_current_price@5 <= 1.49, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 0.99 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 1.49, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_current_price], file_type=parquet, predicate=i_current_price@5 >= 0.99 AND i_current_price@5 <= 1.49, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 0.99 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 1.49, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id, i_current_price], file_type=parquet, predicate=i_current_price@5 >= 0.99 AND i_current_price@5 <= 1.49, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 0.99 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 1.49, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id, i_current_price], file_type=parquet, predicate=i_current_price@5 >= 0.99 AND i_current_price@5 <= 1.49, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 0.99 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 1.49, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -5483,7 +5316,7 @@ mod tests { #[tokio::test] async fn test_tpcds_41() -> Result<()> { let display = test_tpcds_query("q41").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [i_product_name@0 ASC NULLS LAST], fetch=100 │ SortExec: TopK(fetch=100), expr=[i_product_name@0 ASC NULLS LAST], preserve_partitioning=[true] @@ -5498,12 +5331,11 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=1 │ FilterExec: i_manufact_id@0 >= 738 AND i_manufact_id@0 <= 778, projection=[i_manufact@1, i_product_name@2] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_manufact_id, i_manufact, i_product_name], file_type=parquet, predicate=i_manufact_id@13 >= 738 AND i_manufact_id@13 <= 778 AND DynamicFilter [ empty ], pruning_predicate=i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_max@0 >= 738 AND i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_min@3 <= 778, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_manufact_id, i_manufact, i_product_name], file_type=parquet, predicate=i_manufact_id@13 >= 738 AND i_manufact_id@13 <= 778 AND DynamicFilter [ empty ], pruning_predicate=i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_max@0 >= 738 AND i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_min@3 <= 778, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_manufact_id, i_manufact, i_product_name], file_type=parquet, predicate=i_manufact_id@13 >= 738 AND i_manufact_id@13 <= 778 AND DynamicFilter [ empty ], pruning_predicate=i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_max@0 >= 738 AND i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_min@3 <= 778, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_manufact_id, i_manufact, i_product_name], file_type=parquet, predicate=i_manufact_id@13 >= 738 AND i_manufact_id@13 <= 778 AND DynamicFilter [ empty ], pruning_predicate=i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_max@0 >= 738 AND i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_min@3 <= 778, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_manufact_id, i_manufact, i_product_name], file_type=parquet, predicate=i_manufact_id@13 >= 738 AND i_manufact_id@13 <= 778 AND DynamicFilter [ empty ], pruning_predicate=i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_max@0 >= 738 AND i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_min@3 <= 778, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_manufact_id, i_manufact, i_product_name], file_type=parquet, predicate=i_manufact_id@13 >= 738 AND i_manufact_id@13 <= 778 AND DynamicFilter [ empty ], pruning_predicate=i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_max@0 >= 738 AND i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_min@3 <= 778, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_manufact_id, i_manufact, i_product_name], file_type=parquet, predicate=i_manufact_id@13 >= 738 AND i_manufact_id@13 <= 778 AND DynamicFilter [ empty ], pruning_predicate=i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_max@0 >= 738 AND i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_min@3 <= 778, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_manufact_id, i_manufact, i_product_name], file_type=parquet, predicate=i_manufact_id@13 >= 738 AND i_manufact_id@13 <= 778 AND DynamicFilter [ empty ], pruning_predicate=i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_max@0 >= 738 AND i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_min@3 <= 778, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -5515,13 +5347,11 @@ mod tests { │ RepartitionExec: partitioning=Hash([i_manufact@0], 3), input_partitions=3 │ AggregateExec: mode=Partial, gby=[i_manufact@0 as i_manufact], aggr=[count(Int64(1))] │ FilterExec: __common_expr_4@0 AND ((i_color@4 = powder OR i_color@4 = khaki) AND (i_units@5 = Ounce OR i_units@5 = Oz) AND (i_size@3 = medium OR i_size@3 = extra large) OR (i_color@4 = brown OR i_color@4 = honeydew) AND (i_units@5 = Bunch OR i_units@5 = Ton) AND (i_size@3 = N/A OR i_size@3 = small)) OR i_category@1 = Men AND (i_color@4 = floral OR i_color@4 = deep) AND (i_units@5 = N/A OR i_units@5 = Dozen) AND i_size@3 = petite OR i_category@1 = Men AND (i_color@4 = light OR i_color@4 = cornflower) AND (i_units@5 = Box OR i_units@5 = Pound) AND (i_size@3 = medium OR i_size@3 = extra large) OR __common_expr_4@0 AND ((i_color@4 = midnight OR i_color@4 = snow) AND (i_units@5 = Pallet OR i_units@5 = Gross) AND (i_size@3 = medium OR i_size@3 = extra large) OR (i_color@4 = cyan OR i_color@4 = papaya) AND (i_units@5 = Cup OR i_units@5 = Dram) AND (i_size@3 = N/A OR i_size@3 = small)) OR i_category@1 = Men AND (i_color@4 = orange OR i_color@4 = frosted) AND (i_units@5 = Each OR i_units@5 = Tbl) AND i_size@3 = petite OR i_category@1 = Men AND (i_color@4 = forest OR i_color@4 = ghost) AND (i_units@5 = Lb OR i_units@5 = Bundle) AND (i_size@3 = medium OR i_size@3 = extra large), projection=[i_manufact@2] - │ ProjectionExec: expr=[i_category@0 = Women as __common_expr_4, i_category@0 as i_category, i_manufact@1 as i_manufact, i_size@2 as i_size, i_color@3 as i_color, i_units@4 as i_units] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_category, i_manufact, i_size, i_color, i_units], file_type=parquet, predicate=i_category@12 = Women AND ((i_color@17 = powder OR i_color@17 = khaki) AND (i_units@18 = Ounce OR i_units@18 = Oz) AND (i_size@15 = medium OR i_size@15 = extra large) OR (i_color@17 = brown OR i_color@17 = honeydew) AND (i_units@18 = Bunch OR i_units@18 = Ton) AND (i_size@15 = N/A OR i_size@15 = small)) OR i_category@12 = Men AND (i_color@17 = floral OR i_color@17 = deep) AND (i_units@18 = N/A OR i_units@18 = Dozen) AND i_size@15 = petite OR i_category@12 = Men AND (i_color@17 = light OR i_color@17 = cornflower) AND (i_units@18 = Box OR i_units@18 = Pound) AND (i_size@15 = medium OR i_size@15 = extra large) OR i_category@12 = Women AND ((i_color@17 = midnight OR i_color@17 = snow) AND (i_units@18 = Pallet OR i_units@18 = Gross) AND (i_size@15 = medium OR i_size@15 = extra large) OR (i_color@17 = cyan OR i_color@17 = papaya) AND (i_units@18 = Cup OR i_units@18 = Dram) AND (i_size@15 = N/A OR i_size@15 = small)) OR i_category@12 = Men AND (i_color@17 = orange OR i_color@17 = frosted) AND (i_units@18 = Each OR i_units@18 = Tbl) AND i_size@15 = petite OR i_category@12 = Men AND (i_color@17 = forest OR i_color@17 = ghost) AND (i_units@18 = Lb OR i_units@18 = Bundle) AND (i_size@15 = medium OR i_size@15 = extra large), pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 AND ((i_color_null_count@6 != row_count@3 AND i_color_min@4 <= powder AND powder <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= khaki AND khaki <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Ounce AND Ounce <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Oz AND Oz <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11) OR (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= brown AND brown <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= honeydew AND honeydew <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Bunch AND Bunch <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Ton AND Ton <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= N/A AND N/A <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= small AND small <= i_size_max@11)) OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= floral AND floral <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= deep AND deep <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= N/A AND N/A <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Dozen AND Dozen <= i_units_max@8) AND i_size_null_count@12 != row_count@3 AND i_size_min@10 <= petite AND petite <= i_size_max@11 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= light AND light <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= cornflower AND cornflower <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Box AND Box <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Pound AND Pound <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11) OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 AND ((i_color_null_count@6 != row_count@3 AND i_color_min@4 <= midnight AND midnight <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= snow AND snow <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Pallet AND Pallet <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Gross AND Gross <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11) OR (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= cyan AND cyan <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= papaya AND papaya <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Cup AND Cup <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Dram AND Dram <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= N/A AND N/A <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= small AND small <= i_size_max@11)) OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= orange AND orange <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= frosted AND frosted <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Each AND Each <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Tbl AND Tbl <= i_units_max@8) AND i_size_null_count@12 != row_count@3 AND i_size_min@10 <= petite AND petite <= i_size_max@11 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= forest AND forest <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= ghost AND ghost <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Lb AND Lb <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Bundle AND Bundle <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11), required_guarantees=[i_category in (Men, Women)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_category, i_manufact, i_size, i_color, i_units], file_type=parquet, predicate=i_category@12 = Women AND ((i_color@17 = powder OR i_color@17 = khaki) AND (i_units@18 = Ounce OR i_units@18 = Oz) AND (i_size@15 = medium OR i_size@15 = extra large) OR (i_color@17 = brown OR i_color@17 = honeydew) AND (i_units@18 = Bunch OR i_units@18 = Ton) AND (i_size@15 = N/A OR i_size@15 = small)) OR i_category@12 = Men AND (i_color@17 = floral OR i_color@17 = deep) AND (i_units@18 = N/A OR i_units@18 = Dozen) AND i_size@15 = petite OR i_category@12 = Men AND (i_color@17 = light OR i_color@17 = cornflower) AND (i_units@18 = Box OR i_units@18 = Pound) AND (i_size@15 = medium OR i_size@15 = extra large) OR i_category@12 = Women AND ((i_color@17 = midnight OR i_color@17 = snow) AND (i_units@18 = Pallet OR i_units@18 = Gross) AND (i_size@15 = medium OR i_size@15 = extra large) OR (i_color@17 = cyan OR i_color@17 = papaya) AND (i_units@18 = Cup OR i_units@18 = Dram) AND (i_size@15 = N/A OR i_size@15 = small)) OR i_category@12 = Men AND (i_color@17 = orange OR i_color@17 = frosted) AND (i_units@18 = Each OR i_units@18 = Tbl) AND i_size@15 = petite OR i_category@12 = Men AND (i_color@17 = forest OR i_color@17 = ghost) AND (i_units@18 = Lb OR i_units@18 = Bundle) AND (i_size@15 = medium OR i_size@15 = extra large), pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 AND ((i_color_null_count@6 != row_count@3 AND i_color_min@4 <= powder AND powder <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= khaki AND khaki <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Ounce AND Ounce <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Oz AND Oz <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11) OR (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= brown AND brown <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= honeydew AND honeydew <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Bunch AND Bunch <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Ton AND Ton <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= N/A AND N/A <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= small AND small <= i_size_max@11)) OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= floral AND floral <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= deep AND deep <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= N/A AND N/A <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Dozen AND Dozen <= i_units_max@8) AND i_size_null_count@12 != row_count@3 AND i_size_min@10 <= petite AND petite <= i_size_max@11 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= light AND light <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= cornflower AND cornflower <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Box AND Box <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Pound AND Pound <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11) OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 AND ((i_color_null_count@6 != row_count@3 AND i_color_min@4 <= midnight AND midnight <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= snow AND snow <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Pallet AND Pallet <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Gross AND Gross <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11) OR (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= cyan AND cyan <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= papaya AND papaya <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Cup AND Cup <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Dram AND Dram <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= N/A AND N/A <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= small AND small <= i_size_max@11)) OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= orange AND orange <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= frosted AND frosted <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Each AND Each <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Tbl AND Tbl <= i_units_max@8) AND i_size_null_count@12 != row_count@3 AND i_size_min@10 <= petite AND petite <= i_size_max@11 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= forest AND forest <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= ghost AND ghost <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Lb AND Lb <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Bundle AND Bundle <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11), required_guarantees=[i_category in (Men, Women)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_category, i_manufact, i_size, i_color, i_units], file_type=parquet, predicate=i_category@12 = Women AND ((i_color@17 = powder OR i_color@17 = khaki) AND (i_units@18 = Ounce OR i_units@18 = Oz) AND (i_size@15 = medium OR i_size@15 = extra large) OR (i_color@17 = brown OR i_color@17 = honeydew) AND (i_units@18 = Bunch OR i_units@18 = Ton) AND (i_size@15 = N/A OR i_size@15 = small)) OR i_category@12 = Men AND (i_color@17 = floral OR i_color@17 = deep) AND (i_units@18 = N/A OR i_units@18 = Dozen) AND i_size@15 = petite OR i_category@12 = Men AND (i_color@17 = light OR i_color@17 = cornflower) AND (i_units@18 = Box OR i_units@18 = Pound) AND (i_size@15 = medium OR i_size@15 = extra large) OR i_category@12 = Women AND ((i_color@17 = midnight OR i_color@17 = snow) AND (i_units@18 = Pallet OR i_units@18 = Gross) AND (i_size@15 = medium OR i_size@15 = extra large) OR (i_color@17 = cyan OR i_color@17 = papaya) AND (i_units@18 = Cup OR i_units@18 = Dram) AND (i_size@15 = N/A OR i_size@15 = small)) OR i_category@12 = Men AND (i_color@17 = orange OR i_color@17 = frosted) AND (i_units@18 = Each OR i_units@18 = Tbl) AND i_size@15 = petite OR i_category@12 = Men AND (i_color@17 = forest OR i_color@17 = ghost) AND (i_units@18 = Lb OR i_units@18 = Bundle) AND (i_size@15 = medium OR i_size@15 = extra large), pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 AND ((i_color_null_count@6 != row_count@3 AND i_color_min@4 <= powder AND powder <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= khaki AND khaki <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Ounce AND Ounce <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Oz AND Oz <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11) OR (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= brown AND brown <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= honeydew AND honeydew <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Bunch AND Bunch <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Ton AND Ton <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= N/A AND N/A <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= small AND small <= i_size_max@11)) OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= floral AND floral <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= deep AND deep <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= N/A AND N/A <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Dozen AND Dozen <= i_units_max@8) AND i_size_null_count@12 != row_count@3 AND i_size_min@10 <= petite AND petite <= i_size_max@11 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= light AND light <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= cornflower AND cornflower <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Box AND Box <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Pound AND Pound <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11) OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 AND ((i_color_null_count@6 != row_count@3 AND i_color_min@4 <= midnight AND midnight <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= snow AND snow <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Pallet AND Pallet <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Gross AND Gross <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11) OR (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= cyan AND cyan <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= papaya AND papaya <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Cup AND Cup <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Dram AND Dram <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= N/A AND N/A <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= small AND small <= i_size_max@11)) OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= orange AND orange <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= frosted AND frosted <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Each AND Each <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Tbl AND Tbl <= i_units_max@8) AND i_size_null_count@12 != row_count@3 AND i_size_min@10 <= petite AND petite <= i_size_max@11 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= forest AND forest <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= ghost AND ghost <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Lb AND Lb <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Bundle AND Bundle <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11), required_guarantees=[i_category in (Men, Women)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_category, i_manufact, i_size, i_color, i_units], file_type=parquet, predicate=i_category@12 = Women AND ((i_color@17 = powder OR i_color@17 = khaki) AND (i_units@18 = Ounce OR i_units@18 = Oz) AND (i_size@15 = medium OR i_size@15 = extra large) OR (i_color@17 = brown OR i_color@17 = honeydew) AND (i_units@18 = Bunch OR i_units@18 = Ton) AND (i_size@15 = N/A OR i_size@15 = small)) OR i_category@12 = Men AND (i_color@17 = floral OR i_color@17 = deep) AND (i_units@18 = N/A OR i_units@18 = Dozen) AND i_size@15 = petite OR i_category@12 = Men AND (i_color@17 = light OR i_color@17 = cornflower) AND (i_units@18 = Box OR i_units@18 = Pound) AND (i_size@15 = medium OR i_size@15 = extra large) OR i_category@12 = Women AND ((i_color@17 = midnight OR i_color@17 = snow) AND (i_units@18 = Pallet OR i_units@18 = Gross) AND (i_size@15 = medium OR i_size@15 = extra large) OR (i_color@17 = cyan OR i_color@17 = papaya) AND (i_units@18 = Cup OR i_units@18 = Dram) AND (i_size@15 = N/A OR i_size@15 = small)) OR i_category@12 = Men AND (i_color@17 = orange OR i_color@17 = frosted) AND (i_units@18 = Each OR i_units@18 = Tbl) AND i_size@15 = petite OR i_category@12 = Men AND (i_color@17 = forest OR i_color@17 = ghost) AND (i_units@18 = Lb OR i_units@18 = Bundle) AND (i_size@15 = medium OR i_size@15 = extra large), pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 AND ((i_color_null_count@6 != row_count@3 AND i_color_min@4 <= powder AND powder <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= khaki AND khaki <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Ounce AND Ounce <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Oz AND Oz <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11) OR (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= brown AND brown <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= honeydew AND honeydew <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Bunch AND Bunch <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Ton AND Ton <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= N/A AND N/A <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= small AND small <= i_size_max@11)) OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= floral AND floral <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= deep AND deep <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= N/A AND N/A <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Dozen AND Dozen <= i_units_max@8) AND i_size_null_count@12 != row_count@3 AND i_size_min@10 <= petite AND petite <= i_size_max@11 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= light AND light <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= cornflower AND cornflower <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Box AND Box <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Pound AND Pound <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11) OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 AND ((i_color_null_count@6 != row_count@3 AND i_color_min@4 <= midnight AND midnight <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= snow AND snow <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Pallet AND Pallet <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Gross AND Gross <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11) OR (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= cyan AND cyan <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= papaya AND papaya <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Cup AND Cup <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Dram AND Dram <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= N/A AND N/A <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= small AND small <= i_size_max@11)) OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= orange AND orange <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= frosted AND frosted <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Each AND Each <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Tbl AND Tbl <= i_units_max@8) AND i_size_null_count@12 != row_count@3 AND i_size_min@10 <= petite AND petite <= i_size_max@11 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= forest AND forest <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= ghost AND ghost <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Lb AND Lb <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Bundle AND Bundle <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11), required_guarantees=[i_category in (Men, Women)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_category@12 = Women as __common_expr_4, i_category, i_manufact, i_size, i_color, i_units], file_type=parquet, predicate=i_category@12 = Women AND ((i_color@17 = powder OR i_color@17 = khaki) AND (i_units@18 = Ounce OR i_units@18 = Oz) AND (i_size@15 = medium OR i_size@15 = extra large) OR (i_color@17 = brown OR i_color@17 = honeydew) AND (i_units@18 = Bunch OR i_units@18 = Ton) AND (i_size@15 = N/A OR i_size@15 = small)) OR i_category@12 = Men AND (i_color@17 = floral OR i_color@17 = deep) AND (i_units@18 = N/A OR i_units@18 = Dozen) AND i_size@15 = petite OR i_category@12 = Men AND (i_color@17 = light OR i_color@17 = cornflower) AND (i_units@18 = Box OR i_units@18 = Pound) AND (i_size@15 = medium OR i_size@15 = extra large) OR i_category@12 = Women AND ((i_color@17 = midnight OR i_color@17 = snow) AND (i_units@18 = Pallet OR i_units@18 = Gross) AND (i_size@15 = medium OR i_size@15 = extra large) OR (i_color@17 = cyan OR i_color@17 = papaya) AND (i_units@18 = Cup OR i_units@18 = Dram) AND (i_size@15 = N/A OR i_size@15 = small)) OR i_category@12 = Men AND (i_color@17 = orange OR i_color@17 = frosted) AND (i_units@18 = Each OR i_units@18 = Tbl) AND i_size@15 = petite OR i_category@12 = Men AND (i_color@17 = forest OR i_color@17 = ghost) AND (i_units@18 = Lb OR i_units@18 = Bundle) AND (i_size@15 = medium OR i_size@15 = extra large), pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 AND ((i_color_null_count@6 != row_count@3 AND i_color_min@4 <= powder AND powder <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= khaki AND khaki <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Ounce AND Ounce <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Oz AND Oz <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11) OR (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= brown AND brown <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= honeydew AND honeydew <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Bunch AND Bunch <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Ton AND Ton <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= N/A AND N/A <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= small AND small <= i_size_max@11)) OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= floral AND floral <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= deep AND deep <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= N/A AND N/A <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Dozen AND Dozen <= i_units_max@8) AND i_size_null_count@12 != row_count@3 AND i_size_min@10 <= petite AND petite <= i_size_max@11 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= light AND light <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= cornflower AND cornflower <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Box AND Box <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Pound AND Pound <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11) OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 AND ((i_color_null_count@6 != row_count@3 AND i_color_min@4 <= midnight AND midnight <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= snow AND snow <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Pallet AND Pallet <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Gross AND Gross <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11) OR (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= cyan AND cyan <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= papaya AND papaya <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Cup AND Cup <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Dram AND Dram <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= N/A AND N/A <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= small AND small <= i_size_max@11)) OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= orange AND orange <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= frosted AND frosted <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Each AND Each <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Tbl AND Tbl <= i_units_max@8) AND i_size_null_count@12 != row_count@3 AND i_size_min@10 <= petite AND petite <= i_size_max@11 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= forest AND forest <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= ghost AND ghost <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Lb AND Lb <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Bundle AND Bundle <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11), required_guarantees=[i_category in (Men, Women)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_category@12 = Women as __common_expr_4, i_category, i_manufact, i_size, i_color, i_units], file_type=parquet, predicate=i_category@12 = Women AND ((i_color@17 = powder OR i_color@17 = khaki) AND (i_units@18 = Ounce OR i_units@18 = Oz) AND (i_size@15 = medium OR i_size@15 = extra large) OR (i_color@17 = brown OR i_color@17 = honeydew) AND (i_units@18 = Bunch OR i_units@18 = Ton) AND (i_size@15 = N/A OR i_size@15 = small)) OR i_category@12 = Men AND (i_color@17 = floral OR i_color@17 = deep) AND (i_units@18 = N/A OR i_units@18 = Dozen) AND i_size@15 = petite OR i_category@12 = Men AND (i_color@17 = light OR i_color@17 = cornflower) AND (i_units@18 = Box OR i_units@18 = Pound) AND (i_size@15 = medium OR i_size@15 = extra large) OR i_category@12 = Women AND ((i_color@17 = midnight OR i_color@17 = snow) AND (i_units@18 = Pallet OR i_units@18 = Gross) AND (i_size@15 = medium OR i_size@15 = extra large) OR (i_color@17 = cyan OR i_color@17 = papaya) AND (i_units@18 = Cup OR i_units@18 = Dram) AND (i_size@15 = N/A OR i_size@15 = small)) OR i_category@12 = Men AND (i_color@17 = orange OR i_color@17 = frosted) AND (i_units@18 = Each OR i_units@18 = Tbl) AND i_size@15 = petite OR i_category@12 = Men AND (i_color@17 = forest OR i_color@17 = ghost) AND (i_units@18 = Lb OR i_units@18 = Bundle) AND (i_size@15 = medium OR i_size@15 = extra large), pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 AND ((i_color_null_count@6 != row_count@3 AND i_color_min@4 <= powder AND powder <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= khaki AND khaki <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Ounce AND Ounce <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Oz AND Oz <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11) OR (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= brown AND brown <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= honeydew AND honeydew <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Bunch AND Bunch <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Ton AND Ton <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= N/A AND N/A <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= small AND small <= i_size_max@11)) OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= floral AND floral <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= deep AND deep <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= N/A AND N/A <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Dozen AND Dozen <= i_units_max@8) AND i_size_null_count@12 != row_count@3 AND i_size_min@10 <= petite AND petite <= i_size_max@11 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= light AND light <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= cornflower AND cornflower <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Box AND Box <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Pound AND Pound <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11) OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 AND ((i_color_null_count@6 != row_count@3 AND i_color_min@4 <= midnight AND midnight <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= snow AND snow <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Pallet AND Pallet <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Gross AND Gross <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11) OR (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= cyan AND cyan <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= papaya AND papaya <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Cup AND Cup <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Dram AND Dram <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= N/A AND N/A <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= small AND small <= i_size_max@11)) OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= orange AND orange <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= frosted AND frosted <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Each AND Each <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Tbl AND Tbl <= i_units_max@8) AND i_size_null_count@12 != row_count@3 AND i_size_min@10 <= petite AND petite <= i_size_max@11 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= forest AND forest <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= ghost AND ghost <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Lb AND Lb <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Bundle AND Bundle <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11), required_guarantees=[i_category in (Men, Women)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_category@12 = Women as __common_expr_4, i_category, i_manufact, i_size, i_color, i_units], file_type=parquet, predicate=i_category@12 = Women AND ((i_color@17 = powder OR i_color@17 = khaki) AND (i_units@18 = Ounce OR i_units@18 = Oz) AND (i_size@15 = medium OR i_size@15 = extra large) OR (i_color@17 = brown OR i_color@17 = honeydew) AND (i_units@18 = Bunch OR i_units@18 = Ton) AND (i_size@15 = N/A OR i_size@15 = small)) OR i_category@12 = Men AND (i_color@17 = floral OR i_color@17 = deep) AND (i_units@18 = N/A OR i_units@18 = Dozen) AND i_size@15 = petite OR i_category@12 = Men AND (i_color@17 = light OR i_color@17 = cornflower) AND (i_units@18 = Box OR i_units@18 = Pound) AND (i_size@15 = medium OR i_size@15 = extra large) OR i_category@12 = Women AND ((i_color@17 = midnight OR i_color@17 = snow) AND (i_units@18 = Pallet OR i_units@18 = Gross) AND (i_size@15 = medium OR i_size@15 = extra large) OR (i_color@17 = cyan OR i_color@17 = papaya) AND (i_units@18 = Cup OR i_units@18 = Dram) AND (i_size@15 = N/A OR i_size@15 = small)) OR i_category@12 = Men AND (i_color@17 = orange OR i_color@17 = frosted) AND (i_units@18 = Each OR i_units@18 = Tbl) AND i_size@15 = petite OR i_category@12 = Men AND (i_color@17 = forest OR i_color@17 = ghost) AND (i_units@18 = Lb OR i_units@18 = Bundle) AND (i_size@15 = medium OR i_size@15 = extra large), pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 AND ((i_color_null_count@6 != row_count@3 AND i_color_min@4 <= powder AND powder <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= khaki AND khaki <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Ounce AND Ounce <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Oz AND Oz <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11) OR (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= brown AND brown <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= honeydew AND honeydew <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Bunch AND Bunch <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Ton AND Ton <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= N/A AND N/A <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= small AND small <= i_size_max@11)) OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= floral AND floral <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= deep AND deep <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= N/A AND N/A <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Dozen AND Dozen <= i_units_max@8) AND i_size_null_count@12 != row_count@3 AND i_size_min@10 <= petite AND petite <= i_size_max@11 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= light AND light <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= cornflower AND cornflower <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Box AND Box <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Pound AND Pound <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11) OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 AND ((i_color_null_count@6 != row_count@3 AND i_color_min@4 <= midnight AND midnight <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= snow AND snow <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Pallet AND Pallet <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Gross AND Gross <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11) OR (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= cyan AND cyan <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= papaya AND papaya <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Cup AND Cup <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Dram AND Dram <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= N/A AND N/A <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= small AND small <= i_size_max@11)) OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= orange AND orange <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= frosted AND frosted <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Each AND Each <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Tbl AND Tbl <= i_units_max@8) AND i_size_null_count@12 != row_count@3 AND i_size_min@10 <= petite AND petite <= i_size_max@11 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= forest AND forest <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= ghost AND ghost <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Lb AND Lb <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Bundle AND Bundle <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11), required_guarantees=[i_category in (Men, Women)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_category@12 = Women as __common_expr_4, i_category, i_manufact, i_size, i_color, i_units], file_type=parquet, predicate=i_category@12 = Women AND ((i_color@17 = powder OR i_color@17 = khaki) AND (i_units@18 = Ounce OR i_units@18 = Oz) AND (i_size@15 = medium OR i_size@15 = extra large) OR (i_color@17 = brown OR i_color@17 = honeydew) AND (i_units@18 = Bunch OR i_units@18 = Ton) AND (i_size@15 = N/A OR i_size@15 = small)) OR i_category@12 = Men AND (i_color@17 = floral OR i_color@17 = deep) AND (i_units@18 = N/A OR i_units@18 = Dozen) AND i_size@15 = petite OR i_category@12 = Men AND (i_color@17 = light OR i_color@17 = cornflower) AND (i_units@18 = Box OR i_units@18 = Pound) AND (i_size@15 = medium OR i_size@15 = extra large) OR i_category@12 = Women AND ((i_color@17 = midnight OR i_color@17 = snow) AND (i_units@18 = Pallet OR i_units@18 = Gross) AND (i_size@15 = medium OR i_size@15 = extra large) OR (i_color@17 = cyan OR i_color@17 = papaya) AND (i_units@18 = Cup OR i_units@18 = Dram) AND (i_size@15 = N/A OR i_size@15 = small)) OR i_category@12 = Men AND (i_color@17 = orange OR i_color@17 = frosted) AND (i_units@18 = Each OR i_units@18 = Tbl) AND i_size@15 = petite OR i_category@12 = Men AND (i_color@17 = forest OR i_color@17 = ghost) AND (i_units@18 = Lb OR i_units@18 = Bundle) AND (i_size@15 = medium OR i_size@15 = extra large), pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 AND ((i_color_null_count@6 != row_count@3 AND i_color_min@4 <= powder AND powder <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= khaki AND khaki <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Ounce AND Ounce <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Oz AND Oz <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11) OR (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= brown AND brown <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= honeydew AND honeydew <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Bunch AND Bunch <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Ton AND Ton <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= N/A AND N/A <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= small AND small <= i_size_max@11)) OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= floral AND floral <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= deep AND deep <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= N/A AND N/A <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Dozen AND Dozen <= i_units_max@8) AND i_size_null_count@12 != row_count@3 AND i_size_min@10 <= petite AND petite <= i_size_max@11 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= light AND light <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= cornflower AND cornflower <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Box AND Box <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Pound AND Pound <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11) OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 AND ((i_color_null_count@6 != row_count@3 AND i_color_min@4 <= midnight AND midnight <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= snow AND snow <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Pallet AND Pallet <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Gross AND Gross <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11) OR (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= cyan AND cyan <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= papaya AND papaya <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Cup AND Cup <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Dram AND Dram <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= N/A AND N/A <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= small AND small <= i_size_max@11)) OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= orange AND orange <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= frosted AND frosted <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Each AND Each <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Tbl AND Tbl <= i_units_max@8) AND i_size_null_count@12 != row_count@3 AND i_size_min@10 <= petite AND petite <= i_size_max@11 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 AND (i_color_null_count@6 != row_count@3 AND i_color_min@4 <= forest AND forest <= i_color_max@5 OR i_color_null_count@6 != row_count@3 AND i_color_min@4 <= ghost AND ghost <= i_color_max@5) AND (i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Lb AND Lb <= i_units_max@8 OR i_units_null_count@9 != row_count@3 AND i_units_min@7 <= Bundle AND Bundle <= i_units_max@8) AND (i_size_null_count@12 != row_count@3 AND i_size_min@10 <= medium AND medium <= i_size_max@11 OR i_size_null_count@12 != row_count@3 AND i_size_min@10 <= extra large AND extra large <= i_size_max@11), required_guarantees=[i_category in (Men, Women)] └────────────────────────────────────────────────── "); Ok(()) @@ -5529,7 +5359,7 @@ mod tests { #[tokio::test] async fn test_tpcds_42() -> Result<()> { let display = test_tpcds_query("q42").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [sum(store_sales.ss_ext_sales_price)@3 DESC, d_year@0 ASC NULLS LAST, i_category_id@1 ASC NULLS LAST, i_category@2 ASC NULLS LAST], fetch=100 │ [Stage 4] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -5557,22 +5387,20 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_manager_id@3 = 1, projection=[i_item_sk@0, i_category_id@1, i_category@2] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category_id, i_category, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 1, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 1 AND 1 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (1)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category_id, i_category, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 1, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 1 AND 1 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (1)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category_id, i_category, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 1, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 1 AND 1 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (1)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_category_id, i_category, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 1, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 1 AND 1 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (1)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category_id, i_category, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 1, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 1 AND 1 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (1)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category_id, i_category, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 1, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 1 AND 1 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (1)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_category_id, i_category, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 1, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 1 AND 1 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (1)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_category_id, i_category, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 1, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 1 AND 1 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (1)] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_moy@2 = 11 AND d_year@1 = 2000, projection=[d_date_sk@0, d_year@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 2000, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 2000, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 2000, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 2000, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (2000)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 2000, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 2000, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 2000, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 2000, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (2000)] └────────────────────────────────────────────────── "); Ok(()) @@ -5588,12 +5416,12 @@ mod tests { ┌───── Stage 4 ── Tasks: t0:[p0..p2] t1:[p0..p2] │ SortExec: TopK(fetch=100), expr=[s_store_name@0 ASC NULLS LAST, s_store_id@1 ASC NULLS LAST], preserve_partitioning=[true] │ ProjectionExec: expr=[s_store_name@0 as s_store_name, s_store_id@1 as s_store_id, sum(CASE WHEN date_dim.d_day_name = Utf8("Sunday") THEN store_sales.ss_sales_price ELSE NULL END)@2 as sun_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Monday") THEN store_sales.ss_sales_price ELSE NULL END)@3 as mon_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Tuesday") THEN store_sales.ss_sales_price ELSE NULL END)@4 as tue_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Wednesday") THEN store_sales.ss_sales_price ELSE NULL END)@5 as wed_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Thursday") THEN store_sales.ss_sales_price ELSE NULL END)@6 as thu_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Friday") THEN store_sales.ss_sales_price ELSE NULL END)@7 as fri_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Saturday") THEN store_sales.ss_sales_price ELSE NULL END)@8 as sat_sales] - │ AggregateExec: mode=FinalPartitioned, gby=[s_store_name@0 as s_store_name, s_store_id@1 as s_store_id], aggr=[sum(CASE WHEN date_dim.d_day_name = Sunday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Sunday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Monday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Monday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Tuesday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Tuesday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Wednesday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Wednesday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Thursday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Thursday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Friday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Friday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Saturday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Saturday") THEN store_sales.ss_sales_price ELSE NULL END)] + │ AggregateExec: mode=FinalPartitioned, gby=[s_store_name@0 as s_store_name, s_store_id@1 as s_store_id], aggr=[sum(CASE WHEN date_dim.d_day_name = Sunday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Sunday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Monday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Monday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Tuesday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Tuesday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Wednesday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Wednesday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Thursday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Thursday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Friday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Friday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Saturday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Saturday") THEN store_sales.ss_sales_price ELSE NULL END)] │ [Stage 3] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([s_store_name@0, s_store_id@1], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[s_store_name@3 as s_store_name, s_store_id@2 as s_store_id], aggr=[sum(CASE WHEN date_dim.d_day_name = Sunday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Sunday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Monday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Monday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Tuesday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Tuesday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Wednesday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Wednesday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Thursday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Thursday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Friday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Friday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Saturday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Saturday") THEN store_sales.ss_sales_price ELSE NULL END)] + │ AggregateExec: mode=Partial, gby=[s_store_name@3 as s_store_name, s_store_id@2 as s_store_id], aggr=[sum(CASE WHEN date_dim.d_day_name = Sunday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Sunday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Monday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Monday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Tuesday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Tuesday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Wednesday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Wednesday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Thursday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Thursday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Friday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Friday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Saturday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Saturday") THEN store_sales.ss_sales_price ELSE NULL END)] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(s_store_sk@0, ss_store_sk@1)], projection=[d_day_name@3, ss_sales_price@5, s_store_id@1, s_store_name@2] │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -5608,23 +5436,22 @@ mod tests { └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: s_gmt_offset@3 = Some(-500),5,2, projection=[s_store_sk@0, s_store_id@1, s_store_name@2] + │ FilterExec: s_gmt_offset@3 = -5.00, projection=[s_store_sk@0, s_store_id@1, s_store_name@2] │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:..]]}, projection=[s_store_sk, s_store_id, s_store_name, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = Some(-500),5,2 AND DynamicFilter [ empty ], pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (Some(-500),5,2)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:..]]}, projection=[s_store_sk, s_store_id, s_store_name, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = Some(-500),5,2 AND DynamicFilter [ empty ], pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (Some(-500),5,2)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_store_id, s_store_name, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = Some(-500),5,2 AND DynamicFilter [ empty ], pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (Some(-500),5,2)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_store_id, s_store_name, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = Some(-500),5,2 AND DynamicFilter [ empty ], pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (Some(-500),5,2)] + │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:..]]}, projection=[s_store_sk, s_store_id, s_store_name, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = -5.00 AND DynamicFilter [ empty ], pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= -5.00 AND -5.00 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (-5.00)] + │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:..]]}, projection=[s_store_sk, s_store_id, s_store_name, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = -5.00 AND DynamicFilter [ empty ], pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= -5.00 AND -5.00 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (-5.00)] + │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_store_id, s_store_name, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = -5.00 AND DynamicFilter [ empty ], pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= -5.00 AND -5.00 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (-5.00)] + │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_store_id, s_store_name, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = -5.00 AND DynamicFilter [ empty ], pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= -5.00 AND -5.00 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (-5.00)] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2000, projection=[d_date_sk@0, d_day_name@2] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_day_name], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_day_name], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_day_name], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_day_name], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_day_name], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_day_name], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_day_name], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_day_name], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] └────────────────────────────────────────────────── "#); Ok(()) @@ -5642,29 +5469,29 @@ mod tests { │ ProjectionExec: expr=[rnk@0 as rnk, i_product_name@1 as best_performing, i_product_name@2 as worst_performing] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, item_sk@1)], projection=[rnk@2, i_product_name@4, i_product_name@1] │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, item_sk@0)], projection=[rnk@3, item_sk@4, i_product_name@1] │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(rnk@1, rnk@1)], projection=[item_sk@0, rnk@1, item_sk@2] │ [Stage 5] => NetworkShuffleExec: output_partitions=3, input_tasks=1 │ [Stage 8] => NetworkShuffleExec: output_partitions=3, input_tasks=1 └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_product_name], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_product_name], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_product_name], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_product_name], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_product_name], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_product_name], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_product_name], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_product_name], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_product_name], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_product_name], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_product_name], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_product_name], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_product_name], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_product_name], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_product_name], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_product_name], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] │ RepartitionExec: partitioning=Hash([rnk@1], 12), input_partitions=3 @@ -5675,14 +5502,16 @@ mod tests { │ BoundedWindowAggExec: wdw=[rank() ORDER BY [v1.rank_col ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW: Field { "rank() ORDER BY [v1.rank_col ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW": UInt64 }, frame: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW], mode=[Sorted] │ SortPreservingMergeExec: [rank_col@1 ASC NULLS LAST] │ SortExec: expr=[rank_col@1 ASC NULLS LAST], preserve_partitioning=[true] - │ ProjectionExec: expr=[ss_item_sk@0 as item_sk, avg(ss1.ss_net_profit)@1 as rank_col] - │ FilterExec: CAST(avg(ss1.ss_net_profit)@1 AS Decimal128(30, 15)) > CAST(0.9 * rank_col@2 AS Decimal128(30, 15)), projection=[ss_item_sk@0, avg(ss1.ss_net_profit)@1] - │ NestedLoopJoinExec: join_type=Right, projection=[ss_item_sk@1, avg(ss1.ss_net_profit)@2, rank_col@0] - │ CoalescePartitionsExec - │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 - │ ProjectionExec: expr=[CAST(avg(store_sales.ss_net_profit)@1 AS Float64) as rank_col] - │ AggregateExec: mode=FinalPartitioned, gby=[ss_store_sk@0 as ss_store_sk], aggr=[avg(store_sales.ss_net_profit)], ordering_mode=Sorted - │ [Stage 3] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ ProjectionExec: expr=[ss_item_sk@1 as item_sk, avg(ss1.ss_net_profit)@2 as rank_col] + │ NestedLoopJoinExec: join_type=Inner, filter=join_proj_push_down_2@1 > join_proj_push_down_1@0, projection=[rank_col@0, ss_item_sk@2, avg(ss1.ss_net_profit)@3] + │ CoalescePartitionsExec + │ BroadcastExec: input_partitions=1, consumer_tasks=1, output_partitions=1 + │ ProjectionExec: expr=[rank_col@0 as rank_col, CAST(0.9 * rank_col@0 AS Decimal128(30, 15)) as join_proj_push_down_1] + │ CoalescePartitionsExec + │ ProjectionExec: expr=[CAST(avg(store_sales.ss_net_profit)@1 AS Float64) as rank_col] + │ AggregateExec: mode=FinalPartitioned, gby=[ss_store_sk@0 as ss_store_sk], aggr=[avg(store_sales.ss_net_profit)], ordering_mode=Sorted + │ [Stage 3] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ ProjectionExec: expr=[ss_item_sk@0 as ss_item_sk, avg(ss1.ss_net_profit)@1 as avg(ss1.ss_net_profit), CAST(avg(ss1.ss_net_profit)@1 AS Decimal128(30, 15)) as join_proj_push_down_2] │ AggregateExec: mode=FinalPartitioned, gby=[ss_item_sk@0 as ss_item_sk], aggr=[avg(ss1.ss_net_profit)] │ [Stage 4] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── @@ -5715,14 +5544,16 @@ mod tests { │ BoundedWindowAggExec: wdw=[rank() ORDER BY [v2.rank_col DESC NULLS FIRST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW: Field { "rank() ORDER BY [v2.rank_col DESC NULLS FIRST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW": UInt64 }, frame: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW], mode=[Sorted] │ SortPreservingMergeExec: [rank_col@1 DESC] │ SortExec: expr=[rank_col@1 DESC], preserve_partitioning=[true] - │ ProjectionExec: expr=[ss_item_sk@0 as item_sk, avg(ss1.ss_net_profit)@1 as rank_col] - │ FilterExec: CAST(avg(ss1.ss_net_profit)@1 AS Decimal128(30, 15)) > CAST(0.9 * rank_col@2 AS Decimal128(30, 15)), projection=[ss_item_sk@0, avg(ss1.ss_net_profit)@1] - │ NestedLoopJoinExec: join_type=Right, projection=[ss_item_sk@1, avg(ss1.ss_net_profit)@2, rank_col@0] - │ CoalescePartitionsExec - │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 - │ ProjectionExec: expr=[CAST(avg(store_sales.ss_net_profit)@1 AS Float64) as rank_col] - │ AggregateExec: mode=FinalPartitioned, gby=[ss_store_sk@0 as ss_store_sk], aggr=[avg(store_sales.ss_net_profit)], ordering_mode=Sorted - │ [Stage 6] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ ProjectionExec: expr=[ss_item_sk@1 as item_sk, avg(ss1.ss_net_profit)@2 as rank_col] + │ NestedLoopJoinExec: join_type=Inner, filter=join_proj_push_down_4@1 > join_proj_push_down_3@0, projection=[rank_col@0, ss_item_sk@2, avg(ss1.ss_net_profit)@3] + │ CoalescePartitionsExec + │ BroadcastExec: input_partitions=1, consumer_tasks=1, output_partitions=1 + │ ProjectionExec: expr=[rank_col@0 as rank_col, CAST(0.9 * rank_col@0 AS Decimal128(30, 15)) as join_proj_push_down_3] + │ CoalescePartitionsExec + │ ProjectionExec: expr=[CAST(avg(store_sales.ss_net_profit)@1 AS Float64) as rank_col] + │ AggregateExec: mode=FinalPartitioned, gby=[ss_store_sk@0 as ss_store_sk], aggr=[avg(store_sales.ss_net_profit)], ordering_mode=Sorted + │ [Stage 6] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ ProjectionExec: expr=[ss_item_sk@0 as ss_item_sk, avg(ss1.ss_net_profit)@1 as avg(ss1.ss_net_profit), CAST(avg(ss1.ss_net_profit)@1 AS Decimal128(30, 15)) as join_proj_push_down_4] │ AggregateExec: mode=FinalPartitioned, gby=[ss_item_sk@0 as ss_item_sk], aggr=[avg(ss1.ss_net_profit)] │ [Stage 7] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── @@ -5752,7 +5583,7 @@ mod tests { #[tokio::test] async fn test_tpcds_45() -> Result<()> { let display = test_tpcds_query("q45").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [ca_zip@0 ASC NULLS LAST, ca_city@1 ASC NULLS LAST], fetch=100 │ SortExec: TopK(fetch=100), expr=[ca_zip@0 ASC NULLS LAST, ca_city@1 ASC NULLS LAST], preserve_partitioning=[true] @@ -5768,16 +5599,16 @@ mod tests { │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ws_item_sk@0)], projection=[ws_sales_price@3, ca_city@4, ca_zip@5, i_item_id@1] │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[ws_item_sk@2, ws_sales_price@3, ca_city@4, ca_zip@5] │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, c_current_addr_sk@3)], projection=[ws_sold_date_sk@3, ws_item_sk@4, ws_sales_price@5, ca_city@1, ca_zip@2] │ CoalescePartitionsExec - │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ws_bill_customer_sk@2)], projection=[ws_sold_date_sk@2, ws_item_sk@3, ws_sales_price@5, c_current_addr_sk@1] │ CoalescePartitionsExec - │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] @@ -5787,46 +5618,44 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_item_sk@0 IN (SET) ([2, 3, 5, 7, 11, 13, 17, 19, 23, 29]), projection=[i_item_id@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=i_item_sk@0 IN (SET) ([2, 3, 5, 7, 11, 13, 17, 19, 23, 29]), pruning_predicate=i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 2 AND 2 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 3 AND 3 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 5 AND 5 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 7 AND 7 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 11 AND 11 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 13 AND 13 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 17 AND 17 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 19 AND 19 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 23 AND 23 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 29 AND 29 <= i_item_sk_max@1, required_guarantees=[i_item_sk in (11, 13, 17, 19, 2, 23, 29, 3, 5, 7)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=i_item_sk@0 IN (SET) ([2, 3, 5, 7, 11, 13, 17, 19, 23, 29]), pruning_predicate=i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 2 AND 2 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 3 AND 3 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 5 AND 5 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 7 AND 7 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 11 AND 11 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 13 AND 13 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 17 AND 17 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 19 AND 19 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 23 AND 23 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 29 AND 29 <= i_item_sk_max@1, required_guarantees=[i_item_sk in (11, 13, 17, 19, 2, 23, 29, 3, 5, 7)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=i_item_sk@0 IN (SET) ([2, 3, 5, 7, 11, 13, 17, 19, 23, 29]), pruning_predicate=i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 2 AND 2 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 3 AND 3 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 5 AND 5 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 7 AND 7 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 11 AND 11 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 13 AND 13 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 17 AND 17 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 19 AND 19 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 23 AND 23 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 29 AND 29 <= i_item_sk_max@1, required_guarantees=[i_item_sk in (11, 13, 17, 19, 2, 23, 29, 3, 5, 7)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=i_item_sk@0 IN (SET) ([2, 3, 5, 7, 11, 13, 17, 19, 23, 29]), pruning_predicate=i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 2 AND 2 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 3 AND 3 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 5 AND 5 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 7 AND 7 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 11 AND 11 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 13 AND 13 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 17 AND 17 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 19 AND 19 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 23 AND 23 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 29 AND 29 <= i_item_sk_max@1, required_guarantees=[i_item_sk in (11, 13, 17, 19, 2, 23, 29, 3, 5, 7)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=i_item_sk@0 IN (SET) ([2, 3, 5, 7, 11, 13, 17, 19, 23, 29]), pruning_predicate=i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 2 AND 2 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 3 AND 3 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 5 AND 5 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 7 AND 7 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 11 AND 11 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 13 AND 13 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 17 AND 17 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 19 AND 19 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 23 AND 23 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 29 AND 29 <= i_item_sk_max@1, required_guarantees=[i_item_sk in (11, 13, 17, 19, 2, 23, 29, 3, 5, 7)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=i_item_sk@0 IN (SET) ([2, 3, 5, 7, 11, 13, 17, 19, 23, 29]), pruning_predicate=i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 2 AND 2 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 3 AND 3 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 5 AND 5 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 7 AND 7 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 11 AND 11 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 13 AND 13 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 17 AND 17 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 19 AND 19 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 23 AND 23 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 29 AND 29 <= i_item_sk_max@1, required_guarantees=[i_item_sk in (11, 13, 17, 19, 2, 23, 29, 3, 5, 7)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=i_item_sk@0 IN (SET) ([2, 3, 5, 7, 11, 13, 17, 19, 23, 29]), pruning_predicate=i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 2 AND 2 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 3 AND 3 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 5 AND 5 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 7 AND 7 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 11 AND 11 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 13 AND 13 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 17 AND 17 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 19 AND 19 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 23 AND 23 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 29 AND 29 <= i_item_sk_max@1, required_guarantees=[i_item_sk in (11, 13, 17, 19, 2, 23, 29, 3, 5, 7)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=i_item_sk@0 IN (SET) ([2, 3, 5, 7, 11, 13, 17, 19, 23, 29]), pruning_predicate=i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 2 AND 2 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 3 AND 3 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 5 AND 5 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 7 AND 7 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 11 AND 11 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 13 AND 13 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 17 AND 17 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 19 AND 19 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 23 AND 23 <= i_item_sk_max@1 OR i_item_sk_null_count@2 != row_count@3 AND i_item_sk_min@0 <= 29 AND 29 <= i_item_sk_max@1, required_guarantees=[i_item_sk in (11, 13, 17, 19, 2, 23, 29, 3, 5, 7)] └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_qoy@2 = 2 AND d_year@1 = 2001, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2001, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2001, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2001, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2001, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2001, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2001, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2001, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet, predicate=d_qoy@10 = 2 AND d_year@6 = 2001, pruning_predicate=d_qoy_null_count@2 != row_count@3 AND d_qoy_min@0 <= 2 AND 2 <= d_qoy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5, required_guarantees=[d_qoy in (2), d_year in (2001)] └────────────────────────────────────────────────── - ┌───── Stage 4 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_city, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_city, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_city, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 5 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── "); Ok(()) @@ -5834,7 +5663,7 @@ mod tests { #[tokio::test] async fn test_tpcds_46() -> Result<()> { let display = test_tpcds_query("q46").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [c_last_name@0 ASC, c_first_name@1 ASC, ca_city@2 ASC, bought_city@3 ASC, ss_ticket_number@4 ASC], fetch=100 │ [Stage 8] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 @@ -5843,36 +5672,36 @@ mod tests { │ SortExec: TopK(fetch=100), expr=[c_last_name@0 ASC, c_first_name@1 ASC, ca_city@2 ASC, bought_city@3 ASC, ss_ticket_number@4 ASC], preserve_partitioning=[true] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, c_current_addr_sk@4)], filter=bought_city@0 != ca_city@1, projection=[c_last_name@8, c_first_name@7, ca_city@1, bought_city@3, ss_ticket_number@2, amt@4, profit@5] │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ss_customer_sk@1)], projection=[ss_ticket_number@4, bought_city@6, amt@7, profit@8, c_current_addr_sk@1, c_first_name@2, c_last_name@3] │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ ProjectionExec: expr=[ss_ticket_number@0 as ss_ticket_number, ss_customer_sk@1 as ss_customer_sk, ca_city@3 as bought_city, sum(store_sales.ss_coupon_amt)@4 as amt, sum(store_sales.ss_net_profit)@5 as profit] │ AggregateExec: mode=FinalPartitioned, gby=[ss_ticket_number@0 as ss_ticket_number, ss_customer_sk@1 as ss_customer_sk, ss_addr_sk@2 as ss_addr_sk, ca_city@3 as ca_city], aggr=[sum(store_sales.ss_coupon_amt), sum(store_sales.ss_net_profit)] │ [Stage 7] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_ticket_number@0, ss_customer_sk@1, ss_addr_sk@2, ca_city@3], 12), input_partitions=3 │ AggregateExec: mode=Partial, gby=[ss_ticket_number@2 as ss_ticket_number, ss_customer_sk@0 as ss_customer_sk, ss_addr_sk@1 as ss_addr_sk, ca_city@5 as ca_city], aggr=[sum(store_sales.ss_coupon_amt), sum(store_sales.ss_net_profit)] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, ss_addr_sk@1)], projection=[ss_customer_sk@2, ss_addr_sk@3, ss_ticket_number@4, ss_coupon_amt@5, ss_net_profit@6, ca_city@1] │ CoalescePartitionsExec - │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(hd_demo_sk@0, ss_hdemo_sk@1)], projection=[ss_customer_sk@1, ss_addr_sk@3, ss_ticket_number@4, ss_coupon_amt@5, ss_net_profit@6] │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -5888,13 +5717,13 @@ mod tests { │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_ticket_number, ss_coupon_amt, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_ticket_number, ss_coupon_amt, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 3 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -5919,12 +5748,11 @@ mod tests { ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: (d_dow@2 = 6 OR d_dow@2 = 0) AND (d_year@1 = 1999 OR d_year@1 = 2000 OR d_year@1 = 2001), projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_dow], file_type=parquet, predicate=(d_dow@7 = 6 OR d_dow@7 = 0) AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=(d_dow_null_count@2 != row_count@3 AND d_dow_min@0 <= 6 AND 6 <= d_dow_max@1 OR d_dow_null_count@2 != row_count@3 AND d_dow_min@0 <= 0 AND 0 <= d_dow_max@1) AND (d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_dow in (0, 6), d_year in (1999, 2000, 2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_dow], file_type=parquet, predicate=(d_dow@7 = 6 OR d_dow@7 = 0) AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=(d_dow_null_count@2 != row_count@3 AND d_dow_min@0 <= 6 AND 6 <= d_dow_max@1 OR d_dow_null_count@2 != row_count@3 AND d_dow_min@0 <= 0 AND 0 <= d_dow_max@1) AND (d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_dow in (0, 6), d_year in (1999, 2000, 2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_dow], file_type=parquet, predicate=(d_dow@7 = 6 OR d_dow@7 = 0) AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=(d_dow_null_count@2 != row_count@3 AND d_dow_min@0 <= 6 AND 6 <= d_dow_max@1 OR d_dow_null_count@2 != row_count@3 AND d_dow_min@0 <= 0 AND 0 <= d_dow_max@1) AND (d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_dow in (0, 6), d_year in (1999, 2000, 2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_dow], file_type=parquet, predicate=(d_dow@7 = 6 OR d_dow@7 = 0) AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=(d_dow_null_count@2 != row_count@3 AND d_dow_min@0 <= 6 AND 6 <= d_dow_max@1 OR d_dow_null_count@2 != row_count@3 AND d_dow_min@0 <= 0 AND 0 <= d_dow_max@1) AND (d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_dow in (0, 6), d_year in (1999, 2000, 2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_dow], file_type=parquet, predicate=(d_dow@7 = 6 OR d_dow@7 = 0) AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=(d_dow_null_count@2 != row_count@3 AND d_dow_min@0 <= 6 AND 6 <= d_dow_max@1 OR d_dow_null_count@2 != row_count@3 AND d_dow_min@0 <= 0 AND 0 <= d_dow_max@1) AND (d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_dow in (0, 6), d_year in (1999, 2000, 2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_dow], file_type=parquet, predicate=(d_dow@7 = 6 OR d_dow@7 = 0) AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=(d_dow_null_count@2 != row_count@3 AND d_dow_min@0 <= 6 AND 6 <= d_dow_max@1 OR d_dow_null_count@2 != row_count@3 AND d_dow_min@0 <= 0 AND 0 <= d_dow_max@1) AND (d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_dow in (0, 6), d_year in (1999, 2000, 2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_dow], file_type=parquet, predicate=(d_dow@7 = 6 OR d_dow@7 = 0) AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=(d_dow_null_count@2 != row_count@3 AND d_dow_min@0 <= 6 AND 6 <= d_dow_max@1 OR d_dow_null_count@2 != row_count@3 AND d_dow_min@0 <= 0 AND 0 <= d_dow_max@1) AND (d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_dow in (0, 6), d_year in (1999, 2000, 2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_dow], file_type=parquet, predicate=(d_dow@7 = 6 OR d_dow@7 = 0) AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=(d_dow_null_count@2 != row_count@3 AND d_dow_min@0 <= 6 AND 6 <= d_dow_max@1 OR d_dow_null_count@2 != row_count@3 AND d_dow_min@0 <= 0 AND 0 <= d_dow_max@1) AND (d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_dow in (0, 6), d_year in (1999, 2000, 2001)] └────────────────────────────────────────────────── "); Ok(()) @@ -5937,26 +5765,27 @@ mod tests { │ SortPreservingMergeExec: [sum_sales@7 - avg_monthly_sales@6 ASC NULLS LAST, i_category@0 ASC NULLS LAST, i_brand@1 ASC NULLS LAST, s_store_name@2 ASC NULLS LAST, s_company_name@3 ASC NULLS LAST, d_year@4 ASC NULLS LAST, d_moy@5 ASC NULLS LAST, psum@8 ASC NULLS LAST, nsum@9 ASC NULLS LAST], fetch=100 │ SortExec: TopK(fetch=100), expr=[sum_sales@7 - avg_monthly_sales@6 ASC NULLS LAST, i_category@0 ASC NULLS LAST, i_brand@1 ASC NULLS LAST, s_store_name@2 ASC NULLS LAST, s_company_name@3 ASC NULLS LAST, d_moy@5 ASC NULLS LAST, psum@8 ASC NULLS LAST, nsum@9 ASC NULLS LAST], preserve_partitioning=[true] │ ProjectionExec: expr=[i_category@0 as i_category, i_brand@1 as i_brand, s_store_name@2 as s_store_name, s_company_name@3 as s_company_name, d_year@4 as d_year, d_moy@5 as d_moy, avg_monthly_sales@6 as avg_monthly_sales, sum_sales@7 as sum_sales, sum_sales@8 as psum, sum_sales@9 as nsum] - │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(i_category@0, i_category@0), (i_brand@1, i_brand@1), (s_store_name@2, s_store_name@2), (s_company_name@3, s_company_name@3), (CAST(v1.rn AS Decimal128(21, 0))@10, v1_lead.rn - Decimal128(Some(1),20,0)@6)], projection=[i_category@0, i_brand@1, s_store_name@2, s_company_name@3, d_year@4, d_moy@5, avg_monthly_sales@7, sum_sales@6, sum_sales@9, sum_sales@15] + │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(i_category@0, i_category@0), (i_brand@1, i_brand@1), (s_store_name@2, s_store_name@2), (s_company_name@3, s_company_name@3), (CAST(v1.rn AS Decimal128(21, 0))@10, v1_lead.rn - Decimal128(1,20,0)@6)], projection=[i_category@0, i_brand@1, s_store_name@2, s_company_name@3, d_year@4, d_moy@5, avg_monthly_sales@7, sum_sales@6, sum_sales@9, sum_sales@15] │ RepartitionExec: partitioning=Hash([i_category@0, i_brand@1, s_store_name@2, s_company_name@3, CAST(v1.rn AS Decimal128(21, 0))@10], 3), input_partitions=3 │ ProjectionExec: expr=[i_category@0 as i_category, i_brand@1 as i_brand, s_store_name@2 as s_store_name, s_company_name@3 as s_company_name, d_year@4 as d_year, d_moy@5 as d_moy, sum_sales@6 as sum_sales, avg_monthly_sales@7 as avg_monthly_sales, rn@8 as rn, sum_sales@9 as sum_sales, CAST(rn@8 AS Decimal128(21, 0)) as CAST(v1.rn AS Decimal128(21, 0))] - │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(i_category@0, i_category@0), (i_brand@1, i_brand@1), (s_store_name@2, s_store_name@2), (s_company_name@3, s_company_name@3), (CAST(v1.rn AS Decimal128(21, 0))@9, v1_lag.rn + Decimal128(Some(1),20,0)@6)], projection=[i_category@0, i_brand@1, s_store_name@2, s_company_name@3, d_year@4, d_moy@5, sum_sales@6, avg_monthly_sales@7, rn@8, sum_sales@14] + │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(i_category@0, i_category@0), (i_brand@1, i_brand@1), (s_store_name@2, s_store_name@2), (s_company_name@3, s_company_name@3), (CAST(v1.rn AS Decimal128(21, 0))@9, v1_lag.rn + Decimal128(1,20,0)@6)], projection=[i_category@0, i_brand@1, s_store_name@2, s_company_name@3, d_year@4, d_moy@5, sum_sales@6, avg_monthly_sales@7, rn@8, sum_sales@14] │ RepartitionExec: partitioning=Hash([i_category@0, i_brand@1, s_store_name@2, s_company_name@3, CAST(v1.rn AS Decimal128(21, 0))@9], 3), input_partitions=3 │ ProjectionExec: expr=[i_category@0 as i_category, i_brand@1 as i_brand, s_store_name@2 as s_store_name, s_company_name@3 as s_company_name, d_year@4 as d_year, d_moy@5 as d_moy, sum(store_sales.ss_sales_price)@6 as sum_sales, avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@7 as avg_monthly_sales, rank() PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@8 as rn, CAST(rank() PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@8 AS Decimal128(21, 0)) as CAST(v1.rn AS Decimal128(21, 0))] - │ FilterExec: d_year@4 = 1999 AND avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@7 > Some(0),21,6 AND CASE WHEN avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@7 > Some(0),21,6 THEN abs(sum(store_sales.ss_sales_price)@6 - avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@7) / avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@7 END > Some(1000000000),32,10 - │ BoundedWindowAggExec: wdw=[rank() PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW: Field { "rank() PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW": UInt64 }, frame: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW], mode=[Sorted] - │ SortExec: expr=[i_category@0 ASC NULLS LAST, i_brand@1 ASC NULLS LAST, s_store_name@2 ASC NULLS LAST, s_company_name@3 ASC NULLS LAST, d_year@4 ASC NULLS LAST, d_moy@5 ASC NULLS LAST], preserve_partitioning=[true] - │ RepartitionExec: partitioning=Hash([i_category@0, i_brand@1, s_store_name@2, s_company_name@3], 3), input_partitions=3 - │ BoundedWindowAggExec: wdw=[avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW: Field { "avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW": nullable Decimal128(21, 6) }, frame: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW], mode=[Sorted] - │ SortExec: expr=[i_category@0 ASC NULLS LAST, i_brand@1 ASC NULLS LAST, s_store_name@2 ASC NULLS LAST, s_company_name@3 ASC NULLS LAST, d_year@4 ASC NULLS LAST, d_moy@5 ASC NULLS LAST], preserve_partitioning=[true] - │ [Stage 5] => NetworkShuffleExec: output_partitions=3, input_tasks=2 - │ RepartitionExec: partitioning=Hash([i_category@0, i_brand@1, s_store_name@2, s_company_name@3, v1_lag.rn + Decimal128(Some(1),20,0)@6], 3), input_partitions=3 - │ ProjectionExec: expr=[i_category@0 as i_category, i_brand@1 as i_brand, s_store_name@2 as s_store_name, s_company_name@3 as s_company_name, sum(store_sales.ss_sales_price)@6 as sum_sales, rank() PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@7 as rn, CAST(rank() PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@7 AS Decimal128(20, 0)) + Some(1),20,0 as v1_lag.rn + Decimal128(Some(1),20,0)] + │ FilterExec: __common_expr_3@0 AND d_year@5 = 1999 AND CASE WHEN __common_expr_3@0 THEN abs(sum(store_sales.ss_sales_price)@7 - avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@8) / avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@8 END > 0.1000000000, projection=[i_category@1, i_brand@2, s_store_name@3, s_company_name@4, d_year@5, d_moy@6, sum(store_sales.ss_sales_price)@7, avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@8, rank() PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@9] + │ ProjectionExec: expr=[avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@7 > 0.000000 as __common_expr_3, i_category@0 as i_category, i_brand@1 as i_brand, s_store_name@2 as s_store_name, s_company_name@3 as s_company_name, d_year@4 as d_year, d_moy@5 as d_moy, sum(store_sales.ss_sales_price)@6 as sum(store_sales.ss_sales_price), avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@7 as avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW, rank() PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@8 as rank() PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW] + │ BoundedWindowAggExec: wdw=[rank() PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW: Field { "rank() PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW": UInt64 }, frame: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW], mode=[Sorted] + │ SortExec: expr=[i_category@0 ASC NULLS LAST, i_brand@1 ASC NULLS LAST, s_store_name@2 ASC NULLS LAST, s_company_name@3 ASC NULLS LAST, d_year@4 ASC NULLS LAST, d_moy@5 ASC NULLS LAST], preserve_partitioning=[true] + │ RepartitionExec: partitioning=Hash([i_category@0, i_brand@1, s_store_name@2, s_company_name@3], 3), input_partitions=3 + │ BoundedWindowAggExec: wdw=[avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW: Field { "avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW": nullable Decimal128(21, 6) }, frame: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW], mode=[Sorted] + │ SortExec: expr=[i_category@0 ASC NULLS LAST, i_brand@1 ASC NULLS LAST, s_store_name@2 ASC NULLS LAST, s_company_name@3 ASC NULLS LAST, d_year@4 ASC NULLS LAST, d_moy@5 ASC NULLS LAST], preserve_partitioning=[true] + │ [Stage 5] => NetworkShuffleExec: output_partitions=3, input_tasks=2 + │ RepartitionExec: partitioning=Hash([i_category@0, i_brand@1, s_store_name@2, s_company_name@3, v1_lag.rn + Decimal128(1,20,0)@6], 3), input_partitions=3 + │ ProjectionExec: expr=[i_category@0 as i_category, i_brand@1 as i_brand, s_store_name@2 as s_store_name, s_company_name@3 as s_company_name, sum(store_sales.ss_sales_price)@6 as sum_sales, rank() PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@7 as rn, CAST(rank() PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@7 AS Decimal128(20, 0)) + 1 as v1_lag.rn + Decimal128(1,20,0)] │ BoundedWindowAggExec: wdw=[rank() PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW: Field { "rank() PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW": UInt64 }, frame: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW], mode=[Sorted] │ SortExec: expr=[i_category@0 ASC NULLS LAST, i_brand@1 ASC NULLS LAST, s_store_name@2 ASC NULLS LAST, s_company_name@3 ASC NULLS LAST, d_year@4 ASC NULLS LAST, d_moy@5 ASC NULLS LAST], preserve_partitioning=[true] │ [Stage 10] => NetworkShuffleExec: output_partitions=3, input_tasks=2 - │ RepartitionExec: partitioning=Hash([i_category@0, i_brand@1, s_store_name@2, s_company_name@3, v1_lead.rn - Decimal128(Some(1),20,0)@6], 3), input_partitions=3 - │ ProjectionExec: expr=[i_category@0 as i_category, i_brand@1 as i_brand, s_store_name@2 as s_store_name, s_company_name@3 as s_company_name, sum(store_sales.ss_sales_price)@6 as sum_sales, rank() PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@7 as rn, CAST(rank() PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@7 AS Decimal128(20, 0)) - Some(1),20,0 as v1_lead.rn - Decimal128(Some(1),20,0)] + │ RepartitionExec: partitioning=Hash([i_category@0, i_brand@1, s_store_name@2, s_company_name@3, v1_lead.rn - Decimal128(1,20,0)@6], 3), input_partitions=3 + │ ProjectionExec: expr=[i_category@0 as i_category, i_brand@1 as i_brand, s_store_name@2 as s_store_name, s_company_name@3 as s_company_name, sum(store_sales.ss_sales_price)@6 as sum_sales, rank() PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@7 as rn, CAST(rank() PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@7 AS Decimal128(20, 0)) - 1 as v1_lead.rn - Decimal128(1,20,0)] │ BoundedWindowAggExec: wdw=[rank() PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW: Field { "rank() PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW": UInt64 }, frame: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW], mode=[Sorted] │ SortExec: expr=[i_category@0 ASC NULLS LAST, i_brand@1 ASC NULLS LAST, s_store_name@2 ASC NULLS LAST, s_company_name@3 ASC NULLS LAST, d_year@4 ASC NULLS LAST, d_moy@5 ASC NULLS LAST], preserve_partitioning=[true] │ [Stage 15] => NetworkShuffleExec: output_partitions=3, input_tasks=2 @@ -5977,7 +5806,7 @@ mod tests { │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@1)], projection=[i_brand@1, i_category@2, ss_sold_date_sk@3, ss_store_sk@5, ss_sales_price@6] │ CoalescePartitionsExec - │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] @@ -5995,20 +5824,19 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 1999 OR d_year@1 = 1998 AND d_moy@2 = 12 OR d_year@1 = 2000 AND d_moy@2 = 1 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] └────────────────────────────────────────────────── - ┌───── Stage 3 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 10 ── Tasks: t0:[p0..p2] t1:[p0..p2] │ RepartitionExec: partitioning=Hash([i_category@0, i_brand@1, s_store_name@2, s_company_name@3], 3), input_partitions=3 @@ -6026,7 +5854,7 @@ mod tests { │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@1)], projection=[i_brand@1, i_category@2, ss_sold_date_sk@3, ss_store_sk@5, ss_sales_price@6] │ CoalescePartitionsExec - │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] @@ -6044,20 +5872,19 @@ mod tests { ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 1999 OR d_year@1 = 1998 AND d_moy@2 = 12 OR d_year@1 = 2000 AND d_moy@2 = 1 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] └────────────────────────────────────────────────── - ┌───── Stage 8 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 15 ── Tasks: t0:[p0..p2] t1:[p0..p2] │ RepartitionExec: partitioning=Hash([i_category@0, i_brand@1, s_store_name@2, s_company_name@3], 3), input_partitions=3 @@ -6075,7 +5902,7 @@ mod tests { │ [Stage 12] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@1)], projection=[i_brand@1, i_category@2, ss_sold_date_sk@3, ss_store_sk@5, ss_sales_price@6] │ CoalescePartitionsExec - │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] @@ -6093,20 +5920,19 @@ mod tests { ┌───── Stage 12 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 1999 OR d_year@1 = 1998 AND d_moy@2 = 12 OR d_year@1 = 2000 AND d_moy@2 = 1 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] └────────────────────────────────────────────────── - ┌───── Stage 13 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet └────────────────────────────────────────────────── "#); Ok(()) @@ -6114,7 +5940,7 @@ mod tests { #[tokio::test] async fn test_tpcds_48() -> Result<()> { let display = test_tpcds_query("q48").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ AggregateExec: mode=Final, gby=[], aggr=[sum(store_sales.ss_quantity)] │ CoalescePartitionsExec @@ -6125,32 +5951,30 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_quantity@2] │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, ss_addr_sk@1)], filter=(ca_state@1 = CO OR ca_state@1 = OH OR ca_state@1 = TX) AND ss_net_profit@0 >= Some(0),7,2 AND ss_net_profit@0 <= Some(200000),7,2 OR (ca_state@1 = OR OR ca_state@1 = MN OR ca_state@1 = KY) AND ss_net_profit@0 >= Some(15000),7,2 AND ss_net_profit@0 <= Some(300000),7,2 OR (ca_state@1 = VA OR ca_state@1 = CA OR ca_state@1 = MS) AND ss_net_profit@0 >= Some(5000),7,2 AND ss_net_profit@0 <= Some(2500000),7,2, projection=[ss_sold_date_sk@2, ss_quantity@4] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, ss_addr_sk@1)], filter=(ca_state@1 = CO OR ca_state@1 = OH OR ca_state@1 = TX) AND ss_net_profit@0 >= 0.00 AND ss_net_profit@0 <= 2000.00 OR (ca_state@1 = OR OR ca_state@1 = MN OR ca_state@1 = KY) AND ss_net_profit@0 >= 150.00 AND ss_net_profit@0 <= 3000.00 OR (ca_state@1 = VA OR ca_state@1 = CA OR ca_state@1 = MS) AND ss_net_profit@0 >= 50.00 AND ss_net_profit@0 <= 25000.00, projection=[ss_sold_date_sk@2, ss_quantity@4] │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(cd_demo_sk@0, ss_cdemo_sk@1)], filter=cd_marital_status@1 = M AND cd_education_status@2 = 4 yr Degree AND ss_sales_price@0 >= Some(10000),7,2 AND ss_sales_price@0 <= Some(15000),7,2 OR cd_marital_status@1 = D AND cd_education_status@2 = 2 yr Degree AND ss_sales_price@0 >= Some(5000),7,2 AND ss_sales_price@0 <= Some(10000),7,2 OR cd_marital_status@1 = S AND cd_education_status@2 = College AND ss_sales_price@0 >= Some(15000),7,2 AND ss_sales_price@0 <= Some(20000),7,2, projection=[ss_sold_date_sk@3, ss_addr_sk@5, ss_quantity@6, ss_net_profit@8] + │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(cd_demo_sk@0, ss_cdemo_sk@1)], filter=cd_marital_status@1 = M AND cd_education_status@2 = 4 yr Degree AND ss_sales_price@0 >= 100.00 AND ss_sales_price@0 <= 150.00 OR cd_marital_status@1 = D AND cd_education_status@2 = 2 yr Degree AND ss_sales_price@0 >= 50.00 AND ss_sales_price@0 <= 100.00 OR cd_marital_status@1 = S AND cd_education_status@2 = College AND ss_sales_price@0 >= 150.00 AND ss_sales_price@0 <= 200.00, projection=[ss_sold_date_sk@3, ss_addr_sk@5, ss_quantity@6, ss_net_profit@8] │ [Stage 3] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ [Stage 5] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2000, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: ca_country@2 = United States AND ca_state@1 IN (SET) ([CO, OH, TX, OR, MN, KY, VA, CA, MS]) AND (ca_state@1 = CO OR ca_state@1 = OH OR ca_state@1 = TX OR ca_state@1 = OR OR ca_state@1 = MN OR ca_state@1 = KY OR ca_state@1 = VA OR ca_state@1 = CA OR ca_state@1 = MS), projection=[ca_address_sk@0, ca_state@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_country], file_type=parquet, predicate=ca_country@10 = United States AND ca_state@8 IN (SET) ([CO, OH, TX, OR, MN, KY, VA, CA, MS]) AND (ca_state@8 = CO OR ca_state@8 = OH OR ca_state@8 = TX OR ca_state@8 = OR OR ca_state@8 = MN OR ca_state@8 = KY OR ca_state@8 = VA OR ca_state@8 = CA OR ca_state@8 = MS), pruning_predicate=ca_country_null_count@2 != row_count@3 AND ca_country_min@0 <= United States AND United States <= ca_country_max@1 AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CO AND CO <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MN AND MN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CA AND CA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5) AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CO AND CO <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MN AND MN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CA AND CA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5), required_guarantees=[ca_country in (United States), ca_state in (CA, CO, KY, MN, MS, OH, OR, TX, VA)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_country], file_type=parquet, predicate=ca_country@10 = United States AND ca_state@8 IN (SET) ([CO, OH, TX, OR, MN, KY, VA, CA, MS]) AND (ca_state@8 = CO OR ca_state@8 = OH OR ca_state@8 = TX OR ca_state@8 = OR OR ca_state@8 = MN OR ca_state@8 = KY OR ca_state@8 = VA OR ca_state@8 = CA OR ca_state@8 = MS), pruning_predicate=ca_country_null_count@2 != row_count@3 AND ca_country_min@0 <= United States AND United States <= ca_country_max@1 AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CO AND CO <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MN AND MN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CA AND CA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5) AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CO AND CO <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MN AND MN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CA AND CA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5), required_guarantees=[ca_country in (United States), ca_state in (CA, CO, KY, MN, MS, OH, OR, TX, VA)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_country], file_type=parquet, predicate=ca_country@10 = United States AND ca_state@8 IN (SET) ([CO, OH, TX, OR, MN, KY, VA, CA, MS]) AND (ca_state@8 = CO OR ca_state@8 = OH OR ca_state@8 = TX OR ca_state@8 = OR OR ca_state@8 = MN OR ca_state@8 = KY OR ca_state@8 = VA OR ca_state@8 = CA OR ca_state@8 = MS), pruning_predicate=ca_country_null_count@2 != row_count@3 AND ca_country_min@0 <= United States AND United States <= ca_country_max@1 AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CO AND CO <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MN AND MN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CA AND CA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5) AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CO AND CO <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MN AND MN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CA AND CA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5), required_guarantees=[ca_country in (United States), ca_state in (CA, CO, KY, MN, MS, OH, OR, TX, VA)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_country], file_type=parquet, predicate=ca_country@10 = United States AND ca_state@8 IN (SET) ([CO, OH, TX, OR, MN, KY, VA, CA, MS]) AND (ca_state@8 = CO OR ca_state@8 = OH OR ca_state@8 = TX OR ca_state@8 = OR OR ca_state@8 = MN OR ca_state@8 = KY OR ca_state@8 = VA OR ca_state@8 = CA OR ca_state@8 = MS), pruning_predicate=ca_country_null_count@2 != row_count@3 AND ca_country_min@0 <= United States AND United States <= ca_country_max@1 AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CO AND CO <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MN AND MN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CA AND CA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5) AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CO AND CO <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MN AND MN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CA AND CA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5), required_guarantees=[ca_country in (United States), ca_state in (CA, CO, KY, MN, MS, OH, OR, TX, VA)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_country], file_type=parquet, predicate=ca_country@10 = United States AND ca_state@8 IN (SET) ([CO, OH, TX, OR, MN, KY, VA, CA, MS]) AND (ca_state@8 = CO OR ca_state@8 = OH OR ca_state@8 = TX OR ca_state@8 = OR OR ca_state@8 = MN OR ca_state@8 = KY OR ca_state@8 = VA OR ca_state@8 = CA OR ca_state@8 = MS), pruning_predicate=ca_country_null_count@2 != row_count@3 AND ca_country_min@0 <= United States AND United States <= ca_country_max@1 AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CO AND CO <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MN AND MN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CA AND CA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5) AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CO AND CO <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MN AND MN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CA AND CA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5), required_guarantees=[ca_country in (United States), ca_state in (CA, CO, KY, MN, MS, OH, OR, TX, VA)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_country], file_type=parquet, predicate=ca_country@10 = United States AND ca_state@8 IN (SET) ([CO, OH, TX, OR, MN, KY, VA, CA, MS]) AND (ca_state@8 = CO OR ca_state@8 = OH OR ca_state@8 = TX OR ca_state@8 = OR OR ca_state@8 = MN OR ca_state@8 = KY OR ca_state@8 = VA OR ca_state@8 = CA OR ca_state@8 = MS), pruning_predicate=ca_country_null_count@2 != row_count@3 AND ca_country_min@0 <= United States AND United States <= ca_country_max@1 AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CO AND CO <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MN AND MN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CA AND CA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5) AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CO AND CO <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MN AND MN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CA AND CA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5), required_guarantees=[ca_country in (United States), ca_state in (CA, CO, KY, MN, MS, OH, OR, TX, VA)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_country], file_type=parquet, predicate=ca_country@10 = United States AND ca_state@8 IN (SET) ([CO, OH, TX, OR, MN, KY, VA, CA, MS]) AND (ca_state@8 = CO OR ca_state@8 = OH OR ca_state@8 = TX OR ca_state@8 = OR OR ca_state@8 = MN OR ca_state@8 = KY OR ca_state@8 = VA OR ca_state@8 = CA OR ca_state@8 = MS), pruning_predicate=ca_country_null_count@2 != row_count@3 AND ca_country_min@0 <= United States AND United States <= ca_country_max@1 AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CO AND CO <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MN AND MN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CA AND CA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5) AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CO AND CO <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MN AND MN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CA AND CA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5), required_guarantees=[ca_country in (United States), ca_state in (CA, CO, KY, MN, MS, OH, OR, TX, VA)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_country], file_type=parquet, predicate=ca_country@10 = United States AND ca_state@8 IN (SET) ([CO, OH, TX, OR, MN, KY, VA, CA, MS]) AND (ca_state@8 = CO OR ca_state@8 = OH OR ca_state@8 = TX OR ca_state@8 = OR OR ca_state@8 = MN OR ca_state@8 = KY OR ca_state@8 = VA OR ca_state@8 = CA OR ca_state@8 = MS), pruning_predicate=ca_country_null_count@2 != row_count@3 AND ca_country_min@0 <= United States AND United States <= ca_country_max@1 AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CO AND CO <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MN AND MN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CA AND CA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5) AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CO AND CO <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= TX AND TX <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OR AND OR <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MN AND MN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= VA AND VA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CA AND CA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= MS AND MS <= ca_state_max@5), required_guarantees=[ca_country in (United States), ca_state in (CA, CO, KY, MN, MS, OH, OR, TX, VA)] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cd_demo_sk@0], 12), input_partitions=3 @@ -6159,19 +5983,19 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_marital_status@2 = M AND cd_education_status@3 = 4 yr Degree OR cd_marital_status@2 = D AND cd_education_status@3 = 2 yr Degree OR cd_marital_status@2 = S AND cd_education_status@3 = College, pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= 4 yr Degree AND 4 yr Degree <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= D AND D <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= 2 yr Degree AND 2 yr Degree <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= S AND S <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= College AND College <= cd_education_status_max@5, required_guarantees=[cd_education_status in (2 yr Degree, 4 yr Degree, College), cd_marital_status in (D, M, S)] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_marital_status@2 = M AND cd_education_status@3 = 4 yr Degree OR cd_marital_status@2 = D AND cd_education_status@3 = 2 yr Degree OR cd_marital_status@2 = S AND cd_education_status@3 = College, pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= 4 yr Degree AND 4 yr Degree <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= D AND D <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= 2 yr Degree AND 2 yr Degree <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= S AND S <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= College AND College <= cd_education_status_max@5, required_guarantees=[cd_education_status in (2 yr Degree, 4 yr Degree, College), cd_marital_status in (D, M, S)] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_marital_status@2 = M AND cd_education_status@3 = 4 yr Degree OR cd_marital_status@2 = D AND cd_education_status@3 = 2 yr Degree OR cd_marital_status@2 = S AND cd_education_status@3 = College, pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= 4 yr Degree AND 4 yr Degree <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= D AND D <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= 2 yr Degree AND 2 yr Degree <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= S AND S <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= College AND College <= cd_education_status_max@5, required_guarantees=[cd_education_status in (2 yr Degree, 4 yr Degree, College), cd_marital_status in (D, M, S)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_marital_status@2 = M AND cd_education_status@3 = 4 yr Degree OR cd_marital_status@2 = D AND cd_education_status@3 = 2 yr Degree OR cd_marital_status@2 = S AND cd_education_status@3 = College, pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= 4 yr Degree AND 4 yr Degree <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= D AND D <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= 2 yr Degree AND 2 yr Degree <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= S AND S <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= College AND College <= cd_education_status_max@5, required_guarantees=[cd_education_status in (2 yr Degree, 4 yr Degree, College), cd_marital_status in (D, M, S)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_marital_status@2 = M AND cd_education_status@3 = 4 yr Degree OR cd_marital_status@2 = D AND cd_education_status@3 = 2 yr Degree OR cd_marital_status@2 = S AND cd_education_status@3 = College, pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= 4 yr Degree AND 4 yr Degree <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= D AND D <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= 2 yr Degree AND 2 yr Degree <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= S AND S <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= College AND College <= cd_education_status_max@5, required_guarantees=[cd_education_status in (2 yr Degree, 4 yr Degree, College), cd_marital_status in (D, M, S)] └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_cdemo_sk@1], 12), input_partitions=3 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(s_store_sk@0, ss_store_sk@3)], projection=[ss_sold_date_sk@1, ss_cdemo_sk@2, ss_addr_sk@3, ss_quantity@5, ss_sales_price@6, ss_net_profit@7] │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 - │ FilterExec: (ss_net_profit@6 >= Some(0),7,2 AND ss_net_profit@6 <= Some(200000),7,2 OR ss_net_profit@6 >= Some(15000),7,2 AND ss_net_profit@6 <= Some(300000),7,2 OR ss_net_profit@6 >= Some(5000),7,2 AND ss_net_profit@6 <= Some(2500000),7,2) AND (ss_sales_price@5 >= Some(10000),7,2 AND ss_sales_price@5 <= Some(15000),7,2 OR ss_sales_price@5 >= Some(5000),7,2 AND ss_sales_price@5 <= Some(10000),7,2 OR ss_sales_price@5 >= Some(15000),7,2 AND ss_sales_price@5 <= Some(20000),7,2) + │ FilterExec: (ss_net_profit@6 >= 0.00 AND ss_net_profit@6 <= 2000.00 OR ss_net_profit@6 >= 150.00 AND ss_net_profit@6 <= 3000.00 OR ss_net_profit@6 >= 50.00 AND ss_net_profit@6 <= 25000.00) AND (ss_sales_price@5 >= 100.00 AND ss_sales_price@5 <= 150.00 OR ss_sales_price@5 >= 50.00 AND ss_sales_price@5 <= 100.00 OR ss_sales_price@5 >= 150.00 AND ss_sales_price@5 <= 200.00) │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= Some(0),7,2 AND ss_net_profit@22 <= Some(200000),7,2 OR ss_net_profit@22 >= Some(15000),7,2 AND ss_net_profit@22 <= Some(300000),7,2 OR ss_net_profit@22 >= Some(5000),7,2 AND ss_net_profit@22 <= Some(2500000),7,2) AND (ss_sales_price@13 >= Some(10000),7,2 AND ss_sales_price@13 <= Some(15000),7,2 OR ss_sales_price@13 >= Some(5000),7,2 AND ss_sales_price@13 <= Some(10000),7,2 OR ss_sales_price@13 >= Some(15000),7,2 AND ss_sales_price@13 <= Some(20000),7,2) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= Some(0),7,2 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= Some(200000),7,2 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= Some(15000),7,2 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= Some(300000),7,2 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= Some(5000),7,2 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= Some(2500000),7,2) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= Some(10000),7,2 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= Some(15000),7,2 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= Some(5000),7,2 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= Some(10000),7,2 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= Some(15000),7,2 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= Some(20000),7,2), required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= Some(0),7,2 AND ss_net_profit@22 <= Some(200000),7,2 OR ss_net_profit@22 >= Some(15000),7,2 AND ss_net_profit@22 <= Some(300000),7,2 OR ss_net_profit@22 >= Some(5000),7,2 AND ss_net_profit@22 <= Some(2500000),7,2) AND (ss_sales_price@13 >= Some(10000),7,2 AND ss_sales_price@13 <= Some(15000),7,2 OR ss_sales_price@13 >= Some(5000),7,2 AND ss_sales_price@13 <= Some(10000),7,2 OR ss_sales_price@13 >= Some(15000),7,2 AND ss_sales_price@13 <= Some(20000),7,2) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= Some(0),7,2 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= Some(200000),7,2 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= Some(15000),7,2 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= Some(300000),7,2 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= Some(5000),7,2 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= Some(2500000),7,2) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= Some(10000),7,2 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= Some(15000),7,2 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= Some(5000),7,2 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= Some(10000),7,2 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= Some(15000),7,2 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= Some(20000),7,2), required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= Some(0),7,2 AND ss_net_profit@22 <= Some(200000),7,2 OR ss_net_profit@22 >= Some(15000),7,2 AND ss_net_profit@22 <= Some(300000),7,2 OR ss_net_profit@22 >= Some(5000),7,2 AND ss_net_profit@22 <= Some(2500000),7,2) AND (ss_sales_price@13 >= Some(10000),7,2 AND ss_sales_price@13 <= Some(15000),7,2 OR ss_sales_price@13 >= Some(5000),7,2 AND ss_sales_price@13 <= Some(10000),7,2 OR ss_sales_price@13 >= Some(15000),7,2 AND ss_sales_price@13 <= Some(20000),7,2) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= Some(0),7,2 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= Some(200000),7,2 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= Some(15000),7,2 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= Some(300000),7,2 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= Some(5000),7,2 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= Some(2500000),7,2) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= Some(10000),7,2 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= Some(15000),7,2 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= Some(5000),7,2 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= Some(10000),7,2 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= Some(15000),7,2 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= Some(20000),7,2), required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= Some(0),7,2 AND ss_net_profit@22 <= Some(200000),7,2 OR ss_net_profit@22 >= Some(15000),7,2 AND ss_net_profit@22 <= Some(300000),7,2 OR ss_net_profit@22 >= Some(5000),7,2 AND ss_net_profit@22 <= Some(2500000),7,2) AND (ss_sales_price@13 >= Some(10000),7,2 AND ss_sales_price@13 <= Some(15000),7,2 OR ss_sales_price@13 >= Some(5000),7,2 AND ss_sales_price@13 <= Some(10000),7,2 OR ss_sales_price@13 >= Some(15000),7,2 AND ss_sales_price@13 <= Some(20000),7,2) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= Some(0),7,2 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= Some(200000),7,2 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= Some(15000),7,2 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= Some(300000),7,2 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= Some(5000),7,2 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= Some(2500000),7,2) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= Some(10000),7,2 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= Some(15000),7,2 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= Some(5000),7,2 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= Some(10000),7,2 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= Some(15000),7,2 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= Some(20000),7,2), required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= 0.00 AND ss_net_profit@22 <= 2000.00 OR ss_net_profit@22 >= 150.00 AND ss_net_profit@22 <= 3000.00 OR ss_net_profit@22 >= 50.00 AND ss_net_profit@22 <= 25000.00) AND (ss_sales_price@13 >= 100.00 AND ss_sales_price@13 <= 150.00 OR ss_sales_price@13 >= 50.00 AND ss_sales_price@13 <= 100.00 OR ss_sales_price@13 >= 150.00 AND ss_sales_price@13 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 0.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 2000.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 150.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 3000.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 50.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 25000.00) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 100.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 150.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 50.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 100.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 150.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 200.00), required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= 0.00 AND ss_net_profit@22 <= 2000.00 OR ss_net_profit@22 >= 150.00 AND ss_net_profit@22 <= 3000.00 OR ss_net_profit@22 >= 50.00 AND ss_net_profit@22 <= 25000.00) AND (ss_sales_price@13 >= 100.00 AND ss_sales_price@13 <= 150.00 OR ss_sales_price@13 >= 50.00 AND ss_sales_price@13 <= 100.00 OR ss_sales_price@13 >= 150.00 AND ss_sales_price@13 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 0.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 2000.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 150.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 3000.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 50.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 25000.00) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 100.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 150.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 50.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 100.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 150.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 200.00), required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= 0.00 AND ss_net_profit@22 <= 2000.00 OR ss_net_profit@22 >= 150.00 AND ss_net_profit@22 <= 3000.00 OR ss_net_profit@22 >= 50.00 AND ss_net_profit@22 <= 25000.00) AND (ss_sales_price@13 >= 100.00 AND ss_sales_price@13 <= 150.00 OR ss_sales_price@13 >= 50.00 AND ss_sales_price@13 <= 100.00 OR ss_sales_price@13 >= 150.00 AND ss_sales_price@13 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 0.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 2000.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 150.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 3000.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 50.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 25000.00) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 100.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 150.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 50.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 100.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 150.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 200.00), required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= 0.00 AND ss_net_profit@22 <= 2000.00 OR ss_net_profit@22 >= 150.00 AND ss_net_profit@22 <= 3000.00 OR ss_net_profit@22 >= 50.00 AND ss_net_profit@22 <= 25000.00) AND (ss_sales_price@13 >= 100.00 AND ss_sales_price@13 <= 150.00 OR ss_sales_price@13 >= 50.00 AND ss_sales_price@13 <= 100.00 OR ss_sales_price@13 >= 150.00 AND ss_sales_price@13 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 0.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 2000.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 150.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 3000.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 50.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 25000.00) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 100.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 150.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 50.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 100.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 150.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 200.00), required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -6192,9 +6016,9 @@ mod tests { │ SortPreservingMergeExec: [channel@0 ASC, return_rank@3 ASC, currency_rank@4 ASC, item@1 ASC], fetch=100 │ SortExec: TopK(fetch=100), expr=[channel@0 ASC, return_rank@3 ASC, currency_rank@4 ASC, item@1 ASC], preserve_partitioning=[true] │ AggregateExec: mode=FinalPartitioned, gby=[channel@0 as channel, item@1 as item, return_ratio@2 as return_ratio, return_rank@3 as return_rank, currency_rank@4 as currency_rank], aggr=[] - │ [Stage 16] => NetworkShuffleExec: output_partitions=3, input_tasks=3 + │ [Stage 13] => NetworkShuffleExec: output_partitions=3, input_tasks=3 └────────────────────────────────────────────────── - ┌───── Stage 16 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] + ┌───── Stage 13 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] │ RepartitionExec: partitioning=Hash([channel@0, item@1, return_ratio@2, return_rank@3, currency_rank@4], 3), input_partitions=3 │ AggregateExec: mode=Partial, gby=[channel@0 as channel, item@1 as item, return_ratio@2 as return_ratio, return_rank@3 as return_rank, currency_rank@4 as currency_rank], aggr=[], ordering_mode=PartiallySorted([0, 4]) │ DistributedUnionExec: t0:[c0] t1:[c1] t2:[c2] @@ -6206,7 +6030,7 @@ mod tests { │ SortExec: expr=[currency_ratio@2 ASC NULLS LAST], preserve_partitioning=[false] │ BoundedWindowAggExec: wdw=[rank() ORDER BY [in_web.return_ratio ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW: Field { "rank() ORDER BY [in_web.return_ratio ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW": UInt64 }, frame: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW], mode=[Sorted] │ SortPreservingMergeExec: [return_ratio@1 ASC NULLS LAST] - │ [Stage 5] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 + │ [Stage 4] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 │ ProjectionExec: expr=[catalog as channel, item@0 as item, return_ratio@1 as return_ratio, rank() ORDER BY [in_cat.return_ratio ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@2 as return_rank, rank() ORDER BY [in_cat.currency_ratio ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@3 as currency_rank] │ FilterExec: rank() ORDER BY [in_cat.return_ratio ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@2 <= 10 OR rank() ORDER BY [in_cat.currency_ratio ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@3 <= 10 │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=1, maintains_sort_order=true @@ -6215,7 +6039,7 @@ mod tests { │ SortExec: expr=[currency_ratio@2 ASC NULLS LAST], preserve_partitioning=[false] │ BoundedWindowAggExec: wdw=[rank() ORDER BY [in_cat.return_ratio ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW: Field { "rank() ORDER BY [in_cat.return_ratio ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW": UInt64 }, frame: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW], mode=[Sorted] │ SortPreservingMergeExec: [return_ratio@1 ASC NULLS LAST] - │ [Stage 10] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 + │ [Stage 8] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 │ ProjectionExec: expr=[store as channel, item@0 as item, return_ratio@1 as return_ratio, rank() ORDER BY [in_store.return_ratio ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@2 as return_rank, rank() ORDER BY [in_store.currency_ratio ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@3 as currency_rank] │ FilterExec: rank() ORDER BY [in_store.return_ratio ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@2 <= 10 OR rank() ORDER BY [in_store.currency_ratio ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@3 <= 10 │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=1, maintains_sort_order=true @@ -6224,150 +6048,138 @@ mod tests { │ SortExec: expr=[currency_ratio@2 ASC NULLS LAST], preserve_partitioning=[false] │ BoundedWindowAggExec: wdw=[rank() ORDER BY [in_store.return_ratio ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW: Field { "rank() ORDER BY [in_store.return_ratio ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW": UInt64 }, frame: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW], mode=[Sorted] │ SortPreservingMergeExec: [return_ratio@1 ASC NULLS LAST] - │ [Stage 15] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 + │ SortExec: expr=[return_ratio@1 ASC NULLS LAST], preserve_partitioning=[true] + │ ProjectionExec: expr=[ss_item_sk@0 as item, CAST(sum(coalesce(sr.sr_return_quantity,Int64(0)))@1 AS Decimal128(15, 4)) / CAST(sum(coalesce(sts.ss_quantity,Int64(0)))@2 AS Decimal128(15, 4)) as return_ratio, CAST(sum(coalesce(sr.sr_return_amt,Int64(0)))@3 AS Decimal128(15, 4)) / CAST(sum(coalesce(sts.ss_net_paid,Int64(0)))@4 AS Decimal128(15, 4)) as currency_ratio] + │ AggregateExec: mode=FinalPartitioned, gby=[ss_item_sk@0 as ss_item_sk], aggr=[sum(CASE WHEN __common_expr_9 IS NOT NULL THEN __common_expr_9 ELSE 0 END) as sum(coalesce(sr.sr_return_quantity,Int64(0))), sum(CASE WHEN __common_expr_10 IS NOT NULL THEN __common_expr_10 ELSE 0 END) as sum(coalesce(sts.ss_quantity,Int64(0))), sum(CASE WHEN __common_expr_11 IS NOT NULL THEN __common_expr_11 ELSE 0.00 END) as sum(coalesce(sr.sr_return_amt,Int64(0))), sum(CASE WHEN __common_expr_12 IS NOT NULL THEN __common_expr_12 ELSE 0.00 END) as sum(coalesce(sts.ss_net_paid,Int64(0)))] + │ [Stage 12] => NetworkShuffleExec: output_partitions=3, input_tasks=2 └────────────────────────────────────────────────── - ┌───── Stage 5 ── Tasks: t0:[p0..p2] t1:[p0..p2] + ┌───── Stage 4 ── Tasks: t0:[p0..p2] t1:[p0..p2] │ SortExec: expr=[return_ratio@1 ASC NULLS LAST], preserve_partitioning=[true] │ ProjectionExec: expr=[ws_item_sk@0 as item, CAST(sum(coalesce(wr.wr_return_quantity,Int64(0)))@1 AS Decimal128(15, 4)) / CAST(sum(coalesce(ws.ws_quantity,Int64(0)))@2 AS Decimal128(15, 4)) as return_ratio, CAST(sum(coalesce(wr.wr_return_amt,Int64(0)))@3 AS Decimal128(15, 4)) / CAST(sum(coalesce(ws.ws_net_paid,Int64(0)))@4 AS Decimal128(15, 4)) as currency_ratio] - │ AggregateExec: mode=FinalPartitioned, gby=[ws_item_sk@0 as ws_item_sk], aggr=[sum(CASE WHEN __common_expr_1 IS NOT NULL THEN __common_expr_1 ELSE 0 END) as sum(coalesce(wr.wr_return_quantity,Int64(0))), sum(CASE WHEN __common_expr_2 IS NOT NULL THEN __common_expr_2 ELSE 0 END) as sum(coalesce(ws.ws_quantity,Int64(0))), sum(CASE WHEN __common_expr_3 IS NOT NULL THEN __common_expr_3 ELSE Some(0),22,2 END) as sum(coalesce(wr.wr_return_amt,Int64(0))), sum(CASE WHEN __common_expr_4 IS NOT NULL THEN __common_expr_4 ELSE Some(0),22,2 END) as sum(coalesce(ws.ws_net_paid,Int64(0)))] - │ [Stage 4] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ AggregateExec: mode=FinalPartitioned, gby=[ws_item_sk@0 as ws_item_sk], aggr=[sum(CASE WHEN __common_expr_1 IS NOT NULL THEN __common_expr_1 ELSE 0 END) as sum(coalesce(wr.wr_return_quantity,Int64(0))), sum(CASE WHEN __common_expr_2 IS NOT NULL THEN __common_expr_2 ELSE 0 END) as sum(coalesce(ws.ws_quantity,Int64(0))), sum(CASE WHEN __common_expr_3 IS NOT NULL THEN __common_expr_3 ELSE 0.00 END) as sum(coalesce(wr.wr_return_amt,Int64(0))), sum(CASE WHEN __common_expr_4 IS NOT NULL THEN __common_expr_4 ELSE 0.00 END) as sum(coalesce(ws.ws_net_paid,Int64(0)))] + │ [Stage 3] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 4 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] + ┌───── Stage 3 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([ws_item_sk@0], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[ws_item_sk@4 as ws_item_sk], aggr=[sum(CASE WHEN __common_expr_1 IS NOT NULL THEN __common_expr_1 ELSE 0 END) as sum(coalesce(wr.wr_return_quantity,Int64(0))), sum(CASE WHEN __common_expr_2 IS NOT NULL THEN __common_expr_2 ELSE 0 END) as sum(coalesce(ws.ws_quantity,Int64(0))), sum(CASE WHEN __common_expr_3 IS NOT NULL THEN __common_expr_3 ELSE Some(0),22,2 END) as sum(coalesce(wr.wr_return_amt,Int64(0))), sum(CASE WHEN __common_expr_4 IS NOT NULL THEN __common_expr_4 ELSE Some(0),22,2 END) as sum(coalesce(ws.ws_net_paid,Int64(0)))] + │ AggregateExec: mode=Partial, gby=[ws_item_sk@4 as ws_item_sk], aggr=[sum(CASE WHEN __common_expr_1 IS NOT NULL THEN __common_expr_1 ELSE 0 END) as sum(coalesce(wr.wr_return_quantity,Int64(0))), sum(CASE WHEN __common_expr_2 IS NOT NULL THEN __common_expr_2 ELSE 0 END) as sum(coalesce(ws.ws_quantity,Int64(0))), sum(CASE WHEN __common_expr_3 IS NOT NULL THEN __common_expr_3 ELSE 0.00 END) as sum(coalesce(wr.wr_return_amt,Int64(0))), sum(CASE WHEN __common_expr_4 IS NOT NULL THEN __common_expr_4 ELSE 0.00 END) as sum(coalesce(ws.ws_net_paid,Int64(0)))] │ ProjectionExec: expr=[CAST(wr_return_quantity@0 AS Int64) as __common_expr_1, CAST(ws_quantity@1 AS Int64) as __common_expr_2, CAST(wr_return_amt@2 AS Decimal128(22, 2)) as __common_expr_3, CAST(ws_net_paid@3 AS Decimal128(22, 2)) as __common_expr_4, ws_item_sk@4 as ws_item_sk] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[wr_return_quantity@5, ws_quantity@3, wr_return_amt@6, ws_net_paid@4, ws_item_sk@2] │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ FilterExec: wr_return_amt@5 > Some(1000000),7,2 - │ HashJoinExec: mode=Partitioned, join_type=Right, on=[(wr_order_number@1, ws_order_number@2), (wr_item_sk@0, ws_item_sk@1)], projection=[ws_sold_date_sk@4, ws_item_sk@5, ws_quantity@7, ws_net_paid@8, wr_return_quantity@2, wr_return_amt@3] - │ [Stage 2] => NetworkShuffleExec: output_partitions=3, input_tasks=4 - │ [Stage 3] => NetworkShuffleExec: output_partitions=3, input_tasks=4 - └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: d_year@1 = 2001 AND d_moy@2 = 12, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (2001)] - └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([wr_order_number@1, wr_item_sk@0], 12), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet - └────────────────────────────────────────────────── - ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([ws_order_number@2, ws_item_sk@1], 12), input_partitions=3 - │ FilterExec: ws_net_profit@5 > Some(100),7,2 AND ws_net_paid@4 > Some(0),7,2 AND ws_quantity@3 > 0, projection=[ws_sold_date_sk@0, ws_item_sk@1, ws_order_number@2, ws_quantity@3, ws_net_paid@4] - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_net_paid, ws_net_profit], file_type=parquet, predicate=ws_net_profit@33 > Some(100),7,2 AND ws_net_paid@29 > Some(0),7,2 AND ws_quantity@18 > 0 AND DynamicFilter [ empty ], pruning_predicate=ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 > Some(100),7,2 AND ws_net_paid_null_count@4 != row_count@2 AND ws_net_paid_max@3 > Some(0),7,2 AND ws_quantity_null_count@6 != row_count@2 AND ws_quantity_max@5 > 0, required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_net_paid, ws_net_profit], file_type=parquet, predicate=ws_net_profit@33 > Some(100),7,2 AND ws_net_paid@29 > Some(0),7,2 AND ws_quantity@18 > 0 AND DynamicFilter [ empty ], pruning_predicate=ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 > Some(100),7,2 AND ws_net_paid_null_count@4 != row_count@2 AND ws_net_paid_max@3 > Some(0),7,2 AND ws_quantity_null_count@6 != row_count@2 AND ws_quantity_max@5 > 0, required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_net_paid, ws_net_profit], file_type=parquet, predicate=ws_net_profit@33 > Some(100),7,2 AND ws_net_paid@29 > Some(0),7,2 AND ws_quantity@18 > 0 AND DynamicFilter [ empty ], pruning_predicate=ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 > Some(100),7,2 AND ws_net_paid_null_count@4 != row_count@2 AND ws_net_paid_max@3 > Some(0),7,2 AND ws_quantity_null_count@6 != row_count@2 AND ws_quantity_max@5 > 0, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_net_paid, ws_net_profit], file_type=parquet, predicate=ws_net_profit@33 > Some(100),7,2 AND ws_net_paid@29 > Some(0),7,2 AND ws_quantity@18 > 0 AND DynamicFilter [ empty ], pruning_predicate=ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 > Some(100),7,2 AND ws_net_paid_null_count@4 != row_count@2 AND ws_net_paid_max@3 > Some(0),7,2 AND ws_quantity_null_count@6 != row_count@2 AND ws_quantity_max@5 > 0, required_guarantees=[] - └────────────────────────────────────────────────── - ┌───── Stage 10 ── Tasks: t0:[p0..p2] t1:[p0..p2] - │ SortExec: expr=[return_ratio@1 ASC NULLS LAST], preserve_partitioning=[true] - │ ProjectionExec: expr=[cs_item_sk@0 as item, CAST(sum(coalesce(cr.cr_return_quantity,Int64(0)))@1 AS Decimal128(15, 4)) / CAST(sum(coalesce(cs.cs_quantity,Int64(0)))@2 AS Decimal128(15, 4)) as return_ratio, CAST(sum(coalesce(cr.cr_return_amount,Int64(0)))@3 AS Decimal128(15, 4)) / CAST(sum(coalesce(cs.cs_net_paid,Int64(0)))@4 AS Decimal128(15, 4)) as currency_ratio] - │ AggregateExec: mode=FinalPartitioned, gby=[cs_item_sk@0 as cs_item_sk], aggr=[sum(CASE WHEN __common_expr_5 IS NOT NULL THEN __common_expr_5 ELSE 0 END) as sum(coalesce(cr.cr_return_quantity,Int64(0))), sum(CASE WHEN __common_expr_6 IS NOT NULL THEN __common_expr_6 ELSE 0 END) as sum(coalesce(cs.cs_quantity,Int64(0))), sum(CASE WHEN __common_expr_7 IS NOT NULL THEN __common_expr_7 ELSE Some(0),22,2 END) as sum(coalesce(cr.cr_return_amount,Int64(0))), sum(CASE WHEN __common_expr_8 IS NOT NULL THEN __common_expr_8 ELSE Some(0),22,2 END) as sum(coalesce(cs.cs_net_paid,Int64(0)))] - │ [Stage 9] => NetworkShuffleExec: output_partitions=3, input_tasks=4 - └────────────────────────────────────────────────── - ┌───── Stage 9 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] - │ RepartitionExec: partitioning=Hash([cs_item_sk@0], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[cs_item_sk@4 as cs_item_sk], aggr=[sum(CASE WHEN __common_expr_5 IS NOT NULL THEN __common_expr_5 ELSE 0 END) as sum(coalesce(cr.cr_return_quantity,Int64(0))), sum(CASE WHEN __common_expr_6 IS NOT NULL THEN __common_expr_6 ELSE 0 END) as sum(coalesce(cs.cs_quantity,Int64(0))), sum(CASE WHEN __common_expr_7 IS NOT NULL THEN __common_expr_7 ELSE Some(0),22,2 END) as sum(coalesce(cr.cr_return_amount,Int64(0))), sum(CASE WHEN __common_expr_8 IS NOT NULL THEN __common_expr_8 ELSE Some(0),22,2 END) as sum(coalesce(cs.cs_net_paid,Int64(0)))] - │ ProjectionExec: expr=[CAST(cr_return_quantity@0 AS Int64) as __common_expr_5, CAST(cs_quantity@1 AS Int64) as __common_expr_6, CAST(cr_return_amount@2 AS Decimal128(22, 2)) as __common_expr_7, CAST(cs_net_paid@3 AS Decimal128(22, 2)) as __common_expr_8, cs_item_sk@4 as cs_item_sk] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cr_return_quantity@5, cs_quantity@3, cr_return_amount@6, cs_net_paid@4, cs_item_sk@2] - │ CoalescePartitionsExec - │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ FilterExec: cr_return_amount@5 > Some(1000000),7,2 - │ HashJoinExec: mode=Partitioned, join_type=Right, on=[(cr_order_number@1, cs_order_number@2), (cr_item_sk@0, cs_item_sk@1)], projection=[cs_sold_date_sk@4, cs_item_sk@5, cs_quantity@7, cs_net_paid@8, cr_return_quantity@2, cr_return_amount@3] - │ [Stage 7] => NetworkShuffleExec: output_partitions=3, input_tasks=4 - │ [Stage 8] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(wr_order_number@1, ws_order_number@2), (wr_item_sk@0, ws_item_sk@1)], projection=[ws_sold_date_sk@4, ws_item_sk@5, ws_quantity@7, ws_net_paid@8, wr_return_quantity@2, wr_return_amt@3] + │ CoalescePartitionsExec + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ FilterExec: ws_net_profit@5 > 1.00 AND ws_net_paid@4 > 0.00 AND ws_quantity@3 > 0, projection=[ws_sold_date_sk@0, ws_item_sk@1, ws_order_number@2, ws_quantity@3, ws_net_paid@4] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_net_paid, ws_net_profit], file_type=parquet, predicate=ws_net_profit@33 > 1.00 AND ws_net_paid@29 > 0.00 AND ws_quantity@18 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 > 1.00 AND ws_net_paid_null_count@4 != row_count@2 AND ws_net_paid_max@3 > 0.00 AND ws_quantity_null_count@6 != row_count@2 AND ws_quantity_max@5 > 0, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_net_paid, ws_net_profit], file_type=parquet, predicate=ws_net_profit@33 > 1.00 AND ws_net_paid@29 > 0.00 AND ws_quantity@18 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 > 1.00 AND ws_net_paid_null_count@4 != row_count@2 AND ws_net_paid_max@3 > 0.00 AND ws_quantity_null_count@6 != row_count@2 AND ws_quantity_max@5 > 0, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_net_paid, ws_net_profit], file_type=parquet, predicate=ws_net_profit@33 > 1.00 AND ws_net_paid@29 > 0.00 AND ws_quantity@18 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 > 1.00 AND ws_net_paid_null_count@4 != row_count@2 AND ws_net_paid_max@3 > 0.00 AND ws_quantity_null_count@6 != row_count@2 AND ws_quantity_max@5 > 0, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_net_paid, ws_net_profit], file_type=parquet, predicate=ws_net_profit@33 > 1.00 AND ws_net_paid@29 > 0.00 AND ws_quantity@18 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 > 1.00 AND ws_net_paid_null_count@4 != row_count@2 AND ws_net_paid_max@3 > 0.00 AND ws_quantity_null_count@6 != row_count@2 AND ws_quantity_max@5 > 0, required_guarantees=[] └────────────────────────────────────────────────── - ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: d_year@1 = 2001 AND d_moy@2 = 12, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (2001)] - └────────────────────────────────────────────────── - ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([cr_order_number@1, cr_item_sk@0], 12), input_partitions=3 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_return_quantity, cr_return_amount], file_type=parquet - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_return_quantity, cr_return_amount], file_type=parquet - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_return_quantity, cr_return_amount], file_type=parquet - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_return_quantity, cr_return_amount], file_type=parquet + ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ FilterExec: d_year@1 = 2001 AND d_moy@2 = 12, projection=[d_date_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (2001)] └────────────────────────────────────────────────── - ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([cs_order_number@2, cs_item_sk@1], 12), input_partitions=3 - │ FilterExec: cs_net_profit@5 > Some(100),7,2 AND cs_net_paid@4 > Some(0),7,2 AND cs_quantity@3 > 0, projection=[cs_sold_date_sk@0, cs_item_sk@1, cs_order_number@2, cs_quantity@3, cs_net_paid@4] + ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ FilterExec: wr_return_amt@3 > 10000.00 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_net_paid, cs_net_profit], file_type=parquet, predicate=cs_net_profit@33 > Some(100),7,2 AND cs_net_paid@29 > Some(0),7,2 AND cs_quantity@18 > 0 AND DynamicFilter [ empty ], pruning_predicate=cs_net_profit_null_count@1 != row_count@2 AND cs_net_profit_max@0 > Some(100),7,2 AND cs_net_paid_null_count@4 != row_count@2 AND cs_net_paid_max@3 > Some(0),7,2 AND cs_quantity_null_count@6 != row_count@2 AND cs_quantity_max@5 > 0, required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_net_paid, cs_net_profit], file_type=parquet, predicate=cs_net_profit@33 > Some(100),7,2 AND cs_net_paid@29 > Some(0),7,2 AND cs_quantity@18 > 0 AND DynamicFilter [ empty ], pruning_predicate=cs_net_profit_null_count@1 != row_count@2 AND cs_net_profit_max@0 > Some(100),7,2 AND cs_net_paid_null_count@4 != row_count@2 AND cs_net_paid_max@3 > Some(0),7,2 AND cs_quantity_null_count@6 != row_count@2 AND cs_quantity_max@5 > 0, required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_net_paid, cs_net_profit], file_type=parquet, predicate=cs_net_profit@33 > Some(100),7,2 AND cs_net_paid@29 > Some(0),7,2 AND cs_quantity@18 > 0 AND DynamicFilter [ empty ], pruning_predicate=cs_net_profit_null_count@1 != row_count@2 AND cs_net_profit_max@0 > Some(100),7,2 AND cs_net_paid_null_count@4 != row_count@2 AND cs_net_paid_max@3 > Some(0),7,2 AND cs_quantity_null_count@6 != row_count@2 AND cs_quantity_max@5 > 0, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_net_paid, cs_net_profit], file_type=parquet, predicate=cs_net_profit@33 > Some(100),7,2 AND cs_net_paid@29 > Some(0),7,2 AND cs_quantity@18 > 0 AND DynamicFilter [ empty ], pruning_predicate=cs_net_profit_null_count@1 != row_count@2 AND cs_net_profit_max@0 > Some(100),7,2 AND cs_net_paid_null_count@4 != row_count@2 AND cs_net_paid_max@3 > Some(0),7,2 AND cs_quantity_null_count@6 != row_count@2 AND cs_quantity_max@5 > 0, required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=wr_return_amt@15 > 10000.00, pruning_predicate=wr_return_amt_null_count@1 != row_count@2 AND wr_return_amt_max@0 > 10000.00, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=wr_return_amt@15 > 10000.00, pruning_predicate=wr_return_amt_null_count@1 != row_count@2 AND wr_return_amt_max@0 > 10000.00, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=wr_return_amt@15 > 10000.00, pruning_predicate=wr_return_amt_null_count@1 != row_count@2 AND wr_return_amt_max@0 > 10000.00, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=wr_return_amt@15 > 10000.00, pruning_predicate=wr_return_amt_null_count@1 != row_count@2 AND wr_return_amt_max@0 > 10000.00, required_guarantees=[] └────────────────────────────────────────────────── - ┌───── Stage 15 ── Tasks: t0:[p0..p2] t1:[p0..p2] + ┌───── Stage 8 ── Tasks: t0:[p0..p2] t1:[p0..p2] │ SortExec: expr=[return_ratio@1 ASC NULLS LAST], preserve_partitioning=[true] - │ ProjectionExec: expr=[ss_item_sk@0 as item, CAST(sum(coalesce(sr.sr_return_quantity,Int64(0)))@1 AS Decimal128(15, 4)) / CAST(sum(coalesce(sts.ss_quantity,Int64(0)))@2 AS Decimal128(15, 4)) as return_ratio, CAST(sum(coalesce(sr.sr_return_amt,Int64(0)))@3 AS Decimal128(15, 4)) / CAST(sum(coalesce(sts.ss_net_paid,Int64(0)))@4 AS Decimal128(15, 4)) as currency_ratio] - │ AggregateExec: mode=FinalPartitioned, gby=[ss_item_sk@0 as ss_item_sk], aggr=[sum(CASE WHEN __common_expr_9 IS NOT NULL THEN __common_expr_9 ELSE 0 END) as sum(coalesce(sr.sr_return_quantity,Int64(0))), sum(CASE WHEN __common_expr_10 IS NOT NULL THEN __common_expr_10 ELSE 0 END) as sum(coalesce(sts.ss_quantity,Int64(0))), sum(CASE WHEN __common_expr_11 IS NOT NULL THEN __common_expr_11 ELSE Some(0),22,2 END) as sum(coalesce(sr.sr_return_amt,Int64(0))), sum(CASE WHEN __common_expr_12 IS NOT NULL THEN __common_expr_12 ELSE Some(0),22,2 END) as sum(coalesce(sts.ss_net_paid,Int64(0)))] - │ [Stage 14] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ ProjectionExec: expr=[cs_item_sk@0 as item, CAST(sum(coalesce(cr.cr_return_quantity,Int64(0)))@1 AS Decimal128(15, 4)) / CAST(sum(coalesce(cs.cs_quantity,Int64(0)))@2 AS Decimal128(15, 4)) as return_ratio, CAST(sum(coalesce(cr.cr_return_amount,Int64(0)))@3 AS Decimal128(15, 4)) / CAST(sum(coalesce(cs.cs_net_paid,Int64(0)))@4 AS Decimal128(15, 4)) as currency_ratio] + │ AggregateExec: mode=FinalPartitioned, gby=[cs_item_sk@0 as cs_item_sk], aggr=[sum(CASE WHEN __common_expr_5 IS NOT NULL THEN __common_expr_5 ELSE 0 END) as sum(coalesce(cr.cr_return_quantity,Int64(0))), sum(CASE WHEN __common_expr_6 IS NOT NULL THEN __common_expr_6 ELSE 0 END) as sum(coalesce(cs.cs_quantity,Int64(0))), sum(CASE WHEN __common_expr_7 IS NOT NULL THEN __common_expr_7 ELSE 0.00 END) as sum(coalesce(cr.cr_return_amount,Int64(0))), sum(CASE WHEN __common_expr_8 IS NOT NULL THEN __common_expr_8 ELSE 0.00 END) as sum(coalesce(cs.cs_net_paid,Int64(0)))] + │ [Stage 7] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 14 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] - │ RepartitionExec: partitioning=Hash([ss_item_sk@0], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[ss_item_sk@4 as ss_item_sk], aggr=[sum(CASE WHEN __common_expr_9 IS NOT NULL THEN __common_expr_9 ELSE 0 END) as sum(coalesce(sr.sr_return_quantity,Int64(0))), sum(CASE WHEN __common_expr_10 IS NOT NULL THEN __common_expr_10 ELSE 0 END) as sum(coalesce(sts.ss_quantity,Int64(0))), sum(CASE WHEN __common_expr_11 IS NOT NULL THEN __common_expr_11 ELSE Some(0),22,2 END) as sum(coalesce(sr.sr_return_amt,Int64(0))), sum(CASE WHEN __common_expr_12 IS NOT NULL THEN __common_expr_12 ELSE Some(0),22,2 END) as sum(coalesce(sts.ss_net_paid,Int64(0)))] - │ ProjectionExec: expr=[CAST(sr_return_quantity@0 AS Int64) as __common_expr_9, CAST(ss_quantity@1 AS Int64) as __common_expr_10, CAST(sr_return_amt@2 AS Decimal128(22, 2)) as __common_expr_11, CAST(ss_net_paid@3 AS Decimal128(22, 2)) as __common_expr_12, ss_item_sk@4 as ss_item_sk] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[sr_return_quantity@5, ss_quantity@3, sr_return_amt@6, ss_net_paid@4, ss_item_sk@2] + ┌───── Stage 7 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] + │ RepartitionExec: partitioning=Hash([cs_item_sk@0], 6), input_partitions=3 + │ AggregateExec: mode=Partial, gby=[cs_item_sk@4 as cs_item_sk], aggr=[sum(CASE WHEN __common_expr_5 IS NOT NULL THEN __common_expr_5 ELSE 0 END) as sum(coalesce(cr.cr_return_quantity,Int64(0))), sum(CASE WHEN __common_expr_6 IS NOT NULL THEN __common_expr_6 ELSE 0 END) as sum(coalesce(cs.cs_quantity,Int64(0))), sum(CASE WHEN __common_expr_7 IS NOT NULL THEN __common_expr_7 ELSE 0.00 END) as sum(coalesce(cr.cr_return_amount,Int64(0))), sum(CASE WHEN __common_expr_8 IS NOT NULL THEN __common_expr_8 ELSE 0.00 END) as sum(coalesce(cs.cs_net_paid,Int64(0)))] + │ ProjectionExec: expr=[CAST(cr_return_quantity@0 AS Int64) as __common_expr_5, CAST(cs_quantity@1 AS Int64) as __common_expr_6, CAST(cr_return_amount@2 AS Decimal128(22, 2)) as __common_expr_7, CAST(cs_net_paid@3 AS Decimal128(22, 2)) as __common_expr_8, cs_item_sk@4 as cs_item_sk] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cr_return_quantity@5, cs_quantity@3, cr_return_amount@6, cs_net_paid@4, cs_item_sk@2] │ CoalescePartitionsExec - │ [Stage 11] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ FilterExec: sr_return_amt@5 > Some(1000000),7,2 - │ HashJoinExec: mode=Partitioned, join_type=Right, on=[(sr_ticket_number@1, ss_ticket_number@2), (sr_item_sk@0, ss_item_sk@1)], projection=[ss_sold_date_sk@4, ss_item_sk@5, ss_quantity@7, ss_net_paid@8, sr_return_quantity@2, sr_return_amt@3] - │ [Stage 12] => NetworkShuffleExec: output_partitions=3, input_tasks=4 - │ [Stage 13] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(cr_order_number@1, cs_order_number@2), (cr_item_sk@0, cs_item_sk@1)], projection=[cs_sold_date_sk@4, cs_item_sk@5, cs_quantity@7, cs_net_paid@8, cr_return_quantity@2, cr_return_amount@3] + │ CoalescePartitionsExec + │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ FilterExec: cs_net_profit@5 > 1.00 AND cs_net_paid@4 > 0.00 AND cs_quantity@3 > 0, projection=[cs_sold_date_sk@0, cs_item_sk@1, cs_order_number@2, cs_quantity@3, cs_net_paid@4] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_net_paid, cs_net_profit], file_type=parquet, predicate=cs_net_profit@33 > 1.00 AND cs_net_paid@29 > 0.00 AND cs_quantity@18 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=cs_net_profit_null_count@1 != row_count@2 AND cs_net_profit_max@0 > 1.00 AND cs_net_paid_null_count@4 != row_count@2 AND cs_net_paid_max@3 > 0.00 AND cs_quantity_null_count@6 != row_count@2 AND cs_quantity_max@5 > 0, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_net_paid, cs_net_profit], file_type=parquet, predicate=cs_net_profit@33 > 1.00 AND cs_net_paid@29 > 0.00 AND cs_quantity@18 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=cs_net_profit_null_count@1 != row_count@2 AND cs_net_profit_max@0 > 1.00 AND cs_net_paid_null_count@4 != row_count@2 AND cs_net_paid_max@3 > 0.00 AND cs_quantity_null_count@6 != row_count@2 AND cs_quantity_max@5 > 0, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_net_paid, cs_net_profit], file_type=parquet, predicate=cs_net_profit@33 > 1.00 AND cs_net_paid@29 > 0.00 AND cs_quantity@18 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=cs_net_profit_null_count@1 != row_count@2 AND cs_net_profit_max@0 > 1.00 AND cs_net_paid_null_count@4 != row_count@2 AND cs_net_paid_max@3 > 0.00 AND cs_quantity_null_count@6 != row_count@2 AND cs_quantity_max@5 > 0, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_net_paid, cs_net_profit], file_type=parquet, predicate=cs_net_profit@33 > 1.00 AND cs_net_paid@29 > 0.00 AND cs_quantity@18 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=cs_net_profit_null_count@1 != row_count@2 AND cs_net_profit_max@0 > 1.00 AND cs_net_paid_null_count@4 != row_count@2 AND cs_net_paid_max@3 > 0.00 AND cs_quantity_null_count@6 != row_count@2 AND cs_quantity_max@5 > 0, required_guarantees=[] └────────────────────────────────────────────────── - ┌───── Stage 11 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2001 AND d_moy@2 = 12, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (2001)] - └────────────────────────────────────────────────── - ┌───── Stage 12 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([sr_ticket_number@1, sr_item_sk@0], 12), input_partitions=3 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number, sr_return_quantity, sr_return_amt], file_type=parquet - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number, sr_return_quantity, sr_return_amt], file_type=parquet - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number, sr_return_quantity, sr_return_amt], file_type=parquet - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number, sr_return_quantity, sr_return_amt], file_type=parquet - └────────────────────────────────────────────────── - ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([ss_ticket_number@2, ss_item_sk@1], 12), input_partitions=3 - │ FilterExec: ss_net_profit@5 > Some(100),7,2 AND ss_net_paid@4 > Some(0),7,2 AND ss_quantity@3 > 0, projection=[ss_sold_date_sk@0, ss_item_sk@1, ss_ticket_number@2, ss_quantity@3, ss_net_paid@4] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_net_paid, ss_net_profit], file_type=parquet, predicate=ss_net_profit@22 > Some(100),7,2 AND ss_net_paid@20 > Some(0),7,2 AND ss_quantity@10 > 0 AND DynamicFilter [ empty ], pruning_predicate=ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 > Some(100),7,2 AND ss_net_paid_null_count@4 != row_count@2 AND ss_net_paid_max@3 > Some(0),7,2 AND ss_quantity_null_count@6 != row_count@2 AND ss_quantity_max@5 > 0, required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_net_paid, ss_net_profit], file_type=parquet, predicate=ss_net_profit@22 > Some(100),7,2 AND ss_net_paid@20 > Some(0),7,2 AND ss_quantity@10 > 0 AND DynamicFilter [ empty ], pruning_predicate=ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 > Some(100),7,2 AND ss_net_paid_null_count@4 != row_count@2 AND ss_net_paid_max@3 > Some(0),7,2 AND ss_quantity_null_count@6 != row_count@2 AND ss_quantity_max@5 > 0, required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_net_paid, ss_net_profit], file_type=parquet, predicate=ss_net_profit@22 > Some(100),7,2 AND ss_net_paid@20 > Some(0),7,2 AND ss_quantity@10 > 0 AND DynamicFilter [ empty ], pruning_predicate=ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 > Some(100),7,2 AND ss_net_paid_null_count@4 != row_count@2 AND ss_net_paid_max@3 > Some(0),7,2 AND ss_quantity_null_count@6 != row_count@2 AND ss_quantity_max@5 > 0, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_net_paid, ss_net_profit], file_type=parquet, predicate=ss_net_profit@22 > Some(100),7,2 AND ss_net_paid@20 > Some(0),7,2 AND ss_quantity@10 > 0 AND DynamicFilter [ empty ], pruning_predicate=ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 > Some(100),7,2 AND ss_net_paid_null_count@4 != row_count@2 AND ss_net_paid_max@3 > Some(0),7,2 AND ss_quantity_null_count@6 != row_count@2 AND ss_quantity_max@5 > 0, required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (2001)] └────────────────────────────────────────────────── + ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ FilterExec: cr_return_amount@3 > 10000.00 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_return_quantity, cr_return_amount], file_type=parquet, predicate=cr_return_amount@18 > 10000.00, pruning_predicate=cr_return_amount_null_count@1 != row_count@2 AND cr_return_amount_max@0 > 10000.00, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_return_quantity, cr_return_amount], file_type=parquet, predicate=cr_return_amount@18 > 10000.00, pruning_predicate=cr_return_amount_null_count@1 != row_count@2 AND cr_return_amount_max@0 > 10000.00, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_return_quantity, cr_return_amount], file_type=parquet, predicate=cr_return_amount@18 > 10000.00, pruning_predicate=cr_return_amount_null_count@1 != row_count@2 AND cr_return_amount_max@0 > 10000.00, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_return_quantity, cr_return_amount], file_type=parquet, predicate=cr_return_amount@18 > 10000.00, pruning_predicate=cr_return_amount_null_count@1 != row_count@2 AND cr_return_amount_max@0 > 10000.00, required_guarantees=[] + └────────────────────────────────────────────────── + ┌───── Stage 12 ── Tasks: t0:[p0..p2] t1:[p0..p2] + │ RepartitionExec: partitioning=Hash([ss_item_sk@0], 3), input_partitions=3 + │ AggregateExec: mode=Partial, gby=[ss_item_sk@4 as ss_item_sk], aggr=[sum(CASE WHEN __common_expr_9 IS NOT NULL THEN __common_expr_9 ELSE 0 END) as sum(coalesce(sr.sr_return_quantity,Int64(0))), sum(CASE WHEN __common_expr_10 IS NOT NULL THEN __common_expr_10 ELSE 0 END) as sum(coalesce(sts.ss_quantity,Int64(0))), sum(CASE WHEN __common_expr_11 IS NOT NULL THEN __common_expr_11 ELSE 0.00 END) as sum(coalesce(sr.sr_return_amt,Int64(0))), sum(CASE WHEN __common_expr_12 IS NOT NULL THEN __common_expr_12 ELSE 0.00 END) as sum(coalesce(sts.ss_net_paid,Int64(0)))] + │ ProjectionExec: expr=[CAST(sr_return_quantity@0 AS Int64) as __common_expr_9, CAST(ss_quantity@1 AS Int64) as __common_expr_10, CAST(sr_return_amt@2 AS Decimal128(22, 2)) as __common_expr_11, CAST(ss_net_paid@3 AS Decimal128(22, 2)) as __common_expr_12, ss_item_sk@4 as ss_item_sk] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[sr_return_quantity@5, ss_quantity@3, sr_return_amt@6, ss_net_paid@4, ss_item_sk@2] + │ CoalescePartitionsExec + │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=6, input_tasks=4 + │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(sr_ticket_number@1, ss_ticket_number@2), (sr_item_sk@0, ss_item_sk@1)], projection=[ss_sold_date_sk@4, ss_item_sk@5, ss_quantity@7, ss_net_paid@8, sr_return_quantity@2, sr_return_amt@3] + │ [Stage 10] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 11] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + └────────────────────────────────────────────────── + ┌───── Stage 9 ── Tasks: t0:[p0..p5] t1:[p6..p11] t2:[p12..p17] t3:[p18..p23] + │ BroadcastExec: input_partitions=3, consumer_tasks=2, output_partitions=6 + │ FilterExec: d_year@1 = 2001 AND d_moy@2 = 12, projection=[d_date_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (2001)] + └────────────────────────────────────────────────── + ┌───── Stage 10 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] + │ RepartitionExec: partitioning=Hash([sr_ticket_number@1, sr_item_sk@0], 6), input_partitions=3 + │ FilterExec: sr_return_amt@3 > 10000.00 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number, sr_return_quantity, sr_return_amt], file_type=parquet, predicate=sr_return_amt@11 > 10000.00, pruning_predicate=sr_return_amt_null_count@1 != row_count@2 AND sr_return_amt_max@0 > 10000.00, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number, sr_return_quantity, sr_return_amt], file_type=parquet, predicate=sr_return_amt@11 > 10000.00, pruning_predicate=sr_return_amt_null_count@1 != row_count@2 AND sr_return_amt_max@0 > 10000.00, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number, sr_return_quantity, sr_return_amt], file_type=parquet, predicate=sr_return_amt@11 > 10000.00, pruning_predicate=sr_return_amt_null_count@1 != row_count@2 AND sr_return_amt_max@0 > 10000.00, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number, sr_return_quantity, sr_return_amt], file_type=parquet, predicate=sr_return_amt@11 > 10000.00, pruning_predicate=sr_return_amt_null_count@1 != row_count@2 AND sr_return_amt_max@0 > 10000.00, required_guarantees=[] + └────────────────────────────────────────────────── + ┌───── Stage 11 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] + │ RepartitionExec: partitioning=Hash([ss_ticket_number@2, ss_item_sk@1], 6), input_partitions=3 + │ FilterExec: ss_net_profit@5 > 1.00 AND ss_net_paid@4 > 0.00 AND ss_quantity@3 > 0, projection=[ss_sold_date_sk@0, ss_item_sk@1, ss_ticket_number@2, ss_quantity@3, ss_net_paid@4] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_net_paid, ss_net_profit], file_type=parquet, predicate=ss_net_profit@22 > 1.00 AND ss_net_paid@20 > 0.00 AND ss_quantity@10 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 > 1.00 AND ss_net_paid_null_count@4 != row_count@2 AND ss_net_paid_max@3 > 0.00 AND ss_quantity_null_count@6 != row_count@2 AND ss_quantity_max@5 > 0, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_net_paid, ss_net_profit], file_type=parquet, predicate=ss_net_profit@22 > 1.00 AND ss_net_paid@20 > 0.00 AND ss_quantity@10 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 > 1.00 AND ss_net_paid_null_count@4 != row_count@2 AND ss_net_paid_max@3 > 0.00 AND ss_quantity_null_count@6 != row_count@2 AND ss_quantity_max@5 > 0, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_net_paid, ss_net_profit], file_type=parquet, predicate=ss_net_profit@22 > 1.00 AND ss_net_paid@20 > 0.00 AND ss_quantity@10 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 > 1.00 AND ss_net_paid_null_count@4 != row_count@2 AND ss_net_paid_max@3 > 0.00 AND ss_quantity_null_count@6 != row_count@2 AND ss_quantity_max@5 > 0, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_net_paid, ss_net_profit], file_type=parquet, predicate=ss_net_profit@22 > 1.00 AND ss_net_paid@20 > 0.00 AND ss_quantity@10 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 > 1.00 AND ss_net_paid_null_count@4 != row_count@2 AND ss_net_paid_max@3 > 0.00 AND ss_quantity_null_count@6 != row_count@2 AND ss_quantity_max@5 > 0, required_guarantees=[] + └────────────────────────────────────────────────── "#); Ok(()) } #[tokio::test] async fn test_tpcds_50() -> Result<()> { let display = test_tpcds_query("q50").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [s_store_name@0 ASC NULLS LAST, s_company_id@1 ASC NULLS LAST, s_street_number@2 ASC NULLS LAST, s_street_name@3 ASC NULLS LAST, s_street_type@4 ASC NULLS LAST, s_suite_number@5 ASC NULLS LAST, s_city@6 ASC NULLS LAST, s_county@7 ASC NULLS LAST, s_state@8 ASC NULLS LAST, s_zip@9 ASC NULLS LAST], fetch=100 │ [Stage 7] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -6387,7 +6199,7 @@ mod tests { │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_sold_date_sk@1, sr_returned_date_sk@2, s_store_name@3, s_company_id@4, s_street_number@5, s_street_name@6, s_street_type@7, s_suite_number@8, s_city@9, s_county@10, s_state@11, s_zip@12] │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(s_store_sk@0, ss_store_sk@1)], projection=[ss_sold_date_sk@11, sr_returned_date_sk@13, s_store_name@1, s_company_id@2, s_street_number@3, s_street_name@4, s_street_type@5, s_suite_number@6, s_city@7, s_county@8, s_state@9, s_zip@10] │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 @@ -6398,20 +6210,19 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2001 AND d_moy@2 = 8, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 8, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 8 AND 8 <= d_moy_max@5, required_guarantees=[d_moy in (8), d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 8, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 8 AND 8 <= d_moy_max@5, required_guarantees=[d_moy in (8), d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 8, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 8 AND 8 <= d_moy_max@5, required_guarantees=[d_moy in (8), d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 8, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 8 AND 8 <= d_moy_max@5, required_guarantees=[d_moy in (8), d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 8, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 8 AND 8 <= d_moy_max@5, required_guarantees=[d_moy in (8), d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 8, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 8 AND 8 <= d_moy_max@5, required_guarantees=[d_moy in (8), d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 8, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 8 AND 8 <= d_moy_max@5, required_guarantees=[d_moy in (8), d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 8, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 8 AND 8 <= d_moy_max@5, required_guarantees=[d_moy in (8), d_year in (2001)] └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -6485,12 +6296,11 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_month_seq@2 >= 1200 AND d_month_seq@2 <= 1211, projection=[d_date_sk@0, d_date@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p2] t1:[p0..p2] │ RepartitionExec: partitioning=Hash([ss_item_sk@0], 3), input_partitions=3 @@ -6513,12 +6323,11 @@ mod tests { ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_month_seq@2 >= 1200 AND d_month_seq@2 <= 1211, projection=[d_date_sk@0, d_date@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] └────────────────────────────────────────────────── "#); Ok(()) @@ -6526,7 +6335,7 @@ mod tests { #[tokio::test] async fn test_tpcds_52() -> Result<()> { let display = test_tpcds_query("q52").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [d_year@0 ASC NULLS LAST, ext_price@3 DESC, brand_id@1 ASC NULLS LAST], fetch=100 │ [Stage 4] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -6555,22 +6364,20 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_manager_id@3 = 1, projection=[i_item_sk@0, i_brand_id@1, i_brand@2] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 1, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 1 AND 1 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (1)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 1, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 1 AND 1 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (1)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 1, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 1 AND 1 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (1)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 1, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 1 AND 1 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (1)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 1, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 1 AND 1 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (1)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 1, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 1 AND 1 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (1)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 1, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 1 AND 1 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (1)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 1, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 1 AND 1 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (1)] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_moy@2 = 11 AND d_year@1 = 2000, projection=[d_date_sk@0, d_year@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 2000, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 2000, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 2000, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 2000, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (2000)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 2000, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 2000, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 2000, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 2000, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (2000)] └────────────────────────────────────────────────── "); Ok(()) @@ -6583,7 +6390,7 @@ mod tests { │ SortPreservingMergeExec: [avg_quarterly_sales@2 ASC NULLS LAST, sum_sales@1 ASC NULLS LAST, i_manufact_id@0 ASC NULLS LAST], fetch=100 │ SortExec: TopK(fetch=100), expr=[avg_quarterly_sales@2 ASC NULLS LAST, sum_sales@1 ASC NULLS LAST, i_manufact_id@0 ASC NULLS LAST], preserve_partitioning=[true] │ ProjectionExec: expr=[i_manufact_id@0 as i_manufact_id, sum(store_sales.ss_sales_price)@1 as sum_sales, avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_manufact_id] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING@2 as avg_quarterly_sales] - │ FilterExec: CASE WHEN avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_manufact_id] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING@2 > Some(0),21,6 THEN abs(sum(store_sales.ss_sales_price)@1 - avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_manufact_id] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING@2) / avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_manufact_id] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING@2 END > Some(1000000000),32,10 + │ FilterExec: CASE WHEN avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_manufact_id] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING@2 > 0.000000 THEN abs(sum(store_sales.ss_sales_price)@1 - avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_manufact_id] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING@2) / avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_manufact_id] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING@2 END > 0.1000000000 │ WindowAggExec: wdw=[avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_manufact_id] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING: Ok(Field { name: "avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_manufact_id] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING", data_type: Decimal128(21, 6), nullable: true }), frame: WindowFrame { units: Rows, start_bound: Preceding(UInt64(NULL)), end_bound: Following(UInt64(NULL)), is_causal: false }] │ SortExec: expr=[i_manufact_id@0 ASC NULLS LAST], preserve_partitioning=[true] │ [Stage 5] => NetworkShuffleExec: output_partitions=3, input_tasks=2 @@ -6623,22 +6430,20 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_month_seq@1 IN (SET) ([1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211]), projection=[d_date_sk@0, d_qoy@2] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq, d_qoy], file_type=parquet, predicate=d_month_seq@3 IN (SET) ([1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211]), pruning_predicate=d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1200 AND 1200 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1201 AND 1201 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1202 AND 1202 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1203 AND 1203 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1204 AND 1204 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1205 AND 1205 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1206 AND 1206 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1207 AND 1207 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1208 AND 1208 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1209 AND 1209 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1210 AND 1210 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1211 AND 1211 <= d_month_seq_max@1, required_guarantees=[d_month_seq in (1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq, d_qoy], file_type=parquet, predicate=d_month_seq@3 IN (SET) ([1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211]), pruning_predicate=d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1200 AND 1200 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1201 AND 1201 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1202 AND 1202 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1203 AND 1203 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1204 AND 1204 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1205 AND 1205 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1206 AND 1206 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1207 AND 1207 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1208 AND 1208 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1209 AND 1209 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1210 AND 1210 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1211 AND 1211 <= d_month_seq_max@1, required_guarantees=[d_month_seq in (1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq, d_qoy], file_type=parquet, predicate=d_month_seq@3 IN (SET) ([1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211]), pruning_predicate=d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1200 AND 1200 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1201 AND 1201 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1202 AND 1202 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1203 AND 1203 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1204 AND 1204 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1205 AND 1205 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1206 AND 1206 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1207 AND 1207 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1208 AND 1208 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1209 AND 1209 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1210 AND 1210 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1211 AND 1211 <= d_month_seq_max@1, required_guarantees=[d_month_seq in (1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq, d_qoy], file_type=parquet, predicate=d_month_seq@3 IN (SET) ([1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211]), pruning_predicate=d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1200 AND 1200 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1201 AND 1201 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1202 AND 1202 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1203 AND 1203 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1204 AND 1204 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1205 AND 1205 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1206 AND 1206 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1207 AND 1207 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1208 AND 1208 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1209 AND 1209 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1210 AND 1210 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1211 AND 1211 <= d_month_seq_max@1, required_guarantees=[d_month_seq in (1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq, d_qoy], file_type=parquet, predicate=d_month_seq@3 IN (SET) ([1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211]), pruning_predicate=d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1200 AND 1200 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1201 AND 1201 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1202 AND 1202 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1203 AND 1203 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1204 AND 1204 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1205 AND 1205 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1206 AND 1206 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1207 AND 1207 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1208 AND 1208 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1209 AND 1209 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1210 AND 1210 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1211 AND 1211 <= d_month_seq_max@1, required_guarantees=[d_month_seq in (1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq, d_qoy], file_type=parquet, predicate=d_month_seq@3 IN (SET) ([1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211]), pruning_predicate=d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1200 AND 1200 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1201 AND 1201 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1202 AND 1202 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1203 AND 1203 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1204 AND 1204 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1205 AND 1205 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1206 AND 1206 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1207 AND 1207 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1208 AND 1208 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1209 AND 1209 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1210 AND 1210 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1211 AND 1211 <= d_month_seq_max@1, required_guarantees=[d_month_seq in (1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq, d_qoy], file_type=parquet, predicate=d_month_seq@3 IN (SET) ([1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211]), pruning_predicate=d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1200 AND 1200 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1201 AND 1201 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1202 AND 1202 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1203 AND 1203 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1204 AND 1204 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1205 AND 1205 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1206 AND 1206 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1207 AND 1207 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1208 AND 1208 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1209 AND 1209 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1210 AND 1210 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1211 AND 1211 <= d_month_seq_max@1, required_guarantees=[d_month_seq in (1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq, d_qoy], file_type=parquet, predicate=d_month_seq@3 IN (SET) ([1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211]), pruning_predicate=d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1200 AND 1200 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1201 AND 1201 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1202 AND 1202 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1203 AND 1203 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1204 AND 1204 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1205 AND 1205 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1206 AND 1206 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1207 AND 1207 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1208 AND 1208 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1209 AND 1209 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1210 AND 1210 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1211 AND 1211 <= d_month_seq_max@1, required_guarantees=[d_month_seq in (1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211)] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: (i_category@3 = Books OR i_category@3 = Children OR i_category@3 = Electronics) AND i_class@2 IN (SET) ([personal, portable, reference, self-help]) AND i_brand@1 IN (SET) ([scholaramalgamalg #14, scholaramalgamalg #7, exportiunivamalg #9, scholaramalgamalg #9]) OR (i_category@3 = Women OR i_category@3 = Music OR i_category@3 = Men) AND i_class@2 IN (SET) ([accessories, classical, fragrances, pants]) AND i_brand@1 IN (SET) ([amalgimporto #1, edu packscholar #1, exportiimporto #1, importoamalg #1]), projection=[i_item_sk@0, i_manufact_id@4] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_manufact_id], file_type=parquet, predicate=(i_category@12 = Books OR i_category@12 = Children OR i_category@12 = Electronics) AND i_class@10 IN (SET) ([personal, portable, reference, self-help]) AND i_brand@8 IN (SET) ([scholaramalgamalg #14, scholaramalgamalg #7, exportiunivamalg #9, scholaramalgamalg #9]) OR (i_category@12 = Women OR i_category@12 = Music OR i_category@12 = Men) AND i_class@10 IN (SET) ([accessories, classical, fragrances, pants]) AND i_brand@8 IN (SET) ([amalgimporto #1, edu packscholar #1, exportiimporto #1, importoamalg #1]), pruning_predicate=(i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Children AND Children <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= personal AND personal <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= portable AND portable <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= reference AND reference <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= self-help AND self-help <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #14 AND scholaramalgamalg #14 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #7 AND scholaramalgamalg #7 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiunivamalg #9 AND exportiunivamalg #9 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #9 AND scholaramalgamalg #9 <= i_brand_max@8) OR (i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= accessories AND accessories <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= classical AND classical <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= fragrances AND fragrances <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= pants AND pants <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= amalgimporto #1 AND amalgimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= edu packscholar #1 AND edu packscholar #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiimporto #1 AND exportiimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= importoamalg #1 AND importoamalg #1 <= i_brand_max@8), required_guarantees=[i_brand in (amalgimporto #1, edu packscholar #1, exportiimporto #1, exportiunivamalg #9, importoamalg #1, scholaramalgamalg #14, scholaramalgamalg #7, scholaramalgamalg #9), i_class in (accessories, classical, fragrances, pants, personal, portable, reference, self-help)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_manufact_id], file_type=parquet, predicate=(i_category@12 = Books OR i_category@12 = Children OR i_category@12 = Electronics) AND i_class@10 IN (SET) ([personal, portable, reference, self-help]) AND i_brand@8 IN (SET) ([scholaramalgamalg #14, scholaramalgamalg #7, exportiunivamalg #9, scholaramalgamalg #9]) OR (i_category@12 = Women OR i_category@12 = Music OR i_category@12 = Men) AND i_class@10 IN (SET) ([accessories, classical, fragrances, pants]) AND i_brand@8 IN (SET) ([amalgimporto #1, edu packscholar #1, exportiimporto #1, importoamalg #1]), pruning_predicate=(i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Children AND Children <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= personal AND personal <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= portable AND portable <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= reference AND reference <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= self-help AND self-help <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #14 AND scholaramalgamalg #14 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #7 AND scholaramalgamalg #7 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiunivamalg #9 AND exportiunivamalg #9 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #9 AND scholaramalgamalg #9 <= i_brand_max@8) OR (i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= accessories AND accessories <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= classical AND classical <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= fragrances AND fragrances <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= pants AND pants <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= amalgimporto #1 AND amalgimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= edu packscholar #1 AND edu packscholar #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiimporto #1 AND exportiimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= importoamalg #1 AND importoamalg #1 <= i_brand_max@8), required_guarantees=[i_brand in (amalgimporto #1, edu packscholar #1, exportiimporto #1, exportiunivamalg #9, importoamalg #1, scholaramalgamalg #14, scholaramalgamalg #7, scholaramalgamalg #9), i_class in (accessories, classical, fragrances, pants, personal, portable, reference, self-help)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_manufact_id], file_type=parquet, predicate=(i_category@12 = Books OR i_category@12 = Children OR i_category@12 = Electronics) AND i_class@10 IN (SET) ([personal, portable, reference, self-help]) AND i_brand@8 IN (SET) ([scholaramalgamalg #14, scholaramalgamalg #7, exportiunivamalg #9, scholaramalgamalg #9]) OR (i_category@12 = Women OR i_category@12 = Music OR i_category@12 = Men) AND i_class@10 IN (SET) ([accessories, classical, fragrances, pants]) AND i_brand@8 IN (SET) ([amalgimporto #1, edu packscholar #1, exportiimporto #1, importoamalg #1]), pruning_predicate=(i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Children AND Children <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= personal AND personal <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= portable AND portable <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= reference AND reference <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= self-help AND self-help <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #14 AND scholaramalgamalg #14 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #7 AND scholaramalgamalg #7 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiunivamalg #9 AND exportiunivamalg #9 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #9 AND scholaramalgamalg #9 <= i_brand_max@8) OR (i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= accessories AND accessories <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= classical AND classical <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= fragrances AND fragrances <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= pants AND pants <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= amalgimporto #1 AND amalgimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= edu packscholar #1 AND edu packscholar #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiimporto #1 AND exportiimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= importoamalg #1 AND importoamalg #1 <= i_brand_max@8), required_guarantees=[i_brand in (amalgimporto #1, edu packscholar #1, exportiimporto #1, exportiunivamalg #9, importoamalg #1, scholaramalgamalg #14, scholaramalgamalg #7, scholaramalgamalg #9), i_class in (accessories, classical, fragrances, pants, personal, portable, reference, self-help)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_manufact_id], file_type=parquet, predicate=(i_category@12 = Books OR i_category@12 = Children OR i_category@12 = Electronics) AND i_class@10 IN (SET) ([personal, portable, reference, self-help]) AND i_brand@8 IN (SET) ([scholaramalgamalg #14, scholaramalgamalg #7, exportiunivamalg #9, scholaramalgamalg #9]) OR (i_category@12 = Women OR i_category@12 = Music OR i_category@12 = Men) AND i_class@10 IN (SET) ([accessories, classical, fragrances, pants]) AND i_brand@8 IN (SET) ([amalgimporto #1, edu packscholar #1, exportiimporto #1, importoamalg #1]), pruning_predicate=(i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Children AND Children <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= personal AND personal <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= portable AND portable <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= reference AND reference <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= self-help AND self-help <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #14 AND scholaramalgamalg #14 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #7 AND scholaramalgamalg #7 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiunivamalg #9 AND exportiunivamalg #9 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #9 AND scholaramalgamalg #9 <= i_brand_max@8) OR (i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= accessories AND accessories <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= classical AND classical <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= fragrances AND fragrances <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= pants AND pants <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= amalgimporto #1 AND amalgimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= edu packscholar #1 AND edu packscholar #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiimporto #1 AND exportiimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= importoamalg #1 AND importoamalg #1 <= i_brand_max@8), required_guarantees=[i_brand in (amalgimporto #1, edu packscholar #1, exportiimporto #1, exportiunivamalg #9, importoamalg #1, scholaramalgamalg #14, scholaramalgamalg #7, scholaramalgamalg #9), i_class in (accessories, classical, fragrances, pants, personal, portable, reference, self-help)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_manufact_id], file_type=parquet, predicate=(i_category@12 = Books OR i_category@12 = Children OR i_category@12 = Electronics) AND i_class@10 IN (SET) ([personal, portable, reference, self-help]) AND i_brand@8 IN (SET) ([scholaramalgamalg #14, scholaramalgamalg #7, exportiunivamalg #9, scholaramalgamalg #9]) OR (i_category@12 = Women OR i_category@12 = Music OR i_category@12 = Men) AND i_class@10 IN (SET) ([accessories, classical, fragrances, pants]) AND i_brand@8 IN (SET) ([amalgimporto #1, edu packscholar #1, exportiimporto #1, importoamalg #1]), pruning_predicate=(i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Children AND Children <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= personal AND personal <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= portable AND portable <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= reference AND reference <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= self-help AND self-help <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #14 AND scholaramalgamalg #14 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #7 AND scholaramalgamalg #7 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiunivamalg #9 AND exportiunivamalg #9 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #9 AND scholaramalgamalg #9 <= i_brand_max@8) OR (i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= accessories AND accessories <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= classical AND classical <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= fragrances AND fragrances <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= pants AND pants <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= amalgimporto #1 AND amalgimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= edu packscholar #1 AND edu packscholar #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiimporto #1 AND exportiimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= importoamalg #1 AND importoamalg #1 <= i_brand_max@8), required_guarantees=[i_brand in (amalgimporto #1, edu packscholar #1, exportiimporto #1, exportiunivamalg #9, importoamalg #1, scholaramalgamalg #14, scholaramalgamalg #7, scholaramalgamalg #9), i_class in (accessories, classical, fragrances, pants, personal, portable, reference, self-help)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_manufact_id], file_type=parquet, predicate=(i_category@12 = Books OR i_category@12 = Children OR i_category@12 = Electronics) AND i_class@10 IN (SET) ([personal, portable, reference, self-help]) AND i_brand@8 IN (SET) ([scholaramalgamalg #14, scholaramalgamalg #7, exportiunivamalg #9, scholaramalgamalg #9]) OR (i_category@12 = Women OR i_category@12 = Music OR i_category@12 = Men) AND i_class@10 IN (SET) ([accessories, classical, fragrances, pants]) AND i_brand@8 IN (SET) ([amalgimporto #1, edu packscholar #1, exportiimporto #1, importoamalg #1]), pruning_predicate=(i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Children AND Children <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= personal AND personal <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= portable AND portable <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= reference AND reference <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= self-help AND self-help <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #14 AND scholaramalgamalg #14 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #7 AND scholaramalgamalg #7 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiunivamalg #9 AND exportiunivamalg #9 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #9 AND scholaramalgamalg #9 <= i_brand_max@8) OR (i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= accessories AND accessories <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= classical AND classical <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= fragrances AND fragrances <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= pants AND pants <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= amalgimporto #1 AND amalgimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= edu packscholar #1 AND edu packscholar #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiimporto #1 AND exportiimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= importoamalg #1 AND importoamalg #1 <= i_brand_max@8), required_guarantees=[i_brand in (amalgimporto #1, edu packscholar #1, exportiimporto #1, exportiunivamalg #9, importoamalg #1, scholaramalgamalg #14, scholaramalgamalg #7, scholaramalgamalg #9), i_class in (accessories, classical, fragrances, pants, personal, portable, reference, self-help)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_manufact_id], file_type=parquet, predicate=(i_category@12 = Books OR i_category@12 = Children OR i_category@12 = Electronics) AND i_class@10 IN (SET) ([personal, portable, reference, self-help]) AND i_brand@8 IN (SET) ([scholaramalgamalg #14, scholaramalgamalg #7, exportiunivamalg #9, scholaramalgamalg #9]) OR (i_category@12 = Women OR i_category@12 = Music OR i_category@12 = Men) AND i_class@10 IN (SET) ([accessories, classical, fragrances, pants]) AND i_brand@8 IN (SET) ([amalgimporto #1, edu packscholar #1, exportiimporto #1, importoamalg #1]), pruning_predicate=(i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Children AND Children <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= personal AND personal <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= portable AND portable <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= reference AND reference <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= self-help AND self-help <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #14 AND scholaramalgamalg #14 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #7 AND scholaramalgamalg #7 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiunivamalg #9 AND exportiunivamalg #9 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #9 AND scholaramalgamalg #9 <= i_brand_max@8) OR (i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= accessories AND accessories <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= classical AND classical <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= fragrances AND fragrances <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= pants AND pants <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= amalgimporto #1 AND amalgimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= edu packscholar #1 AND edu packscholar #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiimporto #1 AND exportiimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= importoamalg #1 AND importoamalg #1 <= i_brand_max@8), required_guarantees=[i_brand in (amalgimporto #1, edu packscholar #1, exportiimporto #1, exportiunivamalg #9, importoamalg #1, scholaramalgamalg #14, scholaramalgamalg #7, scholaramalgamalg #9), i_class in (accessories, classical, fragrances, pants, personal, portable, reference, self-help)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_manufact_id], file_type=parquet, predicate=(i_category@12 = Books OR i_category@12 = Children OR i_category@12 = Electronics) AND i_class@10 IN (SET) ([personal, portable, reference, self-help]) AND i_brand@8 IN (SET) ([scholaramalgamalg #14, scholaramalgamalg #7, exportiunivamalg #9, scholaramalgamalg #9]) OR (i_category@12 = Women OR i_category@12 = Music OR i_category@12 = Men) AND i_class@10 IN (SET) ([accessories, classical, fragrances, pants]) AND i_brand@8 IN (SET) ([amalgimporto #1, edu packscholar #1, exportiimporto #1, importoamalg #1]), pruning_predicate=(i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Children AND Children <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= personal AND personal <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= portable AND portable <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= reference AND reference <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= self-help AND self-help <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #14 AND scholaramalgamalg #14 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #7 AND scholaramalgamalg #7 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiunivamalg #9 AND exportiunivamalg #9 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #9 AND scholaramalgamalg #9 <= i_brand_max@8) OR (i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= accessories AND accessories <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= classical AND classical <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= fragrances AND fragrances <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= pants AND pants <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= amalgimporto #1 AND amalgimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= edu packscholar #1 AND edu packscholar #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiimporto #1 AND exportiimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= importoamalg #1 AND importoamalg #1 <= i_brand_max@8), required_guarantees=[i_brand in (amalgimporto #1, edu packscholar #1, exportiimporto #1, exportiunivamalg #9, importoamalg #1, scholaramalgamalg #14, scholaramalgamalg #7, scholaramalgamalg #9), i_class in (accessories, classical, fragrances, pants, personal, portable, reference, self-help)] └────────────────────────────────────────────────── "#); Ok(()) @@ -6646,7 +6451,7 @@ mod tests { #[tokio::test] async fn test_tpcds_54() -> Result<()> { let display = test_tpcds_query("q54").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [segment@0 ASC], fetch=100 │ SortExec: TopK(fetch=100), expr=[segment@0 ASC], preserve_partitioning=[true] @@ -6654,7 +6459,7 @@ mod tests { │ AggregateExec: mode=FinalPartitioned, gby=[segment@0 as segment], aggr=[count(Int64(1))] │ RepartitionExec: partitioning=Hash([segment@0], 3), input_partitions=3 │ AggregateExec: mode=Partial, gby=[segment@0 as segment], aggr=[count(Int64(1))] - │ ProjectionExec: expr=[CAST(round(sum(store_sales.ss_ext_sales_price)@1 / Some(50),20,0) AS Int32) as segment] + │ ProjectionExec: expr=[CAST(round(sum(store_sales.ss_ext_sales_price)@1 / 50) AS Int32) as segment] │ AggregateExec: mode=FinalPartitioned, gby=[c_customer_sk@0 as c_customer_sk], aggr=[sum(store_sales.ss_ext_sales_price)] │ RepartitionExec: partitioning=Hash([c_customer_sk@0], 3), input_partitions=3 │ AggregateExec: mode=Partial, gby=[c_customer_sk@0 as c_customer_sk], aggr=[sum(store_sales.ss_ext_sales_price)] @@ -6677,12 +6482,11 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ss_sold_date_sk@1, d_date_sk@0)], projection=[c_customer_sk@0, ss_ext_sales_price@2, d_month_seq@4] │ CoalescePartitionsExec │ [Stage 10] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -6694,12 +6498,11 @@ mod tests { │ AggregateExec: mode=Partial, gby=[date_dim.d_month_seq + Int64(1)@0 as date_dim.d_month_seq + Int64(1)], aggr=[] │ ProjectionExec: expr=[CAST(d_month_seq@0 AS Int64) + 1 as date_dim.d_month_seq + Int64(1)] │ FilterExec: d_year@1 = 1998 AND d_moy@2 = 12, projection=[d_month_seq@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_month_seq, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (1998)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_month_seq, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (1998)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_month_seq, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (1998)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_month_seq, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (1998)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_month_seq, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (1998)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_month_seq, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (1998)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_month_seq, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (1998)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_month_seq, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (1998)] └────────────────────────────────────────────────── ┌───── Stage 10 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -6708,7 +6511,7 @@ mod tests { │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, c_current_addr_sk@1)], projection=[c_customer_sk@3, ss_sold_date_sk@5, ss_ext_sales_price@6, ca_county@1, ca_state@2] │ CoalescePartitionsExec - │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ss_customer_sk@1)], projection=[c_customer_sk@0, c_current_addr_sk@1, ss_sold_date_sk@2, ss_ext_sales_price@4] │ CoalescePartitionsExec │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=2 @@ -6726,13 +6529,13 @@ mod tests { │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_county, s_state, CAST(s_state@24 AS Utf8View) as CAST(store.s_state AS Utf8View)], file_type=parquet │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_county, s_state, CAST(s_state@24 AS Utf8View) as CAST(store.s_state AS Utf8View)], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 4 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_county, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -6742,22 +6545,21 @@ mod tests { ┌───── Stage 8 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([c_customer_sk@0, c_current_addr_sk@1], 6), input_partitions=3 │ AggregateExec: mode=Partial, gby=[c_customer_sk@0 as c_customer_sk, c_current_addr_sk@1 as c_current_addr_sk], aggr=[] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(customer_sk@0, c_customer_sk@0)], projection=[c_customer_sk@1, c_current_addr_sk@2] + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(customer_sk@0, c_customer_sk@0)] │ CoalescePartitionsExec │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, sold_date_sk@0)], projection=[customer_sk@2] + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_date_sk@0, sold_date_sk@0)], projection=[customer_sk@1] │ CoalescePartitionsExec │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, item_sk@2)], projection=[sold_date_sk@1, customer_sk@2] + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(i_item_sk@0, item_sk@2)], projection=[sold_date_sk@0, customer_sk@1] │ CoalescePartitionsExec │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedUnionExec: t0:[c0(0/2)] t1:[c0(1/2)] t2:[c1(0/2)] t3:[c1(1/2)] @@ -6766,39 +6568,36 @@ mod tests { │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk@0 as sold_date_sk, cs_bill_customer_sk@3 as customer_sk, cs_item_sk@15 as item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk@0 as sold_date_sk, ws_bill_customer_sk@4 as customer_sk, ws_item_sk@3 as item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk@0 as sold_date_sk, ws_bill_customer_sk@4 as customer_sk, ws_item_sk@3 as item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk@0 as sold_date_sk, ws_bill_customer_sk@4 as customer_sk, ws_item_sk@3 as item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_moy@2 = 12 AND d_year@1 = 1998, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 12 AND d_year@6 = 1998, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 12 AND 12 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1998 AND 1998 <= d_year_max@5, required_guarantees=[d_moy in (12), d_year in (1998)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 12 AND d_year@6 = 1998, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 12 AND 12 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1998 AND 1998 <= d_year_max@5, required_guarantees=[d_moy in (12), d_year in (1998)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 12 AND d_year@6 = 1998, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 12 AND 12 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1998 AND 1998 <= d_year_max@5, required_guarantees=[d_moy in (12), d_year in (1998)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 12 AND d_year@6 = 1998, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 12 AND 12 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1998 AND 1998 <= d_year_max@5, required_guarantees=[d_moy in (12), d_year in (1998)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 12 AND d_year@6 = 1998, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 12 AND 12 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1998 AND 1998 <= d_year_max@5, required_guarantees=[d_moy in (12), d_year in (1998)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 12 AND d_year@6 = 1998, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 12 AND 12 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1998 AND 1998 <= d_year_max@5, required_guarantees=[d_moy in (12), d_year in (1998)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 12 AND d_year@6 = 1998, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 12 AND 12 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1998 AND 1998 <= d_year_max@5, required_guarantees=[d_moy in (12), d_year in (1998)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 12 AND d_year@6 = 1998, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 12 AND 12 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1998 AND 1998 <= d_year_max@5, required_guarantees=[d_moy in (12), d_year in (1998)] └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_category@2 = Women AND i_class@1 = maternity, projection=[i_item_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet, predicate=i_category@12 = Women AND i_class@10 = maternity, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 AND i_class_null_count@6 != row_count@3 AND i_class_min@4 <= maternity AND maternity <= i_class_max@5, required_guarantees=[i_category in (Women), i_class in (maternity)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet, predicate=i_category@12 = Women AND i_class@10 = maternity, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 AND i_class_null_count@6 != row_count@3 AND i_class_min@4 <= maternity AND maternity <= i_class_max@5, required_guarantees=[i_category in (Women), i_class in (maternity)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet, predicate=i_category@12 = Women AND i_class@10 = maternity, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 AND i_class_null_count@6 != row_count@3 AND i_class_min@4 <= maternity AND maternity <= i_class_max@5, required_guarantees=[i_category in (Women), i_class in (maternity)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet, predicate=i_category@12 = Women AND i_class@10 = maternity, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 AND i_class_null_count@6 != row_count@3 AND i_class_min@4 <= maternity AND maternity <= i_class_max@5, required_guarantees=[i_category in (Women), i_class in (maternity)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet, predicate=i_category@12 = Women AND i_class@10 = maternity, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 AND i_class_null_count@6 != row_count@3 AND i_class_min@4 <= maternity AND maternity <= i_class_max@5, required_guarantees=[i_category in (Women), i_class in (maternity)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet, predicate=i_category@12 = Women AND i_class@10 = maternity, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 AND i_class_null_count@6 != row_count@3 AND i_class_min@4 <= maternity AND maternity <= i_class_max@5, required_guarantees=[i_category in (Women), i_class in (maternity)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet, predicate=i_category@12 = Women AND i_class@10 = maternity, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 AND i_class_null_count@6 != row_count@3 AND i_class_min@4 <= maternity AND maternity <= i_class_max@5, required_guarantees=[i_category in (Women), i_class in (maternity)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_class, i_category], file_type=parquet, predicate=i_category@12 = Women AND i_class@10 = maternity, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 AND i_class_null_count@6 != row_count@3 AND i_class_min@4 <= maternity AND maternity <= i_class_max@5, required_guarantees=[i_category in (Women), i_class in (maternity)] └────────────────────────────────────────────────── ┌───── Stage 12 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ RepartitionExec: partitioning=Hash([date_dim.d_month_seq + Int64(3)@0], 3), input_partitions=3 │ AggregateExec: mode=Partial, gby=[date_dim.d_month_seq + Int64(3)@0 as date_dim.d_month_seq + Int64(3)], aggr=[] │ ProjectionExec: expr=[CAST(d_month_seq@0 AS Int64) + 3 as date_dim.d_month_seq + Int64(3)] │ FilterExec: d_year@1 = 1998 AND d_moy@2 = 12, projection=[d_month_seq@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_month_seq, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (1998)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_month_seq, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (1998)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_month_seq, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (1998)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_month_seq, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (1998)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_month_seq, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (1998)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_month_seq, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (1998)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_month_seq, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (1998)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_month_seq, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 12, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5, required_guarantees=[d_moy in (12), d_year in (1998)] └────────────────────────────────────────────────── "); Ok(()) @@ -6806,7 +6605,7 @@ mod tests { #[tokio::test] async fn test_tpcds_55() -> Result<()> { let display = test_tpcds_query("q55").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [ext_price@2 DESC, brand_id@0 ASC NULLS LAST], fetch=100 │ [Stage 4] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -6835,22 +6634,20 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_manager_id@3 = 28, projection=[i_item_sk@0, i_brand_id@1, i_brand@2] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 28, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 28 AND 28 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (28)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 28, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 28 AND 28 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (28)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 28, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 28 AND 28 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (28)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 28, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 28 AND 28 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (28)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 28, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 28 AND 28 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (28)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 28, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 28 AND 28 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (28)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 28, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 28 AND 28 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (28)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 28, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 28 AND 28 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (28)] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_moy@2 = 11 AND d_year@1 = 1999, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] └────────────────────────────────────────────────── "); Ok(()) @@ -6858,7 +6655,7 @@ mod tests { #[tokio::test] async fn test_tpcds_56() -> Result<()> { let display = test_tpcds_query("q56").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [total_sales@1 ASC, i_item_id@0 ASC], fetch=100 │ [Stage 16] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -6886,7 +6683,7 @@ mod tests { │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@0)], projection=[ss_ext_sales_price@3, i_item_id@1] │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, ss_addr_sk@1)], projection=[ss_item_sk@1, ss_ext_sales_price@3] │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -6902,40 +6699,37 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_color@1 = slate OR i_color@1 = blanched OR i_color@1 = burnished, projection=[i_item_id@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_color], file_type=parquet, predicate=i_color@17 = slate OR i_color@17 = blanched OR i_color@17 = burnished, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= slate AND slate <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= blanched AND blanched <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burnished AND burnished <= i_color_max@1, required_guarantees=[i_color in (blanched, burnished, slate)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_color], file_type=parquet, predicate=i_color@17 = slate OR i_color@17 = blanched OR i_color@17 = burnished, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= slate AND slate <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= blanched AND blanched <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burnished AND burnished <= i_color_max@1, required_guarantees=[i_color in (blanched, burnished, slate)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_color], file_type=parquet, predicate=i_color@17 = slate OR i_color@17 = blanched OR i_color@17 = burnished, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= slate AND slate <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= blanched AND blanched <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burnished AND burnished <= i_color_max@1, required_guarantees=[i_color in (blanched, burnished, slate)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_id, i_color], file_type=parquet, predicate=i_color@17 = slate OR i_color@17 = blanched OR i_color@17 = burnished, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= slate AND slate <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= blanched AND blanched <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burnished AND burnished <= i_color_max@1, required_guarantees=[i_color in (blanched, burnished, slate)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_color], file_type=parquet, predicate=i_color@17 = slate OR i_color@17 = blanched OR i_color@17 = burnished, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= slate AND slate <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= blanched AND blanched <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burnished AND burnished <= i_color_max@1, required_guarantees=[i_color in (blanched, burnished, slate)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_color], file_type=parquet, predicate=i_color@17 = slate OR i_color@17 = blanched OR i_color@17 = burnished, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= slate AND slate <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= blanched AND blanched <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burnished AND burnished <= i_color_max@1, required_guarantees=[i_color in (blanched, burnished, slate)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_id, i_color], file_type=parquet, predicate=i_color@17 = slate OR i_color@17 = blanched OR i_color@17 = burnished, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= slate AND slate <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= blanched AND blanched <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burnished AND burnished <= i_color_max@1, required_guarantees=[i_color in (blanched, burnished, slate)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_id, i_color], file_type=parquet, predicate=i_color@17 = slate OR i_color@17 = blanched OR i_color@17 = burnished, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= slate AND slate <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= blanched AND blanched <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burnished AND burnished <= i_color_max@1, required_guarantees=[i_color in (blanched, burnished, slate)] └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: ca_gmt_offset@1 = Some(-500),5,2, projection=[ca_address_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] + │ FilterExec: ca_gmt_offset@1 = -5.00, projection=[ca_address_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2001 AND d_moy@2 = 2, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] └────────────────────────────────────────────────── ┌───── Stage 10 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([i_item_id@0], 6), input_partitions=3 @@ -6946,22 +6740,20 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(cs_item_sk@0, i_item_sk@0)], projection=[cs_ext_sales_price@1, i_item_id@3] │ CoalescePartitionsExec │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_color@1 = slate OR i_color@1 = blanched OR i_color@1 = burnished, projection=[i_item_id@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_color], file_type=parquet, predicate=i_color@17 = slate OR i_color@17 = blanched OR i_color@17 = burnished, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= slate AND slate <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= blanched AND blanched <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burnished AND burnished <= i_color_max@1, required_guarantees=[i_color in (blanched, burnished, slate)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_color], file_type=parquet, predicate=i_color@17 = slate OR i_color@17 = blanched OR i_color@17 = burnished, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= slate AND slate <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= blanched AND blanched <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burnished AND burnished <= i_color_max@1, required_guarantees=[i_color in (blanched, burnished, slate)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_color], file_type=parquet, predicate=i_color@17 = slate OR i_color@17 = blanched OR i_color@17 = burnished, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= slate AND slate <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= blanched AND blanched <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burnished AND burnished <= i_color_max@1, required_guarantees=[i_color in (blanched, burnished, slate)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_id, i_color], file_type=parquet, predicate=i_color@17 = slate OR i_color@17 = blanched OR i_color@17 = burnished, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= slate AND slate <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= blanched AND blanched <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burnished AND burnished <= i_color_max@1, required_guarantees=[i_color in (blanched, burnished, slate)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_color], file_type=parquet, predicate=i_color@17 = slate OR i_color@17 = blanched OR i_color@17 = burnished, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= slate AND slate <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= blanched AND blanched <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burnished AND burnished <= i_color_max@1, required_guarantees=[i_color in (blanched, burnished, slate)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_color], file_type=parquet, predicate=i_color@17 = slate OR i_color@17 = blanched OR i_color@17 = burnished, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= slate AND slate <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= blanched AND blanched <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burnished AND burnished <= i_color_max@1, required_guarantees=[i_color in (blanched, burnished, slate)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_id, i_color], file_type=parquet, predicate=i_color@17 = slate OR i_color@17 = blanched OR i_color@17 = burnished, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= slate AND slate <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= blanched AND blanched <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burnished AND burnished <= i_color_max@1, required_guarantees=[i_color in (blanched, burnished, slate)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_id, i_color], file_type=parquet, predicate=i_color@17 = slate OR i_color@17 = blanched OR i_color@17 = burnished, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= slate AND slate <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= blanched AND blanched <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burnished AND burnished <= i_color_max@1, required_guarantees=[i_color in (blanched, burnished, slate)] └────────────────────────────────────────────────── ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -6979,23 +6771,21 @@ mod tests { └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: ca_gmt_offset@1 = Some(-500),5,2, projection=[ca_address_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] + │ FilterExec: ca_gmt_offset@1 = -5.00, projection=[ca_address_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2001 AND d_moy@2 = 2, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] └────────────────────────────────────────────────── ┌───── Stage 15 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([i_item_id@0], 6), input_partitions=3 @@ -7006,22 +6796,20 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ws_item_sk@0, i_item_sk@0)], projection=[ws_ext_sales_price@1, i_item_id@3] │ CoalescePartitionsExec │ [Stage 14] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 11 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_color@1 = slate OR i_color@1 = blanched OR i_color@1 = burnished, projection=[i_item_id@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_color], file_type=parquet, predicate=i_color@17 = slate OR i_color@17 = blanched OR i_color@17 = burnished, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= slate AND slate <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= blanched AND blanched <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burnished AND burnished <= i_color_max@1, required_guarantees=[i_color in (blanched, burnished, slate)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_color], file_type=parquet, predicate=i_color@17 = slate OR i_color@17 = blanched OR i_color@17 = burnished, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= slate AND slate <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= blanched AND blanched <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burnished AND burnished <= i_color_max@1, required_guarantees=[i_color in (blanched, burnished, slate)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_color], file_type=parquet, predicate=i_color@17 = slate OR i_color@17 = blanched OR i_color@17 = burnished, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= slate AND slate <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= blanched AND blanched <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burnished AND burnished <= i_color_max@1, required_guarantees=[i_color in (blanched, burnished, slate)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_id, i_color], file_type=parquet, predicate=i_color@17 = slate OR i_color@17 = blanched OR i_color@17 = burnished, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= slate AND slate <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= blanched AND blanched <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burnished AND burnished <= i_color_max@1, required_guarantees=[i_color in (blanched, burnished, slate)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_color], file_type=parquet, predicate=i_color@17 = slate OR i_color@17 = blanched OR i_color@17 = burnished, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= slate AND slate <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= blanched AND blanched <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burnished AND burnished <= i_color_max@1, required_guarantees=[i_color in (blanched, burnished, slate)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_color], file_type=parquet, predicate=i_color@17 = slate OR i_color@17 = blanched OR i_color@17 = burnished, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= slate AND slate <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= blanched AND blanched <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burnished AND burnished <= i_color_max@1, required_guarantees=[i_color in (blanched, burnished, slate)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_id, i_color], file_type=parquet, predicate=i_color@17 = slate OR i_color@17 = blanched OR i_color@17 = burnished, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= slate AND slate <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= blanched AND blanched <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burnished AND burnished <= i_color_max@1, required_guarantees=[i_color in (blanched, burnished, slate)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_id, i_color], file_type=parquet, predicate=i_color@17 = slate OR i_color@17 = blanched OR i_color@17 = burnished, pruning_predicate=i_color_null_count@2 != row_count@3 AND i_color_min@0 <= slate AND slate <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= blanched AND blanched <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burnished AND burnished <= i_color_max@1, required_guarantees=[i_color in (blanched, burnished, slate)] └────────────────────────────────────────────────── ┌───── Stage 14 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -7039,23 +6827,21 @@ mod tests { └────────────────────────────────────────────────── ┌───── Stage 12 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: ca_gmt_offset@1 = Some(-500),5,2, projection=[ca_address_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] + │ FilterExec: ca_gmt_offset@1 = -5.00, projection=[ca_address_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] └────────────────────────────────────────────────── ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2001 AND d_moy@2 = 2, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 = 2, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 2 AND 2 <= d_moy_max@5, required_guarantees=[d_moy in (2), d_year in (2001)] └────────────────────────────────────────────────── "); Ok(()) @@ -7068,26 +6854,27 @@ mod tests { │ SortPreservingMergeExec: [sum_sales@6 - avg_monthly_sales@5 ASC, i_category@0 ASC NULLS LAST, i_brand@1 ASC NULLS LAST, cc_name@2 ASC NULLS LAST, d_year@3 ASC NULLS LAST, d_moy@4 ASC NULLS LAST, psum@7 ASC NULLS LAST, nsum@8 ASC NULLS LAST], fetch=100 │ SortExec: TopK(fetch=100), expr=[sum_sales@6 - avg_monthly_sales@5 ASC, i_category@0 ASC NULLS LAST, i_brand@1 ASC NULLS LAST, cc_name@2 ASC NULLS LAST, d_moy@4 ASC NULLS LAST, psum@7 ASC NULLS LAST, nsum@8 ASC NULLS LAST], preserve_partitioning=[true] │ ProjectionExec: expr=[i_category@0 as i_category, i_brand@1 as i_brand, cc_name@2 as cc_name, d_year@3 as d_year, d_moy@4 as d_moy, avg_monthly_sales@5 as avg_monthly_sales, sum_sales@6 as sum_sales, sum_sales@7 as psum, sum_sales@8 as nsum] - │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(i_category@0, i_category@0), (i_brand@1, i_brand@1), (cc_name@2, cc_name@2), (CAST(v1.rn AS Decimal128(21, 0))@9, v1_lead.rn - Decimal128(Some(1),20,0)@5)], projection=[i_category@0, i_brand@1, cc_name@2, d_year@3, d_moy@4, avg_monthly_sales@6, sum_sales@5, sum_sales@8, sum_sales@13] + │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(i_category@0, i_category@0), (i_brand@1, i_brand@1), (cc_name@2, cc_name@2), (CAST(v1.rn AS Decimal128(21, 0))@9, v1_lead.rn - Decimal128(1,20,0)@5)], projection=[i_category@0, i_brand@1, cc_name@2, d_year@3, d_moy@4, avg_monthly_sales@6, sum_sales@5, sum_sales@8, sum_sales@13] │ RepartitionExec: partitioning=Hash([i_category@0, i_brand@1, cc_name@2, CAST(v1.rn AS Decimal128(21, 0))@9], 3), input_partitions=3 │ ProjectionExec: expr=[i_category@0 as i_category, i_brand@1 as i_brand, cc_name@2 as cc_name, d_year@3 as d_year, d_moy@4 as d_moy, sum_sales@5 as sum_sales, avg_monthly_sales@6 as avg_monthly_sales, rn@7 as rn, sum_sales@8 as sum_sales, CAST(rn@7 AS Decimal128(21, 0)) as CAST(v1.rn AS Decimal128(21, 0))] - │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(i_category@0, i_category@0), (i_brand@1, i_brand@1), (cc_name@2, cc_name@2), (CAST(v1.rn AS Decimal128(21, 0))@8, v1_lag.rn + Decimal128(Some(1),20,0)@5)], projection=[i_category@0, i_brand@1, cc_name@2, d_year@3, d_moy@4, sum_sales@5, avg_monthly_sales@6, rn@7, sum_sales@12] + │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(i_category@0, i_category@0), (i_brand@1, i_brand@1), (cc_name@2, cc_name@2), (CAST(v1.rn AS Decimal128(21, 0))@8, v1_lag.rn + Decimal128(1,20,0)@5)], projection=[i_category@0, i_brand@1, cc_name@2, d_year@3, d_moy@4, sum_sales@5, avg_monthly_sales@6, rn@7, sum_sales@12] │ RepartitionExec: partitioning=Hash([i_category@0, i_brand@1, cc_name@2, CAST(v1.rn AS Decimal128(21, 0))@8], 3), input_partitions=3 │ ProjectionExec: expr=[i_category@0 as i_category, i_brand@1 as i_brand, cc_name@2 as cc_name, d_year@3 as d_year, d_moy@4 as d_moy, sum(catalog_sales.cs_sales_price)@5 as sum_sales, avg(sum(catalog_sales.cs_sales_price)) PARTITION BY [item.i_category, item.i_brand, call_center.cc_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@6 as avg_monthly_sales, rank() PARTITION BY [item.i_category, item.i_brand, call_center.cc_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@7 as rn, CAST(rank() PARTITION BY [item.i_category, item.i_brand, call_center.cc_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@7 AS Decimal128(21, 0)) as CAST(v1.rn AS Decimal128(21, 0))] - │ FilterExec: d_year@3 = 1999 AND avg(sum(catalog_sales.cs_sales_price)) PARTITION BY [item.i_category, item.i_brand, call_center.cc_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@6 > Some(0),21,6 AND CASE WHEN avg(sum(catalog_sales.cs_sales_price)) PARTITION BY [item.i_category, item.i_brand, call_center.cc_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@6 > Some(0),21,6 THEN abs(sum(catalog_sales.cs_sales_price)@5 - avg(sum(catalog_sales.cs_sales_price)) PARTITION BY [item.i_category, item.i_brand, call_center.cc_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@6) / avg(sum(catalog_sales.cs_sales_price)) PARTITION BY [item.i_category, item.i_brand, call_center.cc_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@6 END > Some(1000000000),32,10 - │ BoundedWindowAggExec: wdw=[rank() PARTITION BY [item.i_category, item.i_brand, call_center.cc_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW: Field { "rank() PARTITION BY [item.i_category, item.i_brand, call_center.cc_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW": UInt64 }, frame: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW], mode=[Sorted] - │ SortExec: expr=[i_category@0 ASC NULLS LAST, i_brand@1 ASC NULLS LAST, cc_name@2 ASC NULLS LAST, d_year@3 ASC NULLS LAST, d_moy@4 ASC NULLS LAST], preserve_partitioning=[true] - │ RepartitionExec: partitioning=Hash([i_category@0, i_brand@1, cc_name@2], 3), input_partitions=3 - │ BoundedWindowAggExec: wdw=[avg(sum(catalog_sales.cs_sales_price)) PARTITION BY [item.i_category, item.i_brand, call_center.cc_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW: Field { "avg(sum(catalog_sales.cs_sales_price)) PARTITION BY [item.i_category, item.i_brand, call_center.cc_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW": nullable Decimal128(21, 6) }, frame: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW], mode=[Sorted] - │ SortExec: expr=[i_category@0 ASC NULLS LAST, i_brand@1 ASC NULLS LAST, cc_name@2 ASC NULLS LAST, d_year@3 ASC NULLS LAST, d_moy@4 ASC NULLS LAST], preserve_partitioning=[true] - │ [Stage 5] => NetworkShuffleExec: output_partitions=3, input_tasks=2 - │ RepartitionExec: partitioning=Hash([i_category@0, i_brand@1, cc_name@2, v1_lag.rn + Decimal128(Some(1),20,0)@5], 3), input_partitions=3 - │ ProjectionExec: expr=[i_category@0 as i_category, i_brand@1 as i_brand, cc_name@2 as cc_name, sum(catalog_sales.cs_sales_price)@5 as sum_sales, rank() PARTITION BY [item.i_category, item.i_brand, call_center.cc_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@6 as rn, CAST(rank() PARTITION BY [item.i_category, item.i_brand, call_center.cc_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@6 AS Decimal128(20, 0)) + Some(1),20,0 as v1_lag.rn + Decimal128(Some(1),20,0)] + │ FilterExec: __common_expr_3@0 AND d_year@4 = 1999 AND CASE WHEN __common_expr_3@0 THEN abs(sum(catalog_sales.cs_sales_price)@6 - avg(sum(catalog_sales.cs_sales_price)) PARTITION BY [item.i_category, item.i_brand, call_center.cc_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@7) / avg(sum(catalog_sales.cs_sales_price)) PARTITION BY [item.i_category, item.i_brand, call_center.cc_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@7 END > 0.1000000000, projection=[i_category@1, i_brand@2, cc_name@3, d_year@4, d_moy@5, sum(catalog_sales.cs_sales_price)@6, avg(sum(catalog_sales.cs_sales_price)) PARTITION BY [item.i_category, item.i_brand, call_center.cc_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@7, rank() PARTITION BY [item.i_category, item.i_brand, call_center.cc_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@8] + │ ProjectionExec: expr=[avg(sum(catalog_sales.cs_sales_price)) PARTITION BY [item.i_category, item.i_brand, call_center.cc_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@6 > 0.000000 as __common_expr_3, i_category@0 as i_category, i_brand@1 as i_brand, cc_name@2 as cc_name, d_year@3 as d_year, d_moy@4 as d_moy, sum(catalog_sales.cs_sales_price)@5 as sum(catalog_sales.cs_sales_price), avg(sum(catalog_sales.cs_sales_price)) PARTITION BY [item.i_category, item.i_brand, call_center.cc_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@6 as avg(sum(catalog_sales.cs_sales_price)) PARTITION BY [item.i_category, item.i_brand, call_center.cc_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW, rank() PARTITION BY [item.i_category, item.i_brand, call_center.cc_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@7 as rank() PARTITION BY [item.i_category, item.i_brand, call_center.cc_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW] + │ BoundedWindowAggExec: wdw=[rank() PARTITION BY [item.i_category, item.i_brand, call_center.cc_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW: Field { "rank() PARTITION BY [item.i_category, item.i_brand, call_center.cc_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW": UInt64 }, frame: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW], mode=[Sorted] + │ SortExec: expr=[i_category@0 ASC NULLS LAST, i_brand@1 ASC NULLS LAST, cc_name@2 ASC NULLS LAST, d_year@3 ASC NULLS LAST, d_moy@4 ASC NULLS LAST], preserve_partitioning=[true] + │ RepartitionExec: partitioning=Hash([i_category@0, i_brand@1, cc_name@2], 3), input_partitions=3 + │ BoundedWindowAggExec: wdw=[avg(sum(catalog_sales.cs_sales_price)) PARTITION BY [item.i_category, item.i_brand, call_center.cc_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW: Field { "avg(sum(catalog_sales.cs_sales_price)) PARTITION BY [item.i_category, item.i_brand, call_center.cc_name, date_dim.d_year] ORDER BY [date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW": nullable Decimal128(21, 6) }, frame: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW], mode=[Sorted] + │ SortExec: expr=[i_category@0 ASC NULLS LAST, i_brand@1 ASC NULLS LAST, cc_name@2 ASC NULLS LAST, d_year@3 ASC NULLS LAST, d_moy@4 ASC NULLS LAST], preserve_partitioning=[true] + │ [Stage 5] => NetworkShuffleExec: output_partitions=3, input_tasks=2 + │ RepartitionExec: partitioning=Hash([i_category@0, i_brand@1, cc_name@2, v1_lag.rn + Decimal128(1,20,0)@5], 3), input_partitions=3 + │ ProjectionExec: expr=[i_category@0 as i_category, i_brand@1 as i_brand, cc_name@2 as cc_name, sum(catalog_sales.cs_sales_price)@5 as sum_sales, rank() PARTITION BY [item.i_category, item.i_brand, call_center.cc_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@6 as rn, CAST(rank() PARTITION BY [item.i_category, item.i_brand, call_center.cc_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@6 AS Decimal128(20, 0)) + 1 as v1_lag.rn + Decimal128(1,20,0)] │ BoundedWindowAggExec: wdw=[rank() PARTITION BY [item.i_category, item.i_brand, call_center.cc_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW: Field { "rank() PARTITION BY [item.i_category, item.i_brand, call_center.cc_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW": UInt64 }, frame: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW], mode=[Sorted] │ SortExec: expr=[i_category@0 ASC NULLS LAST, i_brand@1 ASC NULLS LAST, cc_name@2 ASC NULLS LAST, d_year@3 ASC NULLS LAST, d_moy@4 ASC NULLS LAST], preserve_partitioning=[true] │ [Stage 10] => NetworkShuffleExec: output_partitions=3, input_tasks=2 - │ RepartitionExec: partitioning=Hash([i_category@0, i_brand@1, cc_name@2, v1_lead.rn - Decimal128(Some(1),20,0)@5], 3), input_partitions=3 - │ ProjectionExec: expr=[i_category@0 as i_category, i_brand@1 as i_brand, cc_name@2 as cc_name, sum(catalog_sales.cs_sales_price)@5 as sum_sales, rank() PARTITION BY [item.i_category, item.i_brand, call_center.cc_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@6 as rn, CAST(rank() PARTITION BY [item.i_category, item.i_brand, call_center.cc_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@6 AS Decimal128(20, 0)) - Some(1),20,0 as v1_lead.rn - Decimal128(Some(1),20,0)] + │ RepartitionExec: partitioning=Hash([i_category@0, i_brand@1, cc_name@2, v1_lead.rn - Decimal128(1,20,0)@5], 3), input_partitions=3 + │ ProjectionExec: expr=[i_category@0 as i_category, i_brand@1 as i_brand, cc_name@2 as cc_name, sum(catalog_sales.cs_sales_price)@5 as sum_sales, rank() PARTITION BY [item.i_category, item.i_brand, call_center.cc_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@6 as rn, CAST(rank() PARTITION BY [item.i_category, item.i_brand, call_center.cc_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW@6 AS Decimal128(20, 0)) - 1 as v1_lead.rn - Decimal128(1,20,0)] │ BoundedWindowAggExec: wdw=[rank() PARTITION BY [item.i_category, item.i_brand, call_center.cc_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW: Field { "rank() PARTITION BY [item.i_category, item.i_brand, call_center.cc_name] ORDER BY [date_dim.d_year ASC NULLS LAST, date_dim.d_moy ASC NULLS LAST] RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW": UInt64 }, frame: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW], mode=[Sorted] │ SortExec: expr=[i_category@0 ASC NULLS LAST, i_brand@1 ASC NULLS LAST, cc_name@2 ASC NULLS LAST, d_year@3 ASC NULLS LAST, d_moy@4 ASC NULLS LAST], preserve_partitioning=[true] │ [Stage 15] => NetworkShuffleExec: output_partitions=3, input_tasks=2 @@ -7108,7 +6895,7 @@ mod tests { │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, cs_item_sk@2)], projection=[i_brand@1, i_category@2, cs_sold_date_sk@3, cs_call_center_sk@4, cs_sales_price@6] │ CoalescePartitionsExec - │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] @@ -7126,20 +6913,19 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 1999 OR d_year@1 = 1998 AND d_moy@2 = 12 OR d_year@1 = 2000 AND d_moy@2 = 1 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] └────────────────────────────────────────────────── - ┌───── Stage 3 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 10 ── Tasks: t0:[p0..p2] t1:[p0..p2] │ RepartitionExec: partitioning=Hash([i_category@0, i_brand@1, cc_name@2], 3), input_partitions=3 @@ -7157,7 +6943,7 @@ mod tests { │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, cs_item_sk@2)], projection=[i_brand@1, i_category@2, cs_sold_date_sk@3, cs_call_center_sk@4, cs_sales_price@6] │ CoalescePartitionsExec - │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] @@ -7175,20 +6961,19 @@ mod tests { ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 1999 OR d_year@1 = 1998 AND d_moy@2 = 12 OR d_year@1 = 2000 AND d_moy@2 = 1 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] └────────────────────────────────────────────────── - ┌───── Stage 8 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 15 ── Tasks: t0:[p0..p2] t1:[p0..p2] │ RepartitionExec: partitioning=Hash([i_category@0, i_brand@1, cc_name@2], 3), input_partitions=3 @@ -7206,7 +6991,7 @@ mod tests { │ [Stage 12] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, cs_item_sk@2)], projection=[i_brand@1, i_category@2, cs_sold_date_sk@3, cs_call_center_sk@4, cs_sales_price@6] │ CoalescePartitionsExec - │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] @@ -7224,20 +7009,19 @@ mod tests { ┌───── Stage 12 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 1999 OR d_year@1 = 1998 AND d_moy@2 = 12 OR d_year@1 = 2000 AND d_moy@2 = 1 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999 OR d_year@6 = 1998 AND d_moy@8 = 12 OR d_year@6 = 2000 AND d_moy@8 = 1, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 12 AND 12 <= d_moy_max@5 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 1 AND 1 <= d_moy_max@5, required_guarantees=[d_year in (1998, 1999, 2000)] └────────────────────────────────────────────────── - ┌───── Stage 13 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand, i_category], file_type=parquet └────────────────────────────────────────────────── "#); Ok(()) @@ -7245,15 +7029,15 @@ mod tests { #[tokio::test] async fn test_tpcds_58() -> Result<()> { let display = test_tpcds_query("q58").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [item_id@0 ASC], fetch=100 │ [Stage 18] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 └────────────────────────────────────────────────── ┌───── Stage 18 ── Tasks: t0:[p0..p2] t1:[p0..p2] │ SortExec: TopK(fetch=100), expr=[item_id@0 ASC], preserve_partitioning=[true] - │ ProjectionExec: expr=[item_id@1 as item_id, ss_item_rev@2 as ss_item_rev, ss_item_rev@2 / __common_expr_7@0 * Some(100),20,0 as ss_dev, cs_item_rev@3 as cs_item_rev, cs_item_rev@3 / __common_expr_7@0 * Some(100),20,0 as cs_dev, ws_item_rev@4 as ws_item_rev, ws_item_rev@4 / __common_expr_7@0 * Some(100),20,0 as ws_dev, __common_expr_7@0 as average] - │ ProjectionExec: expr=[(ss_item_rev@0 + cs_item_rev@1 + ws_item_rev@2) / Some(3),20,0 as __common_expr_7, item_id@3 as item_id, ss_item_rev@0 as ss_item_rev, cs_item_rev@1 as cs_item_rev, ws_item_rev@2 as ws_item_rev] + │ ProjectionExec: expr=[item_id@1 as item_id, ss_item_rev@2 as ss_item_rev, ss_item_rev@2 / __common_expr_7@0 * 100 as ss_dev, cs_item_rev@3 as cs_item_rev, cs_item_rev@3 / __common_expr_7@0 * 100 as cs_dev, ws_item_rev@4 as ws_item_rev, ws_item_rev@4 / __common_expr_7@0 * 100 as ws_dev, __common_expr_7@0 as average] + │ ProjectionExec: expr=[(ss_item_rev@0 + cs_item_rev@1 + ws_item_rev@2) / 3 as __common_expr_7, item_id@3 as item_id, ss_item_rev@0 as ss_item_rev, cs_item_rev@1 as cs_item_rev, ws_item_rev@2 as ws_item_rev] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(item_id@0, item_id@0)], filter=CAST(ss_item_rev@0 AS Decimal128(30, 15)) >= CAST(0.9 * CAST(ws_item_rev@2 AS Float64) AS Decimal128(30, 15)) AND CAST(ss_item_rev@0 AS Decimal128(30, 15)) <= CAST(1.1 * CAST(ws_item_rev@2 AS Float64) AS Decimal128(30, 15)) AND CAST(cs_item_rev@1 AS Decimal128(30, 15)) >= CAST(0.9 * CAST(ws_item_rev@2 AS Float64) AS Decimal128(30, 15)) AND CAST(cs_item_rev@1 AS Decimal128(30, 15)) <= CAST(1.1 * CAST(ws_item_rev@2 AS Float64) AS Decimal128(30, 15)) AND CAST(ws_item_rev@2 AS Decimal128(30, 15)) >= CAST(0.9 * CAST(ss_item_rev@0 AS Float64) AS Decimal128(30, 15)) AND CAST(ws_item_rev@2 AS Decimal128(30, 15)) <= CAST(1.1 * CAST(ss_item_rev@0 AS Float64) AS Decimal128(30, 15)) AND CAST(ws_item_rev@2 AS Decimal128(30, 15)) >= CAST(0.9 * CAST(cs_item_rev@1 AS Float64) AS Decimal128(30, 15)) AND CAST(ws_item_rev@2 AS Decimal128(30, 15)) <= CAST(1.1 * CAST(cs_item_rev@1 AS Float64) AS Decimal128(30, 15)), projection=[ss_item_rev@3, cs_item_rev@4, ws_item_rev@1, item_id@2] │ CoalescePartitionsExec │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=6, input_tasks=2 @@ -7278,10 +7062,10 @@ mod tests { │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[ws_ext_sales_price@3, i_item_id@4, d_date@1] │ CoalescePartitionsExec - │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ws_item_sk@1)], projection=[ws_sold_date_sk@2, ws_ext_sales_price@4, i_item_id@1] │ CoalescePartitionsExec - │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] @@ -7290,41 +7074,39 @@ mod tests { └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_week_seq@0, d_week_seq@1)], projection=[d_date@1] + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_week_seq@0, d_week_seq@1)], projection=[d_date@0] │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_date@0 = 2000-01-03, projection=[d_week_seq@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-01-03, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-01-03 AND 2000-01-03 <= d_date_max@1, required_guarantees=[d_date in (2000-01-03)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-01-03, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-01-03 AND 2000-01-03 <= d_date_max@1, required_guarantees=[d_date in (2000-01-03)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-01-03, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-01-03 AND 2000-01-03 <= d_date_max@1, required_guarantees=[d_date in (2000-01-03)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-01-03, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-01-03 AND 2000-01-03 <= d_date_max@1, required_guarantees=[d_date in (2000-01-03)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-01-03, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-01-03 AND 2000-01-03 <= d_date_max@1, required_guarantees=[d_date in (2000-01-03)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-01-03, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-01-03 AND 2000-01-03 <= d_date_max@1, required_guarantees=[d_date in (2000-01-03)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-01-03, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-01-03 AND 2000-01-03 <= d_date_max@1, required_guarantees=[d_date in (2000-01-03)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-01-03, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-01-03 AND 2000-01-03 <= d_date_max@1, required_guarantees=[d_date in (2000-01-03)] └────────────────────────────────────────────────── - ┌───── Stage 3 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 4 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 12 ── Tasks: t0:[p0..p5] t1:[p6..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=2, output_partitions=6 @@ -7340,10 +7122,10 @@ mod tests { │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_ext_sales_price@3, i_item_id@4, d_date@1] │ CoalescePartitionsExec - │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, cs_item_sk@1)], projection=[cs_sold_date_sk@2, cs_ext_sales_price@4, i_item_id@1] │ CoalescePartitionsExec - │ [Stage 10] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 10] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] @@ -7352,41 +7134,39 @@ mod tests { └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_week_seq@0, d_week_seq@1)], projection=[d_date@1] + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_week_seq@0, d_week_seq@1)], projection=[d_date@0] │ CoalescePartitionsExec │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_date@0 = 2000-01-03, projection=[d_week_seq@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-01-03, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-01-03 AND 2000-01-03 <= d_date_max@1, required_guarantees=[d_date in (2000-01-03)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-01-03, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-01-03 AND 2000-01-03 <= d_date_max@1, required_guarantees=[d_date in (2000-01-03)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-01-03, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-01-03 AND 2000-01-03 <= d_date_max@1, required_guarantees=[d_date in (2000-01-03)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-01-03, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-01-03 AND 2000-01-03 <= d_date_max@1, required_guarantees=[d_date in (2000-01-03)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-01-03, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-01-03 AND 2000-01-03 <= d_date_max@1, required_guarantees=[d_date in (2000-01-03)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-01-03, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-01-03 AND 2000-01-03 <= d_date_max@1, required_guarantees=[d_date in (2000-01-03)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-01-03, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-01-03 AND 2000-01-03 <= d_date_max@1, required_guarantees=[d_date in (2000-01-03)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-01-03, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-01-03 AND 2000-01-03 <= d_date_max@1, required_guarantees=[d_date in (2000-01-03)] └────────────────────────────────────────────────── - ┌───── Stage 9 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 10 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 10 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 17 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([i_item_id@0], 6), input_partitions=3 @@ -7396,10 +7176,10 @@ mod tests { │ [Stage 14] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_ext_sales_price@3, i_item_id@4, d_date@1] │ CoalescePartitionsExec - │ [Stage 15] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 15] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@1)], projection=[ss_sold_date_sk@2, ss_ext_sales_price@4, i_item_id@1] │ CoalescePartitionsExec - │ [Stage 16] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 16] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] @@ -7408,41 +7188,39 @@ mod tests { └────────────────────────────────────────────────── ┌───── Stage 14 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_week_seq@0, d_week_seq@1)], projection=[d_date@1] + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_week_seq@0, d_week_seq@1)], projection=[d_date@0] │ CoalescePartitionsExec │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_date@0 = 2000-01-03, projection=[d_week_seq@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-01-03, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-01-03 AND 2000-01-03 <= d_date_max@1, required_guarantees=[d_date in (2000-01-03)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-01-03, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-01-03 AND 2000-01-03 <= d_date_max@1, required_guarantees=[d_date in (2000-01-03)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-01-03, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-01-03 AND 2000-01-03 <= d_date_max@1, required_guarantees=[d_date in (2000-01-03)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-01-03, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-01-03 AND 2000-01-03 <= d_date_max@1, required_guarantees=[d_date in (2000-01-03)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-01-03, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-01-03 AND 2000-01-03 <= d_date_max@1, required_guarantees=[d_date in (2000-01-03)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-01-03, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-01-03 AND 2000-01-03 <= d_date_max@1, required_guarantees=[d_date in (2000-01-03)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-01-03, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-01-03 AND 2000-01-03 <= d_date_max@1, required_guarantees=[d_date in (2000-01-03)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-01-03, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-01-03 AND 2000-01-03 <= d_date_max@1, required_guarantees=[d_date in (2000-01-03)] └────────────────────────────────────────────────── - ┌───── Stage 15 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 15 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 16 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 16 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── "); Ok(()) @@ -7469,7 +7247,7 @@ mod tests { │ CoalescePartitionsExec │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 │ ProjectionExec: expr=[d_week_seq@0 as d_week_seq, ss_store_sk@1 as ss_store_sk, sum(CASE WHEN date_dim.d_day_name = Utf8("Sunday") THEN store_sales.ss_sales_price ELSE NULL END)@2 as sun_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Monday") THEN store_sales.ss_sales_price ELSE NULL END)@3 as mon_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Tuesday") THEN store_sales.ss_sales_price ELSE NULL END)@4 as tue_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Wednesday") THEN store_sales.ss_sales_price ELSE NULL END)@5 as wed_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Thursday") THEN store_sales.ss_sales_price ELSE NULL END)@6 as thu_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Friday") THEN store_sales.ss_sales_price ELSE NULL END)@7 as fri_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Saturday") THEN store_sales.ss_sales_price ELSE NULL END)@8 as sat_sales] - │ AggregateExec: mode=FinalPartitioned, gby=[d_week_seq@0 as d_week_seq, ss_store_sk@1 as ss_store_sk], aggr=[sum(CASE WHEN date_dim.d_day_name = Sunday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Sunday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Monday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Monday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Tuesday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Tuesday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Wednesday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Wednesday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Thursday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Thursday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Friday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Friday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Saturday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Saturday") THEN store_sales.ss_sales_price ELSE NULL END)] + │ AggregateExec: mode=FinalPartitioned, gby=[d_week_seq@0 as d_week_seq, ss_store_sk@1 as ss_store_sk], aggr=[sum(CASE WHEN date_dim.d_day_name = Sunday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Sunday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Monday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Monday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Tuesday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Tuesday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Wednesday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Wednesday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Thursday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Thursday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Friday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Friday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Saturday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Saturday") THEN store_sales.ss_sales_price ELSE NULL END)] │ [Stage 9] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] @@ -7482,18 +7260,17 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 │ ProjectionExec: expr=[d_week_seq@0 as d_week_seq, ss_store_sk@1 as ss_store_sk, sum(CASE WHEN date_dim.d_day_name = Utf8("Sunday") THEN store_sales.ss_sales_price ELSE NULL END)@2 as sun_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Monday") THEN store_sales.ss_sales_price ELSE NULL END)@3 as mon_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Tuesday") THEN store_sales.ss_sales_price ELSE NULL END)@4 as tue_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Wednesday") THEN store_sales.ss_sales_price ELSE NULL END)@5 as wed_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Thursday") THEN store_sales.ss_sales_price ELSE NULL END)@6 as thu_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Friday") THEN store_sales.ss_sales_price ELSE NULL END)@7 as fri_sales, sum(CASE WHEN date_dim.d_day_name = Utf8("Saturday") THEN store_sales.ss_sales_price ELSE NULL END)@8 as sat_sales] - │ AggregateExec: mode=FinalPartitioned, gby=[d_week_seq@0 as d_week_seq, ss_store_sk@1 as ss_store_sk], aggr=[sum(CASE WHEN date_dim.d_day_name = Sunday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Sunday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Monday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Monday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Tuesday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Tuesday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Wednesday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Wednesday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Thursday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Thursday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Friday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Friday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Saturday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Saturday") THEN store_sales.ss_sales_price ELSE NULL END)] + │ AggregateExec: mode=FinalPartitioned, gby=[d_week_seq@0 as d_week_seq, ss_store_sk@1 as ss_store_sk], aggr=[sum(CASE WHEN date_dim.d_day_name = Sunday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Sunday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Monday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Monday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Tuesday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Tuesday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Wednesday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Wednesday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Thursday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Thursday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Friday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Friday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Saturday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Saturday") THEN store_sales.ss_sales_price ELSE NULL END)] │ [Stage 4] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_month_seq@0 >= 1212 AND d_month_seq@0 <= 1223, projection=[d_week_seq@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_month_seq, d_week_seq], file_type=parquet, predicate=d_month_seq@3 >= 1212 AND d_month_seq@3 <= 1223, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1212 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1223, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_month_seq, d_week_seq], file_type=parquet, predicate=d_month_seq@3 >= 1212 AND d_month_seq@3 <= 1223, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1212 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1223, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_month_seq, d_week_seq], file_type=parquet, predicate=d_month_seq@3 >= 1212 AND d_month_seq@3 <= 1223, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1212 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1223, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_month_seq, d_week_seq], file_type=parquet, predicate=d_month_seq@3 >= 1212 AND d_month_seq@3 <= 1223, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1212 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1223, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_month_seq, d_week_seq], file_type=parquet, predicate=d_month_seq@3 >= 1212 AND d_month_seq@3 <= 1223, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1212 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1223, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_month_seq, d_week_seq], file_type=parquet, predicate=d_month_seq@3 >= 1212 AND d_month_seq@3 <= 1223, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1212 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1223, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_month_seq, d_week_seq], file_type=parquet, predicate=d_month_seq@3 >= 1212 AND d_month_seq@3 <= 1223, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1212 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1223, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_month_seq, d_week_seq], file_type=parquet, predicate=d_month_seq@3 >= 1212 AND d_month_seq@3 <= 1223, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1212 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1223, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -7505,33 +7282,32 @@ mod tests { └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([d_week_seq@0, ss_store_sk@1], 12), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[d_week_seq@2 as d_week_seq, ss_store_sk@0 as ss_store_sk], aggr=[sum(CASE WHEN date_dim.d_day_name = Sunday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Sunday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Monday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Monday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Tuesday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Tuesday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Wednesday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Wednesday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Thursday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Thursday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Friday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Friday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Saturday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Saturday") THEN store_sales.ss_sales_price ELSE NULL END)] + │ AggregateExec: mode=Partial, gby=[d_week_seq@2 as d_week_seq, ss_store_sk@0 as ss_store_sk], aggr=[sum(CASE WHEN date_dim.d_day_name = Sunday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Sunday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Monday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Monday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Tuesday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Tuesday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Wednesday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Wednesday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Thursday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Thursday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Friday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Friday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Saturday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Saturday") THEN store_sales.ss_sales_price ELSE NULL END)] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_store_sk@4, ss_sales_price@5, d_week_seq@1, d_day_name@2] │ CoalescePartitionsExec - │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 3 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_month_seq@0 >= 1224 AND d_month_seq@0 <= 1235, projection=[d_week_seq@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_month_seq, d_week_seq], file_type=parquet, predicate=d_month_seq@3 >= 1224 AND d_month_seq@3 <= 1235, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1224 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1235, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_month_seq, d_week_seq], file_type=parquet, predicate=d_month_seq@3 >= 1224 AND d_month_seq@3 <= 1235, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1224 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1235, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_month_seq, d_week_seq], file_type=parquet, predicate=d_month_seq@3 >= 1224 AND d_month_seq@3 <= 1235, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1224 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1235, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_month_seq, d_week_seq], file_type=parquet, predicate=d_month_seq@3 >= 1224 AND d_month_seq@3 <= 1235, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1224 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1235, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_month_seq, d_week_seq], file_type=parquet, predicate=d_month_seq@3 >= 1224 AND d_month_seq@3 <= 1235, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1224 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1235, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_month_seq, d_week_seq], file_type=parquet, predicate=d_month_seq@3 >= 1224 AND d_month_seq@3 <= 1235, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1224 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1235, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_month_seq, d_week_seq], file_type=parquet, predicate=d_month_seq@3 >= 1224 AND d_month_seq@3 <= 1235, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1224 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1235, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_month_seq, d_week_seq], file_type=parquet, predicate=d_month_seq@3 >= 1224 AND d_month_seq@3 <= 1235, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1224 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1235, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -7543,23 +7319,23 @@ mod tests { └────────────────────────────────────────────────── ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([d_week_seq@0, ss_store_sk@1], 12), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[d_week_seq@2 as d_week_seq, ss_store_sk@0 as ss_store_sk], aggr=[sum(CASE WHEN date_dim.d_day_name = Sunday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Sunday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Monday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Monday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Tuesday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Tuesday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Wednesday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Wednesday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Thursday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Thursday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Friday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Friday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Saturday THEN store_sales.ss_sales_price ELSE None,7,2 END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Saturday") THEN store_sales.ss_sales_price ELSE NULL END)] + │ AggregateExec: mode=Partial, gby=[d_week_seq@2 as d_week_seq, ss_store_sk@0 as ss_store_sk], aggr=[sum(CASE WHEN date_dim.d_day_name = Sunday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Sunday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Monday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Monday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Tuesday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Tuesday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Wednesday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Wednesday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Thursday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Thursday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Friday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Friday") THEN store_sales.ss_sales_price ELSE NULL END), sum(CASE WHEN date_dim.d_day_name = Saturday THEN store_sales.ss_sales_price ELSE NULL END) as sum(CASE WHEN date_dim.d_day_name = Utf8("Saturday") THEN store_sales.ss_sales_price ELSE NULL END)] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_store_sk@4, ss_sales_price@5, d_week_seq@1, d_day_name@2] │ CoalescePartitionsExec - │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 8 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── "#); Ok(()) @@ -7567,7 +7343,7 @@ mod tests { #[tokio::test] async fn test_tpcds_60() -> Result<()> { let display = test_tpcds_query("q60").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [i_item_id@0 ASC NULLS LAST], fetch=100 │ [Stage 16] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -7595,7 +7371,7 @@ mod tests { │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@0)], projection=[ss_ext_sales_price@3, i_item_id@1] │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, ss_addr_sk@1)], projection=[ss_item_sk@1, ss_ext_sales_price@3] │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -7611,40 +7387,37 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_category@1 = Music, projection=[i_item_id@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_category], file_type=parquet, predicate=i_category@12 = Music, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1, required_guarantees=[i_category in (Music)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_category], file_type=parquet, predicate=i_category@12 = Music, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1, required_guarantees=[i_category in (Music)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_category], file_type=parquet, predicate=i_category@12 = Music, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1, required_guarantees=[i_category in (Music)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_id, i_category], file_type=parquet, predicate=i_category@12 = Music, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1, required_guarantees=[i_category in (Music)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_category], file_type=parquet, predicate=i_category@12 = Music, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1, required_guarantees=[i_category in (Music)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_category], file_type=parquet, predicate=i_category@12 = Music, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1, required_guarantees=[i_category in (Music)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_id, i_category], file_type=parquet, predicate=i_category@12 = Music, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1, required_guarantees=[i_category in (Music)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_id, i_category], file_type=parquet, predicate=i_category@12 = Music, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1, required_guarantees=[i_category in (Music)] └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: ca_gmt_offset@1 = Some(-500),5,2, projection=[ca_address_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] + │ FilterExec: ca_gmt_offset@1 = -5.00, projection=[ca_address_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 1998 AND d_moy@2 = 9, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 9, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 9 AND 9 <= d_moy_max@5, required_guarantees=[d_moy in (9), d_year in (1998)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 9, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 9 AND 9 <= d_moy_max@5, required_guarantees=[d_moy in (9), d_year in (1998)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 9, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 9 AND 9 <= d_moy_max@5, required_guarantees=[d_moy in (9), d_year in (1998)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 9, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 9 AND 9 <= d_moy_max@5, required_guarantees=[d_moy in (9), d_year in (1998)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 9, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 9 AND 9 <= d_moy_max@5, required_guarantees=[d_moy in (9), d_year in (1998)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 9, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 9 AND 9 <= d_moy_max@5, required_guarantees=[d_moy in (9), d_year in (1998)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 9, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 9 AND 9 <= d_moy_max@5, required_guarantees=[d_moy in (9), d_year in (1998)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 9, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 9 AND 9 <= d_moy_max@5, required_guarantees=[d_moy in (9), d_year in (1998)] └────────────────────────────────────────────────── ┌───── Stage 10 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([i_item_id@0], 6), input_partitions=3 @@ -7655,22 +7428,20 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(cs_item_sk@0, i_item_sk@0)], projection=[cs_ext_sales_price@1, i_item_id@3] │ CoalescePartitionsExec │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_category@1 = Music, projection=[i_item_id@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_category], file_type=parquet, predicate=i_category@12 = Music, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1, required_guarantees=[i_category in (Music)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_category], file_type=parquet, predicate=i_category@12 = Music, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1, required_guarantees=[i_category in (Music)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_category], file_type=parquet, predicate=i_category@12 = Music, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1, required_guarantees=[i_category in (Music)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_id, i_category], file_type=parquet, predicate=i_category@12 = Music, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1, required_guarantees=[i_category in (Music)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_category], file_type=parquet, predicate=i_category@12 = Music, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1, required_guarantees=[i_category in (Music)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_category], file_type=parquet, predicate=i_category@12 = Music, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1, required_guarantees=[i_category in (Music)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_id, i_category], file_type=parquet, predicate=i_category@12 = Music, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1, required_guarantees=[i_category in (Music)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_id, i_category], file_type=parquet, predicate=i_category@12 = Music, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1, required_guarantees=[i_category in (Music)] └────────────────────────────────────────────────── ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -7688,23 +7459,21 @@ mod tests { └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: ca_gmt_offset@1 = Some(-500),5,2, projection=[ca_address_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] + │ FilterExec: ca_gmt_offset@1 = -5.00, projection=[ca_address_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 1998 AND d_moy@2 = 9, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 9, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 9 AND 9 <= d_moy_max@5, required_guarantees=[d_moy in (9), d_year in (1998)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 9, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 9 AND 9 <= d_moy_max@5, required_guarantees=[d_moy in (9), d_year in (1998)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 9, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 9 AND 9 <= d_moy_max@5, required_guarantees=[d_moy in (9), d_year in (1998)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 9, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 9 AND 9 <= d_moy_max@5, required_guarantees=[d_moy in (9), d_year in (1998)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 9, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 9 AND 9 <= d_moy_max@5, required_guarantees=[d_moy in (9), d_year in (1998)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 9, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 9 AND 9 <= d_moy_max@5, required_guarantees=[d_moy in (9), d_year in (1998)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 9, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 9 AND 9 <= d_moy_max@5, required_guarantees=[d_moy in (9), d_year in (1998)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 9, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 9 AND 9 <= d_moy_max@5, required_guarantees=[d_moy in (9), d_year in (1998)] └────────────────────────────────────────────────── ┌───── Stage 15 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([i_item_id@0], 6), input_partitions=3 @@ -7715,22 +7484,20 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ws_item_sk@0, i_item_sk@0)], projection=[ws_ext_sales_price@1, i_item_id@3] │ CoalescePartitionsExec │ [Stage 14] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 11 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_category@1 = Music, projection=[i_item_id@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_category], file_type=parquet, predicate=i_category@12 = Music, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1, required_guarantees=[i_category in (Music)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_category], file_type=parquet, predicate=i_category@12 = Music, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1, required_guarantees=[i_category in (Music)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_category], file_type=parquet, predicate=i_category@12 = Music, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1, required_guarantees=[i_category in (Music)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_id, i_category], file_type=parquet, predicate=i_category@12 = Music, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1, required_guarantees=[i_category in (Music)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_category], file_type=parquet, predicate=i_category@12 = Music, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1, required_guarantees=[i_category in (Music)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_id, i_category], file_type=parquet, predicate=i_category@12 = Music, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1, required_guarantees=[i_category in (Music)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_id, i_category], file_type=parquet, predicate=i_category@12 = Music, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1, required_guarantees=[i_category in (Music)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_id, i_category], file_type=parquet, predicate=i_category@12 = Music, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1, required_guarantees=[i_category in (Music)] └────────────────────────────────────────────────── ┌───── Stage 14 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -7748,23 +7515,21 @@ mod tests { └────────────────────────────────────────────────── ┌───── Stage 12 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: ca_gmt_offset@1 = Some(-500),5,2, projection=[ca_address_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] + │ FilterExec: ca_gmt_offset@1 = -5.00, projection=[ca_address_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] └────────────────────────────────────────────────── ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 1998 AND d_moy@2 = 9, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 9, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 9 AND 9 <= d_moy_max@5, required_guarantees=[d_moy in (9), d_year in (1998)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 9, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 9 AND 9 <= d_moy_max@5, required_guarantees=[d_moy in (9), d_year in (1998)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 9, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 9 AND 9 <= d_moy_max@5, required_guarantees=[d_moy in (9), d_year in (1998)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 9, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 9 AND 9 <= d_moy_max@5, required_guarantees=[d_moy in (9), d_year in (1998)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 9, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 9 AND 9 <= d_moy_max@5, required_guarantees=[d_moy in (9), d_year in (1998)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 9, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 9 AND 9 <= d_moy_max@5, required_guarantees=[d_moy in (9), d_year in (1998)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 9, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 9 AND 9 <= d_moy_max@5, required_guarantees=[d_moy in (9), d_year in (1998)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 9, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 9 AND 9 <= d_moy_max@5, required_guarantees=[d_moy in (9), d_year in (1998)] └────────────────────────────────────────────────── "); Ok(()) @@ -7772,10 +7537,10 @@ mod tests { #[tokio::test] async fn test_tpcds_61() -> Result<()> { let display = test_tpcds_query("q61").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortExec: TopK(fetch=100), expr=[total@1 ASC NULLS LAST], preserve_partitioning=[false] - │ ProjectionExec: expr=[promotions@0 as promotions, total@1 as total, CAST(promotions@0 AS Decimal128(15, 4)) / CAST(total@1 AS Decimal128(15, 4)) * Some(100),20,0 as promotional_sales.promotions / all_sales.total * Int64(100)] + │ ProjectionExec: expr=[promotions@0 as promotions, total@1 as total, CAST(promotions@0 AS Decimal128(15, 4)) / CAST(total@1 AS Decimal128(15, 4)) * 100 as promotional_sales.promotions / all_sales.total * Int64(100)] │ CrossJoinExec │ CoalescePartitionsExec │ BroadcastExec: input_partitions=1, consumer_tasks=1, output_partitions=1 @@ -7799,32 +7564,29 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ss_customer_sk@1, c_customer_sk@0)], projection=[ss_item_sk@0, ss_ext_sales_price@2, c_current_addr_sk@4] │ CoalescePartitionsExec │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_category@1 = Jewelry, projection=[i_item_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet, predicate=i_category@12 = Jewelry, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Jewelry AND Jewelry <= i_category_max@1, required_guarantees=[i_category in (Jewelry)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet, predicate=i_category@12 = Jewelry, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Jewelry AND Jewelry <= i_category_max@1, required_guarantees=[i_category in (Jewelry)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet, predicate=i_category@12 = Jewelry, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Jewelry AND Jewelry <= i_category_max@1, required_guarantees=[i_category in (Jewelry)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet, predicate=i_category@12 = Jewelry, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Jewelry AND Jewelry <= i_category_max@1, required_guarantees=[i_category in (Jewelry)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet, predicate=i_category@12 = Jewelry, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Jewelry AND Jewelry <= i_category_max@1, required_guarantees=[i_category in (Jewelry)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet, predicate=i_category@12 = Jewelry, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Jewelry AND Jewelry <= i_category_max@1, required_guarantees=[i_category in (Jewelry)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet, predicate=i_category@12 = Jewelry, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Jewelry AND Jewelry <= i_category_max@1, required_guarantees=[i_category in (Jewelry)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet, predicate=i_category@12 = Jewelry, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Jewelry AND Jewelry <= i_category_max@1, required_guarantees=[i_category in (Jewelry)] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: ca_gmt_offset@1 = Some(-500),5,2, projection=[ca_address_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] + │ FilterExec: ca_gmt_offset@1 = -5.00, projection=[ca_address_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -7846,12 +7608,11 @@ mod tests { ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 1998 AND d_moy@2 = 11, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -7865,13 +7626,13 @@ mod tests { └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: s_gmt_offset@1 = Some(-500),5,2, projection=[s_store_sk@0] + │ FilterExec: s_gmt_offset@1 = -5.00, projection=[s_store_sk@0] │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:..]]}, projection=[s_store_sk, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = Some(-500),5,2, pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (Some(-500),5,2)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:..]]}, projection=[s_store_sk, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = Some(-500),5,2, pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (Some(-500),5,2)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = Some(-500),5,2, pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (Some(-500),5,2)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = Some(-500),5,2, pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (Some(-500),5,2)] + │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:..]]}, projection=[s_store_sk, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = -5.00, pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= -5.00 AND -5.00 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (-5.00)] + │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:..]]}, projection=[s_store_sk, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = -5.00, pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= -5.00 AND -5.00 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (-5.00)] + │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = -5.00, pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= -5.00 AND -5.00 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (-5.00)] + │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = -5.00, pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= -5.00 AND -5.00 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (-5.00)] └────────────────────────────────────────────────── ┌───── Stage 13 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ AggregateExec: mode=Partial, gby=[], aggr=[sum(store_sales.ss_ext_sales_price)] @@ -7884,32 +7645,29 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ss_customer_sk@1, c_customer_sk@0)], projection=[ss_item_sk@0, ss_ext_sales_price@2, c_current_addr_sk@4] │ CoalescePartitionsExec │ [Stage 12] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_category@1 = Jewelry, projection=[i_item_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet, predicate=i_category@12 = Jewelry, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Jewelry AND Jewelry <= i_category_max@1, required_guarantees=[i_category in (Jewelry)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet, predicate=i_category@12 = Jewelry, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Jewelry AND Jewelry <= i_category_max@1, required_guarantees=[i_category in (Jewelry)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet, predicate=i_category@12 = Jewelry, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Jewelry AND Jewelry <= i_category_max@1, required_guarantees=[i_category in (Jewelry)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet, predicate=i_category@12 = Jewelry, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Jewelry AND Jewelry <= i_category_max@1, required_guarantees=[i_category in (Jewelry)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet, predicate=i_category@12 = Jewelry, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Jewelry AND Jewelry <= i_category_max@1, required_guarantees=[i_category in (Jewelry)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet, predicate=i_category@12 = Jewelry, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Jewelry AND Jewelry <= i_category_max@1, required_guarantees=[i_category in (Jewelry)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet, predicate=i_category@12 = Jewelry, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Jewelry AND Jewelry <= i_category_max@1, required_guarantees=[i_category in (Jewelry)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet, predicate=i_category@12 = Jewelry, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Jewelry AND Jewelry <= i_category_max@1, required_guarantees=[i_category in (Jewelry)] └────────────────────────────────────────────────── ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: ca_gmt_offset@1 = Some(-500),5,2, projection=[ca_address_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-500),5,2, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-500),5,2)] + │ FilterExec: ca_gmt_offset@1 = -5.00, projection=[ca_address_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -5.00, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -5.00 AND -5.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-5.00)] └────────────────────────────────────────────────── ┌───── Stage 12 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -7928,22 +7686,21 @@ mod tests { ┌───── Stage 10 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 1998 AND d_moy@2 = 11, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] └────────────────────────────────────────────────── ┌───── Stage 11 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: s_gmt_offset@1 = Some(-500),5,2, projection=[s_store_sk@0] + │ FilterExec: s_gmt_offset@1 = -5.00, projection=[s_store_sk@0] │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:..]]}, projection=[s_store_sk, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = Some(-500),5,2, pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (Some(-500),5,2)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:..]]}, projection=[s_store_sk, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = Some(-500),5,2, pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (Some(-500),5,2)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = Some(-500),5,2, pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (Some(-500),5,2)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = Some(-500),5,2, pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= Some(-500),5,2 AND Some(-500),5,2 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (Some(-500),5,2)] + │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:..]]}, projection=[s_store_sk, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = -5.00, pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= -5.00 AND -5.00 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (-5.00)] + │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:..]]}, projection=[s_store_sk, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = -5.00, pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= -5.00 AND -5.00 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (-5.00)] + │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = -5.00, pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= -5.00 AND -5.00 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (-5.00)] + │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = -5.00, pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= -5.00 AND -5.00 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (-5.00)] └────────────────────────────────────────────────── "); Ok(()) @@ -7951,7 +7708,7 @@ mod tests { #[tokio::test] async fn test_tpcds_62() -> Result<()> { let display = test_tpcds_query("q62").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [w_substr@0 ASC, sm_type@1 ASC, web_name@2 ASC], fetch=100 │ [Stage 6] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -7987,12 +7744,11 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_month_seq@1 >= 1200 AND d_month_seq@1 <= 1211, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -8029,7 +7785,7 @@ mod tests { │ SortPreservingMergeExec: [i_manager_id@0 ASC NULLS LAST, avg_monthly_sales@2 ASC NULLS LAST, sum_sales@1 ASC NULLS LAST], fetch=100 │ SortExec: TopK(fetch=100), expr=[i_manager_id@0 ASC NULLS LAST, avg_monthly_sales@2 ASC NULLS LAST, sum_sales@1 ASC NULLS LAST], preserve_partitioning=[true], sort_prefix=[i_manager_id@0 ASC NULLS LAST, avg_monthly_sales@2 ASC NULLS LAST] │ ProjectionExec: expr=[i_manager_id@0 as i_manager_id, sum(store_sales.ss_sales_price)@1 as sum_sales, avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_manager_id] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING@2 as avg_monthly_sales] - │ FilterExec: CASE WHEN avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_manager_id] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING@2 > Some(0),21,6 THEN abs(sum(store_sales.ss_sales_price)@1 - avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_manager_id] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING@2) / avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_manager_id] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING@2 END > Some(1000000000),32,10 + │ FilterExec: CASE WHEN avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_manager_id] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING@2 > 0.000000 THEN abs(sum(store_sales.ss_sales_price)@1 - avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_manager_id] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING@2) / avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_manager_id] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING@2 END > 0.1000000000 │ WindowAggExec: wdw=[avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_manager_id] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING: Ok(Field { name: "avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_manager_id] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING", data_type: Decimal128(21, 6), nullable: true }), frame: WindowFrame { units: Rows, start_bound: Preceding(UInt64(NULL)), end_bound: Following(UInt64(NULL)), is_causal: false }] │ SortExec: expr=[i_manager_id@0 ASC NULLS LAST], preserve_partitioning=[true] │ [Stage 5] => NetworkShuffleExec: output_partitions=3, input_tasks=2 @@ -8069,22 +7825,20 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_month_seq@1 IN (SET) ([1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211]), projection=[d_date_sk@0, d_moy@2] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq, d_moy], file_type=parquet, predicate=d_month_seq@3 IN (SET) ([1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211]), pruning_predicate=d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1200 AND 1200 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1201 AND 1201 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1202 AND 1202 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1203 AND 1203 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1204 AND 1204 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1205 AND 1205 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1206 AND 1206 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1207 AND 1207 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1208 AND 1208 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1209 AND 1209 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1210 AND 1210 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1211 AND 1211 <= d_month_seq_max@1, required_guarantees=[d_month_seq in (1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq, d_moy], file_type=parquet, predicate=d_month_seq@3 IN (SET) ([1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211]), pruning_predicate=d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1200 AND 1200 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1201 AND 1201 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1202 AND 1202 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1203 AND 1203 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1204 AND 1204 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1205 AND 1205 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1206 AND 1206 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1207 AND 1207 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1208 AND 1208 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1209 AND 1209 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1210 AND 1210 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1211 AND 1211 <= d_month_seq_max@1, required_guarantees=[d_month_seq in (1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq, d_moy], file_type=parquet, predicate=d_month_seq@3 IN (SET) ([1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211]), pruning_predicate=d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1200 AND 1200 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1201 AND 1201 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1202 AND 1202 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1203 AND 1203 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1204 AND 1204 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1205 AND 1205 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1206 AND 1206 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1207 AND 1207 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1208 AND 1208 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1209 AND 1209 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1210 AND 1210 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1211 AND 1211 <= d_month_seq_max@1, required_guarantees=[d_month_seq in (1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq, d_moy], file_type=parquet, predicate=d_month_seq@3 IN (SET) ([1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211]), pruning_predicate=d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1200 AND 1200 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1201 AND 1201 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1202 AND 1202 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1203 AND 1203 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1204 AND 1204 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1205 AND 1205 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1206 AND 1206 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1207 AND 1207 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1208 AND 1208 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1209 AND 1209 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1210 AND 1210 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1211 AND 1211 <= d_month_seq_max@1, required_guarantees=[d_month_seq in (1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq, d_moy], file_type=parquet, predicate=d_month_seq@3 IN (SET) ([1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211]), pruning_predicate=d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1200 AND 1200 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1201 AND 1201 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1202 AND 1202 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1203 AND 1203 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1204 AND 1204 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1205 AND 1205 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1206 AND 1206 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1207 AND 1207 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1208 AND 1208 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1209 AND 1209 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1210 AND 1210 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1211 AND 1211 <= d_month_seq_max@1, required_guarantees=[d_month_seq in (1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq, d_moy], file_type=parquet, predicate=d_month_seq@3 IN (SET) ([1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211]), pruning_predicate=d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1200 AND 1200 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1201 AND 1201 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1202 AND 1202 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1203 AND 1203 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1204 AND 1204 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1205 AND 1205 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1206 AND 1206 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1207 AND 1207 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1208 AND 1208 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1209 AND 1209 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1210 AND 1210 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1211 AND 1211 <= d_month_seq_max@1, required_guarantees=[d_month_seq in (1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq, d_moy], file_type=parquet, predicate=d_month_seq@3 IN (SET) ([1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211]), pruning_predicate=d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1200 AND 1200 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1201 AND 1201 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1202 AND 1202 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1203 AND 1203 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1204 AND 1204 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1205 AND 1205 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1206 AND 1206 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1207 AND 1207 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1208 AND 1208 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1209 AND 1209 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1210 AND 1210 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1211 AND 1211 <= d_month_seq_max@1, required_guarantees=[d_month_seq in (1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq, d_moy], file_type=parquet, predicate=d_month_seq@3 IN (SET) ([1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211]), pruning_predicate=d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1200 AND 1200 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1201 AND 1201 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1202 AND 1202 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1203 AND 1203 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1204 AND 1204 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1205 AND 1205 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1206 AND 1206 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1207 AND 1207 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1208 AND 1208 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1209 AND 1209 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1210 AND 1210 <= d_month_seq_max@1 OR d_month_seq_null_count@2 != row_count@3 AND d_month_seq_min@0 <= 1211 AND 1211 <= d_month_seq_max@1, required_guarantees=[d_month_seq in (1200, 1201, 1202, 1203, 1204, 1205, 1206, 1207, 1208, 1209, 1210, 1211)] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: (i_category@3 = Books OR i_category@3 = Children OR i_category@3 = Electronics) AND i_class@2 IN (SET) ([personal, portable, reference, self-help]) AND i_brand@1 IN (SET) ([scholaramalgamalg #14, scholaramalgamalg #7, exportiunivamalg #9, scholaramalgamalg #9]) OR (i_category@3 = Women OR i_category@3 = Music OR i_category@3 = Men) AND i_class@2 IN (SET) ([accessories, classical, fragrances, pants]) AND i_brand@1 IN (SET) ([amalgimporto #1, edu packscholar #1, exportiimporto #1, importoamalg #1]), projection=[i_item_sk@0, i_manager_id@4] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_manager_id], file_type=parquet, predicate=(i_category@12 = Books OR i_category@12 = Children OR i_category@12 = Electronics) AND i_class@10 IN (SET) ([personal, portable, reference, self-help]) AND i_brand@8 IN (SET) ([scholaramalgamalg #14, scholaramalgamalg #7, exportiunivamalg #9, scholaramalgamalg #9]) OR (i_category@12 = Women OR i_category@12 = Music OR i_category@12 = Men) AND i_class@10 IN (SET) ([accessories, classical, fragrances, pants]) AND i_brand@8 IN (SET) ([amalgimporto #1, edu packscholar #1, exportiimporto #1, importoamalg #1]), pruning_predicate=(i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Children AND Children <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= personal AND personal <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= portable AND portable <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= reference AND reference <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= self-help AND self-help <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #14 AND scholaramalgamalg #14 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #7 AND scholaramalgamalg #7 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiunivamalg #9 AND exportiunivamalg #9 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #9 AND scholaramalgamalg #9 <= i_brand_max@8) OR (i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= accessories AND accessories <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= classical AND classical <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= fragrances AND fragrances <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= pants AND pants <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= amalgimporto #1 AND amalgimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= edu packscholar #1 AND edu packscholar #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiimporto #1 AND exportiimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= importoamalg #1 AND importoamalg #1 <= i_brand_max@8), required_guarantees=[i_brand in (amalgimporto #1, edu packscholar #1, exportiimporto #1, exportiunivamalg #9, importoamalg #1, scholaramalgamalg #14, scholaramalgamalg #7, scholaramalgamalg #9), i_class in (accessories, classical, fragrances, pants, personal, portable, reference, self-help)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_manager_id], file_type=parquet, predicate=(i_category@12 = Books OR i_category@12 = Children OR i_category@12 = Electronics) AND i_class@10 IN (SET) ([personal, portable, reference, self-help]) AND i_brand@8 IN (SET) ([scholaramalgamalg #14, scholaramalgamalg #7, exportiunivamalg #9, scholaramalgamalg #9]) OR (i_category@12 = Women OR i_category@12 = Music OR i_category@12 = Men) AND i_class@10 IN (SET) ([accessories, classical, fragrances, pants]) AND i_brand@8 IN (SET) ([amalgimporto #1, edu packscholar #1, exportiimporto #1, importoamalg #1]), pruning_predicate=(i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Children AND Children <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= personal AND personal <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= portable AND portable <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= reference AND reference <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= self-help AND self-help <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #14 AND scholaramalgamalg #14 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #7 AND scholaramalgamalg #7 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiunivamalg #9 AND exportiunivamalg #9 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #9 AND scholaramalgamalg #9 <= i_brand_max@8) OR (i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= accessories AND accessories <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= classical AND classical <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= fragrances AND fragrances <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= pants AND pants <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= amalgimporto #1 AND amalgimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= edu packscholar #1 AND edu packscholar #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiimporto #1 AND exportiimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= importoamalg #1 AND importoamalg #1 <= i_brand_max@8), required_guarantees=[i_brand in (amalgimporto #1, edu packscholar #1, exportiimporto #1, exportiunivamalg #9, importoamalg #1, scholaramalgamalg #14, scholaramalgamalg #7, scholaramalgamalg #9), i_class in (accessories, classical, fragrances, pants, personal, portable, reference, self-help)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_manager_id], file_type=parquet, predicate=(i_category@12 = Books OR i_category@12 = Children OR i_category@12 = Electronics) AND i_class@10 IN (SET) ([personal, portable, reference, self-help]) AND i_brand@8 IN (SET) ([scholaramalgamalg #14, scholaramalgamalg #7, exportiunivamalg #9, scholaramalgamalg #9]) OR (i_category@12 = Women OR i_category@12 = Music OR i_category@12 = Men) AND i_class@10 IN (SET) ([accessories, classical, fragrances, pants]) AND i_brand@8 IN (SET) ([amalgimporto #1, edu packscholar #1, exportiimporto #1, importoamalg #1]), pruning_predicate=(i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Children AND Children <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= personal AND personal <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= portable AND portable <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= reference AND reference <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= self-help AND self-help <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #14 AND scholaramalgamalg #14 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #7 AND scholaramalgamalg #7 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiunivamalg #9 AND exportiunivamalg #9 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #9 AND scholaramalgamalg #9 <= i_brand_max@8) OR (i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= accessories AND accessories <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= classical AND classical <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= fragrances AND fragrances <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= pants AND pants <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= amalgimporto #1 AND amalgimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= edu packscholar #1 AND edu packscholar #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiimporto #1 AND exportiimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= importoamalg #1 AND importoamalg #1 <= i_brand_max@8), required_guarantees=[i_brand in (amalgimporto #1, edu packscholar #1, exportiimporto #1, exportiunivamalg #9, importoamalg #1, scholaramalgamalg #14, scholaramalgamalg #7, scholaramalgamalg #9), i_class in (accessories, classical, fragrances, pants, personal, portable, reference, self-help)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_manager_id], file_type=parquet, predicate=(i_category@12 = Books OR i_category@12 = Children OR i_category@12 = Electronics) AND i_class@10 IN (SET) ([personal, portable, reference, self-help]) AND i_brand@8 IN (SET) ([scholaramalgamalg #14, scholaramalgamalg #7, exportiunivamalg #9, scholaramalgamalg #9]) OR (i_category@12 = Women OR i_category@12 = Music OR i_category@12 = Men) AND i_class@10 IN (SET) ([accessories, classical, fragrances, pants]) AND i_brand@8 IN (SET) ([amalgimporto #1, edu packscholar #1, exportiimporto #1, importoamalg #1]), pruning_predicate=(i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Children AND Children <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= personal AND personal <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= portable AND portable <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= reference AND reference <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= self-help AND self-help <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #14 AND scholaramalgamalg #14 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #7 AND scholaramalgamalg #7 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiunivamalg #9 AND exportiunivamalg #9 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #9 AND scholaramalgamalg #9 <= i_brand_max@8) OR (i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= accessories AND accessories <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= classical AND classical <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= fragrances AND fragrances <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= pants AND pants <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= amalgimporto #1 AND amalgimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= edu packscholar #1 AND edu packscholar #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiimporto #1 AND exportiimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= importoamalg #1 AND importoamalg #1 <= i_brand_max@8), required_guarantees=[i_brand in (amalgimporto #1, edu packscholar #1, exportiimporto #1, exportiunivamalg #9, importoamalg #1, scholaramalgamalg #14, scholaramalgamalg #7, scholaramalgamalg #9), i_class in (accessories, classical, fragrances, pants, personal, portable, reference, self-help)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_manager_id], file_type=parquet, predicate=(i_category@12 = Books OR i_category@12 = Children OR i_category@12 = Electronics) AND i_class@10 IN (SET) ([personal, portable, reference, self-help]) AND i_brand@8 IN (SET) ([scholaramalgamalg #14, scholaramalgamalg #7, exportiunivamalg #9, scholaramalgamalg #9]) OR (i_category@12 = Women OR i_category@12 = Music OR i_category@12 = Men) AND i_class@10 IN (SET) ([accessories, classical, fragrances, pants]) AND i_brand@8 IN (SET) ([amalgimporto #1, edu packscholar #1, exportiimporto #1, importoamalg #1]), pruning_predicate=(i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Children AND Children <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= personal AND personal <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= portable AND portable <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= reference AND reference <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= self-help AND self-help <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #14 AND scholaramalgamalg #14 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #7 AND scholaramalgamalg #7 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiunivamalg #9 AND exportiunivamalg #9 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #9 AND scholaramalgamalg #9 <= i_brand_max@8) OR (i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= accessories AND accessories <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= classical AND classical <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= fragrances AND fragrances <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= pants AND pants <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= amalgimporto #1 AND amalgimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= edu packscholar #1 AND edu packscholar #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiimporto #1 AND exportiimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= importoamalg #1 AND importoamalg #1 <= i_brand_max@8), required_guarantees=[i_brand in (amalgimporto #1, edu packscholar #1, exportiimporto #1, exportiunivamalg #9, importoamalg #1, scholaramalgamalg #14, scholaramalgamalg #7, scholaramalgamalg #9), i_class in (accessories, classical, fragrances, pants, personal, portable, reference, self-help)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_manager_id], file_type=parquet, predicate=(i_category@12 = Books OR i_category@12 = Children OR i_category@12 = Electronics) AND i_class@10 IN (SET) ([personal, portable, reference, self-help]) AND i_brand@8 IN (SET) ([scholaramalgamalg #14, scholaramalgamalg #7, exportiunivamalg #9, scholaramalgamalg #9]) OR (i_category@12 = Women OR i_category@12 = Music OR i_category@12 = Men) AND i_class@10 IN (SET) ([accessories, classical, fragrances, pants]) AND i_brand@8 IN (SET) ([amalgimporto #1, edu packscholar #1, exportiimporto #1, importoamalg #1]), pruning_predicate=(i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Children AND Children <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= personal AND personal <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= portable AND portable <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= reference AND reference <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= self-help AND self-help <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #14 AND scholaramalgamalg #14 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #7 AND scholaramalgamalg #7 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiunivamalg #9 AND exportiunivamalg #9 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #9 AND scholaramalgamalg #9 <= i_brand_max@8) OR (i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= accessories AND accessories <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= classical AND classical <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= fragrances AND fragrances <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= pants AND pants <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= amalgimporto #1 AND amalgimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= edu packscholar #1 AND edu packscholar #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiimporto #1 AND exportiimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= importoamalg #1 AND importoamalg #1 <= i_brand_max@8), required_guarantees=[i_brand in (amalgimporto #1, edu packscholar #1, exportiimporto #1, exportiunivamalg #9, importoamalg #1, scholaramalgamalg #14, scholaramalgamalg #7, scholaramalgamalg #9), i_class in (accessories, classical, fragrances, pants, personal, portable, reference, self-help)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_manager_id], file_type=parquet, predicate=(i_category@12 = Books OR i_category@12 = Children OR i_category@12 = Electronics) AND i_class@10 IN (SET) ([personal, portable, reference, self-help]) AND i_brand@8 IN (SET) ([scholaramalgamalg #14, scholaramalgamalg #7, exportiunivamalg #9, scholaramalgamalg #9]) OR (i_category@12 = Women OR i_category@12 = Music OR i_category@12 = Men) AND i_class@10 IN (SET) ([accessories, classical, fragrances, pants]) AND i_brand@8 IN (SET) ([amalgimporto #1, edu packscholar #1, exportiimporto #1, importoamalg #1]), pruning_predicate=(i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Children AND Children <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= personal AND personal <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= portable AND portable <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= reference AND reference <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= self-help AND self-help <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #14 AND scholaramalgamalg #14 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #7 AND scholaramalgamalg #7 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiunivamalg #9 AND exportiunivamalg #9 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #9 AND scholaramalgamalg #9 <= i_brand_max@8) OR (i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= accessories AND accessories <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= classical AND classical <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= fragrances AND fragrances <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= pants AND pants <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= amalgimporto #1 AND amalgimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= edu packscholar #1 AND edu packscholar #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiimporto #1 AND exportiimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= importoamalg #1 AND importoamalg #1 <= i_brand_max@8), required_guarantees=[i_brand in (amalgimporto #1, edu packscholar #1, exportiimporto #1, exportiunivamalg #9, importoamalg #1, scholaramalgamalg #14, scholaramalgamalg #7, scholaramalgamalg #9), i_class in (accessories, classical, fragrances, pants, personal, portable, reference, self-help)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_manager_id], file_type=parquet, predicate=(i_category@12 = Books OR i_category@12 = Children OR i_category@12 = Electronics) AND i_class@10 IN (SET) ([personal, portable, reference, self-help]) AND i_brand@8 IN (SET) ([scholaramalgamalg #14, scholaramalgamalg #7, exportiunivamalg #9, scholaramalgamalg #9]) OR (i_category@12 = Women OR i_category@12 = Music OR i_category@12 = Men) AND i_class@10 IN (SET) ([accessories, classical, fragrances, pants]) AND i_brand@8 IN (SET) ([amalgimporto #1, edu packscholar #1, exportiimporto #1, importoamalg #1]), pruning_predicate=(i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Children AND Children <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= personal AND personal <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= portable AND portable <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= reference AND reference <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= self-help AND self-help <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #14 AND scholaramalgamalg #14 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #7 AND scholaramalgamalg #7 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiunivamalg #9 AND exportiunivamalg #9 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= scholaramalgamalg #9 AND scholaramalgamalg #9 <= i_brand_max@8) OR (i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Music AND Music <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= accessories AND accessories <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= classical AND classical <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= fragrances AND fragrances <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= pants AND pants <= i_class_max@5) AND (i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= amalgimporto #1 AND amalgimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= edu packscholar #1 AND edu packscholar #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= exportiimporto #1 AND exportiimporto #1 <= i_brand_max@8 OR i_brand_null_count@9 != row_count@3 AND i_brand_min@7 <= importoamalg #1 AND importoamalg #1 <= i_brand_max@8), required_guarantees=[i_brand in (amalgimporto #1, edu packscholar #1, exportiimporto #1, exportiunivamalg #9, importoamalg #1, scholaramalgamalg #14, scholaramalgamalg #7, scholaramalgamalg #9), i_class in (accessories, classical, fragrances, pants, personal, portable, reference, self-help)] └────────────────────────────────────────────────── "#); Ok(()) @@ -8092,7 +7846,7 @@ mod tests { #[tokio::test] async fn test_tpcds_64() -> Result<()> { let display = test_tpcds_query("q64").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [product_name@0 ASC NULLS LAST, store_name@1 ASC NULLS LAST, cnt@20 ASC NULLS LAST, s11@13 ASC NULLS LAST, s12@16 ASC NULLS LAST] │ [Stage 52] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -8119,13 +7873,12 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ss_item_sk@0, i_item_sk@0)], projection=[ss_wholesale_cost@1, ss_list_price@2, ss_coupon_amt@3, d_year@4, d_year@7, d_year@8, s_store_name@5, s_zip@6, ca_street_number@9, ca_street_name@10, ca_city@11, ca_zip@12, ca_street_number@13, ca_street_name@14, ca_city@15, ca_zip@16, i_item_sk@17, i_product_name@18] │ CoalescePartitionsExec │ [Stage 24] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 - │ FilterExec: i_color@2 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@1 >= Some(6500),7,2 AND i_current_price@1 <= Some(7400),7,2, projection=[i_item_sk@0, i_product_name@3] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= Some(6500),7,2 AND i_current_price@5 <= Some(7400),7,2 AND DynamicFilter [ empty ], pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= Some(6500),7,2 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= Some(7400),7,2, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= Some(6500),7,2 AND i_current_price@5 <= Some(7400),7,2 AND DynamicFilter [ empty ], pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= Some(6500),7,2 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= Some(7400),7,2, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= Some(6500),7,2 AND i_current_price@5 <= Some(7400),7,2 AND DynamicFilter [ empty ], pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= Some(6500),7,2 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= Some(7400),7,2, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= Some(6500),7,2 AND i_current_price@5 <= Some(7400),7,2 AND DynamicFilter [ empty ], pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= Some(6500),7,2 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= Some(7400),7,2, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] + │ FilterExec: i_color@2 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@1 >= 65.00 AND i_current_price@1 <= 74.00, projection=[i_item_sk@0, i_product_name@3] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= 65.00 AND i_current_price@5 <= 74.00 AND DynamicFilter [ empty ], pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= 65.00 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= 74.00, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= 65.00 AND i_current_price@5 <= 74.00 AND DynamicFilter [ empty ], pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= 65.00 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= 74.00, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= 65.00 AND i_current_price@5 <= 74.00 AND DynamicFilter [ empty ], pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= 65.00 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= 74.00, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= 65.00 AND i_current_price@5 <= 74.00 AND DynamicFilter [ empty ], pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= 65.00 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= 74.00, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] └────────────────────────────────────────────────── ┌───── Stage 24 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -8145,10 +7898,10 @@ mod tests { │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, c_current_addr_sk@7)], projection=[ss_item_sk@5, ss_wholesale_cost@6, ss_list_price@7, ss_coupon_amt@8, d_year@9, s_store_name@10, s_zip@11, d_year@13, d_year@14, hd_income_band_sk@15, hd_income_band_sk@16, ca_street_number@17, ca_street_name@18, ca_city@19, ca_zip@20, ca_street_number@1, ca_street_name@2, ca_city@3, ca_zip@4] │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, ss_addr_sk@1)], projection=[ss_item_sk@5, ss_wholesale_cost@7, ss_list_price@8, ss_coupon_amt@9, d_year@10, s_store_name@11, s_zip@12, c_current_addr_sk@13, d_year@14, d_year@15, hd_income_band_sk@16, hd_income_band_sk@17, ca_street_number@1, ca_street_name@2, ca_city@3, ca_zip@4] │ CoalescePartitionsExec - │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(hd_demo_sk@0, c_current_hdemo_sk@8)], projection=[ss_item_sk@2, ss_addr_sk@3, ss_wholesale_cost@4, ss_list_price@5, ss_coupon_amt@6, d_year@7, s_store_name@8, s_zip@9, c_current_addr_sk@11, d_year@12, d_year@13, hd_income_band_sk@14, hd_income_band_sk@1] │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 @@ -8158,8 +7911,8 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(p_promo_sk@0, ss_promo_sk@3)], projection=[ss_item_sk@1, ss_hdemo_sk@2, ss_addr_sk@3, ss_wholesale_cost@5, ss_list_price@6, ss_coupon_amt@7, d_year@8, s_store_name@9, s_zip@10, c_current_hdemo_sk@11, c_current_addr_sk@12, d_year@13, d_year@14] │ CoalescePartitionsExec │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 - │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(cd_demo_sk@0, c_current_cdemo_sk@10)], filter=cd_marital_status@1 != cd_marital_status@0, projection=[ss_item_sk@2, ss_hdemo_sk@3, ss_addr_sk@4, ss_promo_sk@5, ss_wholesale_cost@6, ss_list_price@7, ss_coupon_amt@8, d_year@9, s_store_name@10, s_zip@11, c_current_hdemo_sk@13, c_current_addr_sk@14, d_year@15, d_year@16] - │ [Stage 7] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(c_current_cdemo_sk@10, cd_demo_sk@0)], filter=cd_marital_status@1 != cd_marital_status@0, projection=[ss_item_sk@0, ss_hdemo_sk@1, ss_addr_sk@2, ss_promo_sk@3, ss_wholesale_cost@4, ss_list_price@5, ss_coupon_amt@6, d_year@7, s_store_name@8, s_zip@9, c_current_hdemo_sk@11, c_current_addr_sk@12, d_year@13, d_year@14] + │ [Stage 21] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ [Stage 22] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] @@ -8170,21 +7923,21 @@ mod tests { │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/income_band/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/income_band/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/income_band/part-3.parquet:..]]}, projection=[ib_income_band_sk], file_type=parquet │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/income_band/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/income_band/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/income_band/part-3.parquet:..]]}, projection=[ib_income_band_sk], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 3 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -8210,80 +7963,64 @@ mod tests { │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/promotion/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/promotion/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/promotion/part-1.parquet:..]]}, projection=[p_promo_sk], file_type=parquet │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/promotion/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/promotion/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/promotion/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/promotion/part-3.parquet:..]]}, projection=[p_promo_sk], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([cd_demo_sk@0], 12), input_partitions=3 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet - └────────────────────────────────────────────────── - ┌───── Stage 22 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] + ┌───── Stage 21 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([c_current_cdemo_sk@10], 12), input_partitions=3 - │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(cd_demo_sk@0, ss_cdemo_sk@1)], projection=[ss_item_sk@2, ss_hdemo_sk@4, ss_addr_sk@5, ss_promo_sk@6, ss_wholesale_cost@7, ss_list_price@8, ss_coupon_amt@9, d_year@10, s_store_name@11, s_zip@12, c_current_cdemo_sk@13, c_current_hdemo_sk@14, c_current_addr_sk@15, d_year@16, d_year@17, cd_marital_status@1] - │ [Stage 8] => NetworkShuffleExec: output_partitions=3, input_tasks=4 - │ [Stage 21] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(ss_cdemo_sk@1, cd_demo_sk@0)], projection=[ss_item_sk@0, ss_hdemo_sk@2, ss_addr_sk@3, ss_promo_sk@4, ss_wholesale_cost@5, ss_list_price@6, ss_coupon_amt@7, d_year@8, s_store_name@9, s_zip@10, c_current_cdemo_sk@11, c_current_hdemo_sk@12, c_current_addr_sk@13, d_year@14, d_year@15, cd_marital_status@17] + │ [Stage 19] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 20] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([cd_demo_sk@0], 12), input_partitions=3 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet - └────────────────────────────────────────────────── - ┌───── Stage 21 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] + ┌───── Stage 19 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_cdemo_sk@1], 12), input_partitions=3 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, c_first_shipto_date_sk@14)], projection=[ss_item_sk@2, ss_cdemo_sk@3, ss_hdemo_sk@4, ss_addr_sk@5, ss_promo_sk@6, ss_wholesale_cost@7, ss_list_price@8, ss_coupon_amt@9, d_year@10, s_store_name@11, s_zip@12, c_current_cdemo_sk@13, c_current_hdemo_sk@14, c_current_addr_sk@15, d_year@17, d_year@1] │ CoalescePartitionsExec - │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, c_first_sales_date_sk@15)], projection=[ss_item_sk@2, ss_cdemo_sk@3, ss_hdemo_sk@4, ss_addr_sk@5, ss_promo_sk@6, ss_wholesale_cost@7, ss_list_price@8, ss_coupon_amt@9, d_year@10, s_store_name@11, s_zip@12, c_current_cdemo_sk@13, c_current_hdemo_sk@14, c_current_addr_sk@15, c_first_shipto_date_sk@16, d_year@1] │ CoalescePartitionsExec - │ [Stage 10] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(c_customer_sk@0, ss_customer_sk@1)], projection=[ss_item_sk@6, ss_cdemo_sk@8, ss_hdemo_sk@9, ss_addr_sk@10, ss_promo_sk@11, ss_wholesale_cost@12, ss_list_price@13, ss_coupon_amt@14, d_year@15, s_store_name@16, s_zip@17, c_current_cdemo_sk@1, c_current_hdemo_sk@2, c_current_addr_sk@3, c_first_shipto_date_sk@4, c_first_sales_date_sk@5] - │ [Stage 11] => NetworkShuffleExec: output_partitions=3, input_tasks=4 - │ [Stage 20] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 9] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 18] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 9 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 10 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 11 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([c_customer_sk@0], 12), input_partitions=2 + ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] + │ RepartitionExec: partitioning=Hash([c_customer_sk@0], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 20 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] + ┌───── Stage 18 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_customer_sk@1], 12), input_partitions=3 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(s_store_sk@0, ss_store_sk@5)], projection=[ss_item_sk@3, ss_customer_sk@4, ss_cdemo_sk@5, ss_hdemo_sk@6, ss_addr_sk@7, ss_promo_sk@9, ss_wholesale_cost@10, ss_list_price@11, ss_coupon_amt@12, d_year@13, s_store_name@1, s_zip@2] │ CoalescePartitionsExec - │ [Stage 12] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 10] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_item_sk@3, ss_customer_sk@4, ss_cdemo_sk@5, ss_hdemo_sk@6, ss_addr_sk@7, ss_store_sk@8, ss_promo_sk@9, ss_wholesale_cost@10, ss_list_price@11, ss_coupon_amt@12, d_year@1] │ CoalescePartitionsExec - │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(cs_item_sk@0, ss_item_sk@1)], projection=[ss_sold_date_sk@1, ss_item_sk@2, ss_customer_sk@3, ss_cdemo_sk@4, ss_hdemo_sk@5, ss_addr_sk@6, ss_store_sk@7, ss_promo_sk@8, ss_wholesale_cost@9, ss_list_price@10, ss_coupon_amt@11] + │ [Stage 11] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(cs_item_sk@0, ss_item_sk@1)] │ CoalescePartitionsExec - │ [Stage 17] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=2 + │ [Stage 15] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=2 │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(sr_item_sk@0, ss_item_sk@1), (sr_ticket_number@1, ss_ticket_number@8)], projection=[ss_sold_date_sk@2, ss_item_sk@3, ss_customer_sk@4, ss_cdemo_sk@5, ss_hdemo_sk@6, ss_addr_sk@7, ss_store_sk@8, ss_promo_sk@9, ss_wholesale_cost@11, ss_list_price@12, ss_coupon_amt@13] - │ [Stage 18] => NetworkShuffleExec: output_partitions=3, input_tasks=4 - │ [Stage 19] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 16] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 17] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 12 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] + ┌───── Stage 10 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:..]]}, projection=[s_store_sk, s_store_name, s_zip], file_type=parquet @@ -8291,30 +8028,29 @@ mod tests { │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_store_name, s_zip], file_type=parquet │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_store_name, s_zip], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 11 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 1999 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 1999, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1, required_guarantees=[d_year in (1999)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 1999, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1, required_guarantees=[d_year in (1999)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 1999, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1, required_guarantees=[d_year in (1999)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 1999, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1, required_guarantees=[d_year in (1999)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 1999, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1, required_guarantees=[d_year in (1999)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 1999, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1, required_guarantees=[d_year in (1999)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 1999, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1, required_guarantees=[d_year in (1999)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 1999, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1, required_guarantees=[d_year in (1999)] └────────────────────────────────────────────────── - ┌───── Stage 17 ── Tasks: t0:[p0..p11] t1:[p12..p23] + ┌───── Stage 15 ── Tasks: t0:[p0..p11] t1:[p12..p23] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: CAST(sum(catalog_sales.cs_ext_list_price)@1 AS Decimal128(38, 2)) > Some(2),20,0 * sum(catalog_returns.cr_refunded_cash + catalog_returns.cr_reversed_charge + catalog_returns.cr_store_credit)@2, projection=[cs_item_sk@0] + │ FilterExec: CAST(sum(catalog_sales.cs_ext_list_price)@1 AS Decimal128(38, 2)) > 2 * sum(catalog_returns.cr_refunded_cash + catalog_returns.cr_reversed_charge + catalog_returns.cr_store_credit)@2, projection=[cs_item_sk@0] │ AggregateExec: mode=FinalPartitioned, gby=[cs_item_sk@0 as cs_item_sk], aggr=[sum(catalog_sales.cs_ext_list_price), sum(catalog_returns.cr_refunded_cash + catalog_returns.cr_reversed_charge + catalog_returns.cr_store_credit)] - │ [Stage 16] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 14] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 16 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] + ┌───── Stage 14 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([cs_item_sk@0], 6), input_partitions=3 │ AggregateExec: mode=Partial, gby=[cs_item_sk@0 as cs_item_sk], aggr=[sum(catalog_sales.cs_ext_list_price), sum(catalog_returns.cr_refunded_cash + catalog_returns.cr_reversed_charge + catalog_returns.cr_store_credit)] │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(cr_item_sk@0, cs_item_sk@0), (cr_order_number@1, cs_order_number@1)], projection=[cs_item_sk@5, cs_ext_list_price@7, cr_refunded_cash@2, cr_reversed_charge@3, cr_store_credit@4] - │ [Stage 14] => NetworkShuffleExec: output_partitions=3, input_tasks=4 - │ [Stage 15] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 12] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 13] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 14 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] + ┌───── Stage 12 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cr_item_sk@0, cr_order_number@1], 12), input_partitions=3 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_refunded_cash, cr_reversed_charge, cr_store_credit], file_type=parquet @@ -8322,7 +8058,7 @@ mod tests { │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_refunded_cash, cr_reversed_charge, cr_store_credit], file_type=parquet │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_refunded_cash, cr_reversed_charge, cr_store_credit], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 15 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] + ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cs_item_sk@0, cs_order_number@1], 12), input_partitions=3 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_item_sk, cs_order_number, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] @@ -8330,7 +8066,7 @@ mod tests { │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_item_sk, cs_order_number, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_item_sk, cs_order_number, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 18 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] + ┌───── Stage 16 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([sr_item_sk@0, sr_ticket_number@1], 12), input_partitions=3 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number], file_type=parquet @@ -8338,27 +8074,42 @@ mod tests { │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number], file_type=parquet │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 19 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] + ┌───── Stage 17 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_item_sk@1, ss_ticket_number@8], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── + ┌───── Stage 20 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] + │ RepartitionExec: partitioning=Hash([cd_demo_sk@0], 12), input_partitions=3 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] + └────────────────────────────────────────────────── + ┌───── Stage 22 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] + │ RepartitionExec: partitioning=Hash([cd_demo_sk@0], 12), input_partitions=3 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] + └────────────────────────────────────────────────── ┌───── Stage 51 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([i_product_name@0, i_item_sk@1, s_store_name@2, s_zip@3, ca_street_number@4, ca_street_name@5, ca_city@6, ca_zip@7, ca_street_number@8, ca_street_name@9, ca_city@10, ca_zip@11, d_year@12, d_year@13, d_year@14], 6), input_partitions=3 │ AggregateExec: mode=Partial, gby=[i_product_name@17 as i_product_name, i_item_sk@16 as i_item_sk, s_store_name@6 as s_store_name, s_zip@7 as s_zip, ca_street_number@8 as ca_street_number, ca_street_name@9 as ca_street_name, ca_city@10 as ca_city, ca_zip@11 as ca_zip, ca_street_number@12 as ca_street_number, ca_street_name@13 as ca_street_name, ca_city@14 as ca_city, ca_zip@15 as ca_zip, d_year@3 as d_year, d_year@4 as d_year, d_year@5 as d_year], aggr=[count(Int64(1)), sum(store_sales.ss_wholesale_cost), sum(store_sales.ss_list_price), sum(store_sales.ss_coupon_amt)], ordering_mode=PartiallySorted([12]) │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ss_item_sk@0, i_item_sk@0)], projection=[ss_wholesale_cost@1, ss_list_price@2, ss_coupon_amt@3, d_year@4, d_year@7, d_year@8, s_store_name@5, s_zip@6, ca_street_number@9, ca_street_name@10, ca_city@11, ca_zip@12, ca_street_number@13, ca_street_name@14, ca_city@15, ca_zip@16, i_item_sk@17, i_product_name@18] │ CoalescePartitionsExec │ [Stage 50] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 - │ FilterExec: i_color@2 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@1 >= Some(6500),7,2 AND i_current_price@1 <= Some(7400),7,2, projection=[i_item_sk@0, i_product_name@3] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= Some(6500),7,2 AND i_current_price@5 <= Some(7400),7,2 AND DynamicFilter [ empty ], pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= Some(6500),7,2 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= Some(7400),7,2, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= Some(6500),7,2 AND i_current_price@5 <= Some(7400),7,2 AND DynamicFilter [ empty ], pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= Some(6500),7,2 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= Some(7400),7,2, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= Some(6500),7,2 AND i_current_price@5 <= Some(7400),7,2 AND DynamicFilter [ empty ], pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= Some(6500),7,2 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= Some(7400),7,2, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= Some(6500),7,2 AND i_current_price@5 <= Some(7400),7,2 AND DynamicFilter [ empty ], pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= Some(6500),7,2 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= Some(7400),7,2, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] + │ FilterExec: i_color@2 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@1 >= 65.00 AND i_current_price@1 <= 74.00, projection=[i_item_sk@0, i_product_name@3] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= 65.00 AND i_current_price@5 <= 74.00 AND DynamicFilter [ empty ], pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= 65.00 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= 74.00, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= 65.00 AND i_current_price@5 <= 74.00 AND DynamicFilter [ empty ], pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= 65.00 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= 74.00, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= 65.00 AND i_current_price@5 <= 74.00 AND DynamicFilter [ empty ], pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= 65.00 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= 74.00, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= 65.00 AND i_current_price@5 <= 74.00 AND DynamicFilter [ empty ], pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= 65.00 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= 74.00, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] └────────────────────────────────────────────────── ┌───── Stage 50 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -8378,10 +8129,10 @@ mod tests { │ [Stage 27] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, c_current_addr_sk@7)], projection=[ss_item_sk@5, ss_wholesale_cost@6, ss_list_price@7, ss_coupon_amt@8, d_year@9, s_store_name@10, s_zip@11, d_year@13, d_year@14, hd_income_band_sk@15, hd_income_band_sk@16, ca_street_number@17, ca_street_name@18, ca_city@19, ca_zip@20, ca_street_number@1, ca_street_name@2, ca_city@3, ca_zip@4] │ CoalescePartitionsExec - │ [Stage 28] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 28] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, ss_addr_sk@1)], projection=[ss_item_sk@5, ss_wholesale_cost@7, ss_list_price@8, ss_coupon_amt@9, d_year@10, s_store_name@11, s_zip@12, c_current_addr_sk@13, d_year@14, d_year@15, hd_income_band_sk@16, hd_income_band_sk@17, ca_street_number@1, ca_street_name@2, ca_city@3, ca_zip@4] │ CoalescePartitionsExec - │ [Stage 29] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 29] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(hd_demo_sk@0, c_current_hdemo_sk@8)], projection=[ss_item_sk@2, ss_addr_sk@3, ss_wholesale_cost@4, ss_list_price@5, ss_coupon_amt@6, d_year@7, s_store_name@8, s_zip@9, c_current_addr_sk@11, d_year@12, d_year@13, hd_income_band_sk@14, hd_income_band_sk@1] │ CoalescePartitionsExec │ [Stage 30] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 @@ -8391,8 +8142,8 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(p_promo_sk@0, ss_promo_sk@3)], projection=[ss_item_sk@1, ss_hdemo_sk@2, ss_addr_sk@3, ss_wholesale_cost@5, ss_list_price@6, ss_coupon_amt@7, d_year@8, s_store_name@9, s_zip@10, c_current_hdemo_sk@11, c_current_addr_sk@12, d_year@13, d_year@14] │ CoalescePartitionsExec │ [Stage 32] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 - │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(cd_demo_sk@0, c_current_cdemo_sk@10)], filter=cd_marital_status@1 != cd_marital_status@0, projection=[ss_item_sk@2, ss_hdemo_sk@3, ss_addr_sk@4, ss_promo_sk@5, ss_wholesale_cost@6, ss_list_price@7, ss_coupon_amt@8, d_year@9, s_store_name@10, s_zip@11, c_current_hdemo_sk@13, c_current_addr_sk@14, d_year@15, d_year@16] - │ [Stage 33] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(c_current_cdemo_sk@10, cd_demo_sk@0)], filter=cd_marital_status@1 != cd_marital_status@0, projection=[ss_item_sk@0, ss_hdemo_sk@1, ss_addr_sk@2, ss_promo_sk@3, ss_wholesale_cost@4, ss_list_price@5, ss_coupon_amt@6, d_year@7, s_store_name@8, s_zip@9, c_current_hdemo_sk@11, c_current_addr_sk@12, d_year@13, d_year@14] + │ [Stage 47] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ [Stage 48] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 27 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] @@ -8403,21 +8154,21 @@ mod tests { │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/income_band/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/income_band/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/income_band/part-3.parquet:..]]}, projection=[ib_income_band_sk], file_type=parquet │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/income_band/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/income_band/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/income_band/part-3.parquet:..]]}, projection=[ib_income_band_sk], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 28 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 28 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 29 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 29 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_city, ca_zip], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 30 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -8443,80 +8194,64 @@ mod tests { │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/promotion/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/promotion/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/promotion/part-1.parquet:..]]}, projection=[p_promo_sk], file_type=parquet │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/promotion/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/promotion/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/promotion/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/promotion/part-3.parquet:..]]}, projection=[p_promo_sk], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 33 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([cd_demo_sk@0], 12), input_partitions=3 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet - └────────────────────────────────────────────────── - ┌───── Stage 48 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] + ┌───── Stage 47 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([c_current_cdemo_sk@10], 12), input_partitions=3 - │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(cd_demo_sk@0, ss_cdemo_sk@1)], projection=[ss_item_sk@2, ss_hdemo_sk@4, ss_addr_sk@5, ss_promo_sk@6, ss_wholesale_cost@7, ss_list_price@8, ss_coupon_amt@9, d_year@10, s_store_name@11, s_zip@12, c_current_cdemo_sk@13, c_current_hdemo_sk@14, c_current_addr_sk@15, d_year@16, d_year@17, cd_marital_status@1] - │ [Stage 34] => NetworkShuffleExec: output_partitions=3, input_tasks=4 - │ [Stage 47] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(ss_cdemo_sk@1, cd_demo_sk@0)], projection=[ss_item_sk@0, ss_hdemo_sk@2, ss_addr_sk@3, ss_promo_sk@4, ss_wholesale_cost@5, ss_list_price@6, ss_coupon_amt@7, d_year@8, s_store_name@9, s_zip@10, c_current_cdemo_sk@11, c_current_hdemo_sk@12, c_current_addr_sk@13, d_year@14, d_year@15, cd_marital_status@17] + │ [Stage 45] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 46] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 34 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([cd_demo_sk@0], 12), input_partitions=3 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet - └────────────────────────────────────────────────── - ┌───── Stage 47 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] + ┌───── Stage 45 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_cdemo_sk@1], 12), input_partitions=3 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, c_first_shipto_date_sk@14)], projection=[ss_item_sk@2, ss_cdemo_sk@3, ss_hdemo_sk@4, ss_addr_sk@5, ss_promo_sk@6, ss_wholesale_cost@7, ss_list_price@8, ss_coupon_amt@9, d_year@10, s_store_name@11, s_zip@12, c_current_cdemo_sk@13, c_current_hdemo_sk@14, c_current_addr_sk@15, d_year@17, d_year@1] │ CoalescePartitionsExec - │ [Stage 35] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 33] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, c_first_sales_date_sk@15)], projection=[ss_item_sk@2, ss_cdemo_sk@3, ss_hdemo_sk@4, ss_addr_sk@5, ss_promo_sk@6, ss_wholesale_cost@7, ss_list_price@8, ss_coupon_amt@9, d_year@10, s_store_name@11, s_zip@12, c_current_cdemo_sk@13, c_current_hdemo_sk@14, c_current_addr_sk@15, c_first_shipto_date_sk@16, d_year@1] │ CoalescePartitionsExec - │ [Stage 36] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 34] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(c_customer_sk@0, ss_customer_sk@1)], projection=[ss_item_sk@6, ss_cdemo_sk@8, ss_hdemo_sk@9, ss_addr_sk@10, ss_promo_sk@11, ss_wholesale_cost@12, ss_list_price@13, ss_coupon_amt@14, d_year@15, s_store_name@16, s_zip@17, c_current_cdemo_sk@1, c_current_hdemo_sk@2, c_current_addr_sk@3, c_first_shipto_date_sk@4, c_first_sales_date_sk@5] - │ [Stage 37] => NetworkShuffleExec: output_partitions=3, input_tasks=4 - │ [Stage 46] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 35] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 44] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 35 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 33 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 36 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 34 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 37 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([c_customer_sk@0], 12), input_partitions=2 + ┌───── Stage 35 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] + │ RepartitionExec: partitioning=Hash([c_customer_sk@0], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 46 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] + ┌───── Stage 44 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_customer_sk@1], 12), input_partitions=3 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(s_store_sk@0, ss_store_sk@5)], projection=[ss_item_sk@3, ss_customer_sk@4, ss_cdemo_sk@5, ss_hdemo_sk@6, ss_addr_sk@7, ss_promo_sk@9, ss_wholesale_cost@10, ss_list_price@11, ss_coupon_amt@12, d_year@13, s_store_name@1, s_zip@2] │ CoalescePartitionsExec - │ [Stage 38] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 36] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_item_sk@3, ss_customer_sk@4, ss_cdemo_sk@5, ss_hdemo_sk@6, ss_addr_sk@7, ss_store_sk@8, ss_promo_sk@9, ss_wholesale_cost@10, ss_list_price@11, ss_coupon_amt@12, d_year@1] │ CoalescePartitionsExec - │ [Stage 39] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(cs_item_sk@0, ss_item_sk@1)], projection=[ss_sold_date_sk@1, ss_item_sk@2, ss_customer_sk@3, ss_cdemo_sk@4, ss_hdemo_sk@5, ss_addr_sk@6, ss_store_sk@7, ss_promo_sk@8, ss_wholesale_cost@9, ss_list_price@10, ss_coupon_amt@11] + │ [Stage 37] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(cs_item_sk@0, ss_item_sk@1)] │ CoalescePartitionsExec - │ [Stage 43] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=2 + │ [Stage 41] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=2 │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(sr_item_sk@0, ss_item_sk@1), (sr_ticket_number@1, ss_ticket_number@8)], projection=[ss_sold_date_sk@2, ss_item_sk@3, ss_customer_sk@4, ss_cdemo_sk@5, ss_hdemo_sk@6, ss_addr_sk@7, ss_store_sk@8, ss_promo_sk@9, ss_wholesale_cost@11, ss_list_price@12, ss_coupon_amt@13] - │ [Stage 44] => NetworkShuffleExec: output_partitions=3, input_tasks=4 - │ [Stage 45] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 42] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 43] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 38 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] + ┌───── Stage 36 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:..]]}, projection=[s_store_sk, s_store_name, s_zip], file_type=parquet @@ -8524,30 +8259,29 @@ mod tests { │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_store_name, s_zip], file_type=parquet │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_store_name, s_zip], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 39 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 37 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2000 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] └────────────────────────────────────────────────── - ┌───── Stage 43 ── Tasks: t0:[p0..p11] t1:[p12..p23] + ┌───── Stage 41 ── Tasks: t0:[p0..p11] t1:[p12..p23] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: CAST(sum(catalog_sales.cs_ext_list_price)@1 AS Decimal128(38, 2)) > Some(2),20,0 * sum(catalog_returns.cr_refunded_cash + catalog_returns.cr_reversed_charge + catalog_returns.cr_store_credit)@2, projection=[cs_item_sk@0] + │ FilterExec: CAST(sum(catalog_sales.cs_ext_list_price)@1 AS Decimal128(38, 2)) > 2 * sum(catalog_returns.cr_refunded_cash + catalog_returns.cr_reversed_charge + catalog_returns.cr_store_credit)@2, projection=[cs_item_sk@0] │ AggregateExec: mode=FinalPartitioned, gby=[cs_item_sk@0 as cs_item_sk], aggr=[sum(catalog_sales.cs_ext_list_price), sum(catalog_returns.cr_refunded_cash + catalog_returns.cr_reversed_charge + catalog_returns.cr_store_credit)] - │ [Stage 42] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 40] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 42 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] + ┌───── Stage 40 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([cs_item_sk@0], 6), input_partitions=3 │ AggregateExec: mode=Partial, gby=[cs_item_sk@0 as cs_item_sk], aggr=[sum(catalog_sales.cs_ext_list_price), sum(catalog_returns.cr_refunded_cash + catalog_returns.cr_reversed_charge + catalog_returns.cr_store_credit)] │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(cr_item_sk@0, cs_item_sk@0), (cr_order_number@1, cs_order_number@1)], projection=[cs_item_sk@5, cs_ext_list_price@7, cr_refunded_cash@2, cr_reversed_charge@3, cr_store_credit@4] - │ [Stage 40] => NetworkShuffleExec: output_partitions=3, input_tasks=4 - │ [Stage 41] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 38] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 39] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 40 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] + ┌───── Stage 38 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cr_item_sk@0, cr_order_number@1], 12), input_partitions=3 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_refunded_cash, cr_reversed_charge, cr_store_credit], file_type=parquet @@ -8555,7 +8289,7 @@ mod tests { │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_refunded_cash, cr_reversed_charge, cr_store_credit], file_type=parquet │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_refunded_cash, cr_reversed_charge, cr_store_credit], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 41 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] + ┌───── Stage 39 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cs_item_sk@0, cs_order_number@1], 12), input_partitions=3 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_item_sk, cs_order_number, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] @@ -8563,7 +8297,7 @@ mod tests { │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_item_sk, cs_order_number, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_item_sk, cs_order_number, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 44 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] + ┌───── Stage 42 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([sr_item_sk@0, sr_ticket_number@1], 12), input_partitions=3 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number], file_type=parquet @@ -8571,28 +8305,44 @@ mod tests { │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number], file_type=parquet │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 45 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] + ┌───── Stage 43 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_item_sk@1, ss_ticket_number@8], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── + ┌───── Stage 46 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] + │ RepartitionExec: partitioning=Hash([cd_demo_sk@0], 12), input_partitions=3 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] + └────────────────────────────────────────────────── + ┌───── Stage 48 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] + │ RepartitionExec: partitioning=Hash([cd_demo_sk@0], 12), input_partitions=3 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] + └────────────────────────────────────────────────── "); Ok(()) } #[tokio::test] async fn test_tpcds_65() -> Result<()> { let display = test_tpcds_query("q65").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [s_store_name@0 ASC, i_item_desc@1 ASC], fetch=100 │ [Stage 9] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 9 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ SortExec: TopK(fetch=100), expr=[s_store_name@0 ASC, i_item_desc@1 ASC], preserve_partitioning=[true] - │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(ss_store_sk@1, ss_store_sk@0)], filter=CAST(revenue@0 AS Decimal128(30, 15)) <= CAST(0.1 * CAST(ave@1 AS Float64) AS Decimal128(30, 15)), projection=[s_store_name@0, i_item_desc@3, revenue@2, i_current_price@4, i_wholesale_cost@5, i_brand@6] + │ HashJoinExec: mode=Partitioned, join_type=LeftSemi, on=[(ss_store_sk@1, ss_store_sk@0)], filter=CAST(revenue@0 AS Decimal128(30, 15)) <= CAST(0.1 * CAST(ave@1 AS Float64) AS Decimal128(30, 15)), projection=[s_store_name@0, i_item_desc@3, revenue@2, i_current_price@4, i_wholesale_cost@5, i_brand@6] │ [Stage 5] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ ProjectionExec: expr=[ss_store_sk@0 as ss_store_sk, avg(sa.revenue)@1 as ave] │ AggregateExec: mode=FinalPartitioned, gby=[ss_store_sk@0 as ss_store_sk], aggr=[avg(sa.revenue)] @@ -8602,7 +8352,7 @@ mod tests { │ RepartitionExec: partitioning=Hash([ss_store_sk@1], 12), input_partitions=3 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@2)], projection=[s_store_name@5, ss_store_sk@6, revenue@8, i_item_desc@1, i_current_price@2, i_wholesale_cost@3, i_brand@4] │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(s_store_sk@0, ss_store_sk@0)], projection=[s_store_name@1, ss_store_sk@2, ss_item_sk@3, revenue@4] │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 @@ -8610,13 +8360,13 @@ mod tests { │ AggregateExec: mode=FinalPartitioned, gby=[ss_store_sk@0 as ss_store_sk, ss_item_sk@1 as ss_item_sk], aggr=[sum(store_sales.ss_sales_price)] │ [Stage 4] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_desc, i_current_price, i_wholesale_cost, i_brand], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_desc, i_current_price, i_wholesale_cost, i_brand], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_desc, i_current_price, i_wholesale_cost, i_brand], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_desc, i_current_price, i_wholesale_cost, i_brand], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_desc, i_current_price, i_wholesale_cost, i_brand], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_desc, i_current_price, i_wholesale_cost, i_brand], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_desc, i_current_price, i_wholesale_cost, i_brand], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_desc, i_current_price, i_wholesale_cost, i_brand], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -8641,12 +8391,11 @@ mod tests { ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_month_seq@1 >= 1176 AND d_month_seq@1 <= 1187, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1176 AND d_month_seq@3 <= 1187, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1176 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1187, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1176 AND d_month_seq@3 <= 1187, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1176 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1187, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1176 AND d_month_seq@3 <= 1187, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1176 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1187, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1176 AND d_month_seq@3 <= 1187, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1176 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1187, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1176 AND d_month_seq@3 <= 1187, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1176 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1187, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1176 AND d_month_seq@3 <= 1187, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1176 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1187, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1176 AND d_month_seq@3 <= 1187, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1176 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1187, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1176 AND d_month_seq@3 <= 1187, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1176 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1187, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_store_sk@0], 12), input_partitions=3 @@ -8670,12 +8419,11 @@ mod tests { ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_month_seq@1 >= 1176 AND d_month_seq@1 <= 1187, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1176 AND d_month_seq@3 <= 1187, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1176 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1187, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1176 AND d_month_seq@3 <= 1187, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1176 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1187, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1176 AND d_month_seq@3 <= 1187, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1176 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1187, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1176 AND d_month_seq@3 <= 1187, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1176 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1187, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1176 AND d_month_seq@3 <= 1187, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1176 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1187, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1176 AND d_month_seq@3 <= 1187, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1176 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1187, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1176 AND d_month_seq@3 <= 1187, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1176 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1187, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1176 AND d_month_seq@3 <= 1187, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1176 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1187, required_guarantees=[] └────────────────────────────────────────────────── "); Ok(()) @@ -8683,7 +8431,7 @@ mod tests { #[tokio::test] async fn test_tpcds_66() -> Result<()> { let display = test_tpcds_query("q66").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [w_warehouse_name@0 ASC], fetch=100 │ SortExec: TopK(fetch=100), expr=[w_warehouse_name@0 ASC], preserve_partitioning=[true] @@ -8697,15 +8445,15 @@ mod tests { │ ProjectionExec: expr=[CAST(w_warehouse_sq_ft@1 AS Decimal128(10, 0)) as __common_expr_1, w_warehouse_name@0 as w_warehouse_name, w_warehouse_sq_ft@1 as w_warehouse_sq_ft, w_city@2 as w_city, w_county@3 as w_county, w_state@4 as w_state, w_country@5 as w_country, ship_carriers@6 as ship_carriers, year_@7 as year_, jan_sales@8 as jan_sales, feb_sales@9 as feb_sales, mar_sales@10 as mar_sales, apr_sales@11 as apr_sales, may_sales@12 as may_sales, jun_sales@13 as jun_sales, jul_sales@14 as jul_sales, aug_sales@15 as aug_sales, sep_sales@16 as sep_sales, oct_sales@17 as oct_sales, nov_sales@18 as nov_sales, dec_sales@19 as dec_sales, jan_net@20 as jan_net, feb_net@21 as feb_net, mar_net@22 as mar_net, apr_net@23 as apr_net, may_net@24 as may_net, jun_net@25 as jun_net, jul_net@26 as jul_net, aug_net@27 as aug_net, sep_net@28 as sep_net, oct_net@29 as oct_net, nov_net@30 as nov_net, dec_net@31 as dec_net] │ InterleaveExec │ ProjectionExec: expr=[w_warehouse_name@0 as w_warehouse_name, w_warehouse_sq_ft@1 as w_warehouse_sq_ft, w_city@2 as w_city, w_county@3 as w_county, w_state@4 as w_state, w_country@5 as w_country, DHL,BARIAN as ship_carriers, d_year@6 as year_, sum(CASE WHEN date_dim.d_moy = Int64(1) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END)@7 as jan_sales, sum(CASE WHEN date_dim.d_moy = Int64(2) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END)@8 as feb_sales, sum(CASE WHEN date_dim.d_moy = Int64(3) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END)@9 as mar_sales, sum(CASE WHEN date_dim.d_moy = Int64(4) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END)@10 as apr_sales, sum(CASE WHEN date_dim.d_moy = Int64(5) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END)@11 as may_sales, sum(CASE WHEN date_dim.d_moy = Int64(6) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END)@12 as jun_sales, sum(CASE WHEN date_dim.d_moy = Int64(7) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END)@13 as jul_sales, sum(CASE WHEN date_dim.d_moy = Int64(8) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END)@14 as aug_sales, sum(CASE WHEN date_dim.d_moy = Int64(9) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END)@15 as sep_sales, sum(CASE WHEN date_dim.d_moy = Int64(10) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END)@16 as oct_sales, sum(CASE WHEN date_dim.d_moy = Int64(11) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END)@17 as nov_sales, sum(CASE WHEN date_dim.d_moy = Int64(12) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END)@18 as dec_sales, sum(CASE WHEN date_dim.d_moy = Int64(1) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END)@19 as jan_net, sum(CASE WHEN date_dim.d_moy = Int64(2) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END)@20 as feb_net, sum(CASE WHEN date_dim.d_moy = Int64(3) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END)@21 as mar_net, sum(CASE WHEN date_dim.d_moy = Int64(4) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END)@22 as apr_net, sum(CASE WHEN date_dim.d_moy = Int64(5) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END)@23 as may_net, sum(CASE WHEN date_dim.d_moy = Int64(6) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END)@24 as jun_net, sum(CASE WHEN date_dim.d_moy = Int64(7) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END)@25 as jul_net, sum(CASE WHEN date_dim.d_moy = Int64(8) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END)@26 as aug_net, sum(CASE WHEN date_dim.d_moy = Int64(9) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END)@27 as sep_net, sum(CASE WHEN date_dim.d_moy = Int64(10) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END)@28 as oct_net, sum(CASE WHEN date_dim.d_moy = Int64(11) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END)@29 as nov_net, sum(CASE WHEN date_dim.d_moy = Int64(12) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END)@30 as dec_net] - │ AggregateExec: mode=FinalPartitioned, gby=[w_warehouse_name@0 as w_warehouse_name, w_warehouse_sq_ft@1 as w_warehouse_sq_ft, w_city@2 as w_city, w_county@3 as w_county, w_state@4 as w_state, w_country@5 as w_country, d_year@6 as d_year], aggr=[sum(CASE WHEN __common_expr_2 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(1) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_3 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(2) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_4 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(3) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_5 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(4) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_6 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(5) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_7 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(6) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_8 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(7) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_9 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(8) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_10 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(9) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_11 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(10) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_12 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(11) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_13 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(12) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_2 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(1) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_3 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(2) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_4 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(3) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_5 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(4) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_6 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(5) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_7 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(6) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_8 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(7) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_9 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(8) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_10 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(9) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_11 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(10) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_12 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(11) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_13 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(12) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END)], ordering_mode=PartiallySorted([6]) + │ AggregateExec: mode=FinalPartitioned, gby=[w_warehouse_name@0 as w_warehouse_name, w_warehouse_sq_ft@1 as w_warehouse_sq_ft, w_city@2 as w_city, w_county@3 as w_county, w_state@4 as w_state, w_country@5 as w_country, d_year@6 as d_year], aggr=[sum(CASE WHEN __common_expr_2 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(1) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_3 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(2) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_4 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(3) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_5 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(4) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_6 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(5) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_7 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(6) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_8 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(7) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_9 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(8) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_10 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(9) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_11 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(10) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_12 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(11) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_13 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(12) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_2 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(1) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_3 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(2) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_4 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(3) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_5 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(4) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_6 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(5) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_7 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(6) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_8 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(7) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_9 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(8) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_10 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(9) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_11 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(10) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_12 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(11) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_13 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(12) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END)], ordering_mode=PartiallySorted([6]) │ [Stage 5] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ ProjectionExec: expr=[w_warehouse_name@0 as w_warehouse_name, w_warehouse_sq_ft@1 as w_warehouse_sq_ft, w_city@2 as w_city, w_county@3 as w_county, w_state@4 as w_state, w_country@5 as w_country, DHL,BARIAN as ship_carriers, d_year@6 as year_, sum(CASE WHEN date_dim.d_moy = Int64(1) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END)@7 as jan_sales, sum(CASE WHEN date_dim.d_moy = Int64(2) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END)@8 as feb_sales, sum(CASE WHEN date_dim.d_moy = Int64(3) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END)@9 as mar_sales, sum(CASE WHEN date_dim.d_moy = Int64(4) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END)@10 as apr_sales, sum(CASE WHEN date_dim.d_moy = Int64(5) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END)@11 as may_sales, sum(CASE WHEN date_dim.d_moy = Int64(6) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END)@12 as jun_sales, sum(CASE WHEN date_dim.d_moy = Int64(7) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END)@13 as jul_sales, sum(CASE WHEN date_dim.d_moy = Int64(8) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END)@14 as aug_sales, sum(CASE WHEN date_dim.d_moy = Int64(9) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END)@15 as sep_sales, sum(CASE WHEN date_dim.d_moy = Int64(10) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END)@16 as oct_sales, sum(CASE WHEN date_dim.d_moy = Int64(11) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END)@17 as nov_sales, sum(CASE WHEN date_dim.d_moy = Int64(12) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END)@18 as dec_sales, sum(CASE WHEN date_dim.d_moy = Int64(1) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END)@19 as jan_net, sum(CASE WHEN date_dim.d_moy = Int64(2) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END)@20 as feb_net, sum(CASE WHEN date_dim.d_moy = Int64(3) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END)@21 as mar_net, sum(CASE WHEN date_dim.d_moy = Int64(4) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END)@22 as apr_net, sum(CASE WHEN date_dim.d_moy = Int64(5) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END)@23 as may_net, sum(CASE WHEN date_dim.d_moy = Int64(6) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END)@24 as jun_net, sum(CASE WHEN date_dim.d_moy = Int64(7) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END)@25 as jul_net, sum(CASE WHEN date_dim.d_moy = Int64(8) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END)@26 as aug_net, sum(CASE WHEN date_dim.d_moy = Int64(9) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END)@27 as sep_net, sum(CASE WHEN date_dim.d_moy = Int64(10) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END)@28 as oct_net, sum(CASE WHEN date_dim.d_moy = Int64(11) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END)@29 as nov_net, sum(CASE WHEN date_dim.d_moy = Int64(12) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END)@30 as dec_net] - │ AggregateExec: mode=FinalPartitioned, gby=[w_warehouse_name@0 as w_warehouse_name, w_warehouse_sq_ft@1 as w_warehouse_sq_ft, w_city@2 as w_city, w_county@3 as w_county, w_state@4 as w_state, w_country@5 as w_country, d_year@6 as d_year], aggr=[sum(CASE WHEN __common_expr_14 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(1) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_15 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(2) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_16 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(3) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_17 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(4) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_18 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(5) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_19 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(6) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_20 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(7) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_21 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(8) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_22 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(9) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_23 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(10) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_24 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(11) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_25 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(12) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_14 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(1) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_15 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(2) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_16 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(3) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_17 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(4) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_18 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(5) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_19 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(6) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_20 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(7) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_21 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(8) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_22 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(9) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_23 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(10) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_24 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(11) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_25 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(12) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END)], ordering_mode=PartiallySorted([6]) + │ AggregateExec: mode=FinalPartitioned, gby=[w_warehouse_name@0 as w_warehouse_name, w_warehouse_sq_ft@1 as w_warehouse_sq_ft, w_city@2 as w_city, w_county@3 as w_county, w_state@4 as w_state, w_country@5 as w_country, d_year@6 as d_year], aggr=[sum(CASE WHEN __common_expr_14 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(1) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_15 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(2) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_16 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(3) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_17 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(4) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_18 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(5) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_19 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(6) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_20 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(7) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_21 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(8) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_22 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(9) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_23 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(10) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_24 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(11) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_25 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(12) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_14 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(1) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_15 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(2) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_16 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(3) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_17 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(4) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_18 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(5) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_19 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(6) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_20 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(7) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_21 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(8) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_22 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(9) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_23 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(10) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_24 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(11) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_25 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(12) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END)], ordering_mode=PartiallySorted([6]) │ [Stage 10] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([w_warehouse_name@0, w_warehouse_sq_ft@1, w_city@2, w_county@3, w_state@4, w_country@5, d_year@6], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[w_warehouse_name@15 as w_warehouse_name, w_warehouse_sq_ft@16 as w_warehouse_sq_ft, w_city@17 as w_city, w_county@18 as w_county, w_state@19 as w_state, w_country@20 as w_country, d_year@21 as d_year], aggr=[sum(CASE WHEN __common_expr_2 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(1) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_3 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(2) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_4 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(3) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_5 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(4) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_6 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(5) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_7 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(6) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_8 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(7) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_9 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(8) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_10 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(9) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_11 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(10) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_12 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(11) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_13 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(12) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_2 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(1) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_3 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(2) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_4 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(3) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_5 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(4) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_6 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(5) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_7 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(6) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_8 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(7) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_9 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(8) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_10 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(9) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_11 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(10) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_12 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(11) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_13 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(12) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END)], ordering_mode=PartiallySorted([6]) + │ AggregateExec: mode=Partial, gby=[w_warehouse_name@15 as w_warehouse_name, w_warehouse_sq_ft@16 as w_warehouse_sq_ft, w_city@17 as w_city, w_county@18 as w_county, w_state@19 as w_state, w_country@20 as w_country, d_year@21 as d_year], aggr=[sum(CASE WHEN __common_expr_2 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(1) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_3 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(2) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_4 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(3) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_5 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(4) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_6 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(5) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_7 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(6) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_8 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(7) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_9 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(8) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_10 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(9) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_11 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(10) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_12 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(11) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_13 THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(12) THEN web_sales.ws_ext_sales_price * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_2 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(1) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_3 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(2) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_4 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(3) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_5 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(4) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_6 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(5) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_7 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(6) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_8 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(7) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_9 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(8) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_10 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(9) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_11 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(10) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_12 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(11) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_13 THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(12) THEN web_sales.ws_net_paid * web_sales.ws_quantity ELSE Int64(0) END)], ordering_mode=PartiallySorted([6]) │ ProjectionExec: expr=[d_moy@0 = 1 as __common_expr_2, d_moy@0 = 2 as __common_expr_3, d_moy@0 = 3 as __common_expr_4, d_moy@0 = 4 as __common_expr_5, d_moy@0 = 5 as __common_expr_6, d_moy@0 = 6 as __common_expr_7, d_moy@0 = 7 as __common_expr_8, d_moy@0 = 8 as __common_expr_9, d_moy@0 = 9 as __common_expr_10, d_moy@0 = 10 as __common_expr_11, d_moy@0 = 11 as __common_expr_12, d_moy@0 = 12 as __common_expr_13, ws_quantity@1 as ws_quantity, ws_ext_sales_price@2 as ws_ext_sales_price, ws_net_paid@3 as ws_net_paid, w_warehouse_name@4 as w_warehouse_name, w_warehouse_sq_ft@5 as w_warehouse_sq_ft, w_city@6 as w_city, w_county@7 as w_county, w_state@8 as w_state, w_country@9 as w_country, d_year@10 as d_year] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(sm_ship_mode_sk@0, ws_ship_mode_sk@0)], projection=[d_moy@12, ws_quantity@2, ws_ext_sales_price@3, ws_net_paid@4, w_warehouse_name@5, w_warehouse_sq_ft@6, w_city@7, w_county@8, w_state@9, w_country@10, d_year@11] │ CoalescePartitionsExec @@ -8738,22 +8486,20 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: t_time@1 >= 30838 AND t_time@1 <= 59638, projection=[t_time_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_time], file_type=parquet, predicate=t_time@2 >= 30838 AND t_time@2 <= 59638, pruning_predicate=t_time_null_count@1 != row_count@2 AND t_time_max@0 >= 30838 AND t_time_null_count@1 != row_count@2 AND t_time_min@3 <= 59638, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_time], file_type=parquet, predicate=t_time@2 >= 30838 AND t_time@2 <= 59638, pruning_predicate=t_time_null_count@1 != row_count@2 AND t_time_max@0 >= 30838 AND t_time_null_count@1 != row_count@2 AND t_time_min@3 <= 59638, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_time], file_type=parquet, predicate=t_time@2 >= 30838 AND t_time@2 <= 59638, pruning_predicate=t_time_null_count@1 != row_count@2 AND t_time_max@0 >= 30838 AND t_time_null_count@1 != row_count@2 AND t_time_min@3 <= 59638, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_time], file_type=parquet, predicate=t_time@2 >= 30838 AND t_time@2 <= 59638, pruning_predicate=t_time_null_count@1 != row_count@2 AND t_time_max@0 >= 30838 AND t_time_null_count@1 != row_count@2 AND t_time_min@3 <= 59638, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_time], file_type=parquet, predicate=t_time@2 >= 30838 AND t_time@2 <= 59638, pruning_predicate=t_time_null_count@1 != row_count@2 AND t_time_max@0 >= 30838 AND t_time_null_count@1 != row_count@2 AND t_time_min@3 <= 59638, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_time], file_type=parquet, predicate=t_time@2 >= 30838 AND t_time@2 <= 59638, pruning_predicate=t_time_null_count@1 != row_count@2 AND t_time_max@0 >= 30838 AND t_time_null_count@1 != row_count@2 AND t_time_min@3 <= 59638, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_time], file_type=parquet, predicate=t_time@2 >= 30838 AND t_time@2 <= 59638, pruning_predicate=t_time_null_count@1 != row_count@2 AND t_time_max@0 >= 30838 AND t_time_null_count@1 != row_count@2 AND t_time_min@3 <= 59638, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_time], file_type=parquet, predicate=t_time@2 >= 30838 AND t_time@2 <= 59638, pruning_predicate=t_time_null_count@1 != row_count@2 AND t_time_max@0 >= 30838 AND t_time_null_count@1 != row_count@2 AND t_time_min@3 <= 59638, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2001 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -8765,7 +8511,7 @@ mod tests { └────────────────────────────────────────────────── ┌───── Stage 10 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([w_warehouse_name@0, w_warehouse_sq_ft@1, w_city@2, w_county@3, w_state@4, w_country@5, d_year@6], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[w_warehouse_name@15 as w_warehouse_name, w_warehouse_sq_ft@16 as w_warehouse_sq_ft, w_city@17 as w_city, w_county@18 as w_county, w_state@19 as w_state, w_country@20 as w_country, d_year@21 as d_year], aggr=[sum(CASE WHEN __common_expr_14 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(1) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_15 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(2) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_16 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(3) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_17 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(4) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_18 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(5) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_19 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(6) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_20 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(7) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_21 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(8) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_22 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(9) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_23 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(10) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_24 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(11) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_25 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(12) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_14 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(1) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_15 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(2) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_16 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(3) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_17 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(4) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_18 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(5) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_19 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(6) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_20 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(7) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_21 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(8) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_22 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(9) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_23 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(10) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_24 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(11) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_25 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Some(0),22,2 END) as sum(CASE WHEN date_dim.d_moy = Int64(12) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END)], ordering_mode=PartiallySorted([6]) + │ AggregateExec: mode=Partial, gby=[w_warehouse_name@15 as w_warehouse_name, w_warehouse_sq_ft@16 as w_warehouse_sq_ft, w_city@17 as w_city, w_county@18 as w_county, w_state@19 as w_state, w_country@20 as w_country, d_year@21 as d_year], aggr=[sum(CASE WHEN __common_expr_14 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(1) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_15 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(2) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_16 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(3) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_17 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(4) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_18 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(5) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_19 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(6) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_20 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(7) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_21 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(8) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_22 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(9) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_23 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(10) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_24 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(11) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_25 THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(12) THEN catalog_sales.cs_sales_price * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_14 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(1) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_15 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(2) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_16 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(3) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_17 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(4) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_18 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(5) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_19 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(6) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_20 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(7) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_21 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(8) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_22 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(9) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_23 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(10) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_24 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(11) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END), sum(CASE WHEN __common_expr_25 THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE 0.00 END) as sum(CASE WHEN date_dim.d_moy = Int64(12) THEN catalog_sales.cs_net_paid_inc_tax * catalog_sales.cs_quantity ELSE Int64(0) END)], ordering_mode=PartiallySorted([6]) │ ProjectionExec: expr=[d_moy@0 = 1 as __common_expr_14, d_moy@0 = 2 as __common_expr_15, d_moy@0 = 3 as __common_expr_16, d_moy@0 = 4 as __common_expr_17, d_moy@0 = 5 as __common_expr_18, d_moy@0 = 6 as __common_expr_19, d_moy@0 = 7 as __common_expr_20, d_moy@0 = 8 as __common_expr_21, d_moy@0 = 9 as __common_expr_22, d_moy@0 = 10 as __common_expr_23, d_moy@0 = 11 as __common_expr_24, d_moy@0 = 12 as __common_expr_25, cs_quantity@1 as cs_quantity, cs_sales_price@2 as cs_sales_price, cs_net_paid_inc_tax@3 as cs_net_paid_inc_tax, w_warehouse_name@4 as w_warehouse_name, w_warehouse_sq_ft@5 as w_warehouse_sq_ft, w_city@6 as w_city, w_county@7 as w_county, w_state@8 as w_state, w_country@9 as w_country, d_year@10 as d_year] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(sm_ship_mode_sk@0, cs_ship_mode_sk@0)], projection=[d_moy@12, cs_quantity@2, cs_sales_price@3, cs_net_paid_inc_tax@4, w_warehouse_name@5, w_warehouse_sq_ft@6, w_city@7, w_county@8, w_state@9, w_country@10, d_year@11] │ CoalescePartitionsExec @@ -8798,22 +8544,20 @@ mod tests { ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: t_time@1 >= 30838 AND t_time@1 <= 59638, projection=[t_time_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_time], file_type=parquet, predicate=t_time@2 >= 30838 AND t_time@2 <= 59638, pruning_predicate=t_time_null_count@1 != row_count@2 AND t_time_max@0 >= 30838 AND t_time_null_count@1 != row_count@2 AND t_time_min@3 <= 59638, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_time], file_type=parquet, predicate=t_time@2 >= 30838 AND t_time@2 <= 59638, pruning_predicate=t_time_null_count@1 != row_count@2 AND t_time_max@0 >= 30838 AND t_time_null_count@1 != row_count@2 AND t_time_min@3 <= 59638, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_time], file_type=parquet, predicate=t_time@2 >= 30838 AND t_time@2 <= 59638, pruning_predicate=t_time_null_count@1 != row_count@2 AND t_time_max@0 >= 30838 AND t_time_null_count@1 != row_count@2 AND t_time_min@3 <= 59638, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_time], file_type=parquet, predicate=t_time@2 >= 30838 AND t_time@2 <= 59638, pruning_predicate=t_time_null_count@1 != row_count@2 AND t_time_max@0 >= 30838 AND t_time_null_count@1 != row_count@2 AND t_time_min@3 <= 59638, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_time], file_type=parquet, predicate=t_time@2 >= 30838 AND t_time@2 <= 59638, pruning_predicate=t_time_null_count@1 != row_count@2 AND t_time_max@0 >= 30838 AND t_time_null_count@1 != row_count@2 AND t_time_min@3 <= 59638, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_time], file_type=parquet, predicate=t_time@2 >= 30838 AND t_time@2 <= 59638, pruning_predicate=t_time_null_count@1 != row_count@2 AND t_time_max@0 >= 30838 AND t_time_null_count@1 != row_count@2 AND t_time_min@3 <= 59638, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_time], file_type=parquet, predicate=t_time@2 >= 30838 AND t_time@2 <= 59638, pruning_predicate=t_time_null_count@1 != row_count@2 AND t_time_max@0 >= 30838 AND t_time_null_count@1 != row_count@2 AND t_time_min@3 <= 59638, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_time], file_type=parquet, predicate=t_time@2 >= 30838 AND t_time@2 <= 59638, pruning_predicate=t_time_null_count@1 != row_count@2 AND t_time_max@0 >= 30838 AND t_time_null_count@1 != row_count@2 AND t_time_min@3 <= 59638, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2001 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] └────────────────────────────────────────────────── ┌───── Stage 9 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -8842,16 +8586,16 @@ mod tests { ┌───── Stage 5 ── Tasks: t0:[p0..p2] t1:[p0..p2] │ RepartitionExec: partitioning=Hash([i_category@0], 3), input_partitions=3 │ ProjectionExec: expr=[i_category@0 as i_category, i_class@1 as i_class, i_brand@2 as i_brand, i_product_name@3 as i_product_name, d_year@4 as d_year, d_qoy@5 as d_qoy, d_moy@6 as d_moy, s_store_id@7 as s_store_id, sum(coalesce(store_sales.ss_sales_price * store_sales.ss_quantity,Int64(0)))@9 as sumsales] - │ AggregateExec: mode=FinalPartitioned, gby=[i_category@0 as i_category, i_class@1 as i_class, i_brand@2 as i_brand, i_product_name@3 as i_product_name, d_year@4 as d_year, d_qoy@5 as d_qoy, d_moy@6 as d_moy, s_store_id@7 as s_store_id, __grouping_id@8 as __grouping_id], aggr=[sum(CASE WHEN __common_expr_1 IS NOT NULL THEN __common_expr_1 ELSE Some(0),22,2 END) as sum(coalesce(store_sales.ss_sales_price * store_sales.ss_quantity,Int64(0)))] + │ AggregateExec: mode=FinalPartitioned, gby=[i_category@0 as i_category, i_class@1 as i_class, i_brand@2 as i_brand, i_product_name@3 as i_product_name, d_year@4 as d_year, d_qoy@5 as d_qoy, d_moy@6 as d_moy, s_store_id@7 as s_store_id, __grouping_id@8 as __grouping_id], aggr=[sum(CASE WHEN __common_expr_1 IS NOT NULL THEN __common_expr_1 ELSE 0.00 END) as sum(coalesce(store_sales.ss_sales_price * store_sales.ss_quantity,Int64(0)))] │ [Stage 4] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([i_category@0, i_class@1, i_brand@2, i_product_name@3, d_year@4, d_qoy@5, d_moy@6, s_store_id@7, __grouping_id@8], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[(NULL as i_category, NULL as i_class, NULL as i_brand, NULL as i_product_name, NULL as d_year, NULL as d_qoy, NULL as d_moy, NULL as s_store_id), (i_category@7 as i_category, NULL as i_class, NULL as i_brand, NULL as i_product_name, NULL as d_year, NULL as d_qoy, NULL as d_moy, NULL as s_store_id), (i_category@7 as i_category, i_class@6 as i_class, NULL as i_brand, NULL as i_product_name, NULL as d_year, NULL as d_qoy, NULL as d_moy, NULL as s_store_id), (i_category@7 as i_category, i_class@6 as i_class, i_brand@5 as i_brand, NULL as i_product_name, NULL as d_year, NULL as d_qoy, NULL as d_moy, NULL as s_store_id), (i_category@7 as i_category, i_class@6 as i_class, i_brand@5 as i_brand, i_product_name@8 as i_product_name, NULL as d_year, NULL as d_qoy, NULL as d_moy, NULL as s_store_id), (i_category@7 as i_category, i_class@6 as i_class, i_brand@5 as i_brand, i_product_name@8 as i_product_name, d_year@1 as d_year, NULL as d_qoy, NULL as d_moy, NULL as s_store_id), (i_category@7 as i_category, i_class@6 as i_class, i_brand@5 as i_brand, i_product_name@8 as i_product_name, d_year@1 as d_year, d_qoy@3 as d_qoy, NULL as d_moy, NULL as s_store_id), (i_category@7 as i_category, i_class@6 as i_class, i_brand@5 as i_brand, i_product_name@8 as i_product_name, d_year@1 as d_year, d_qoy@3 as d_qoy, d_moy@2 as d_moy, NULL as s_store_id), (i_category@7 as i_category, i_class@6 as i_class, i_brand@5 as i_brand, i_product_name@8 as i_product_name, d_year@1 as d_year, d_qoy@3 as d_qoy, d_moy@2 as d_moy, s_store_id@4 as s_store_id)], aggr=[sum(CASE WHEN __common_expr_1 IS NOT NULL THEN __common_expr_1 ELSE Some(0),22,2 END) as sum(coalesce(store_sales.ss_sales_price * store_sales.ss_quantity,Int64(0)))] + │ AggregateExec: mode=Partial, gby=[(NULL as i_category, NULL as i_class, NULL as i_brand, NULL as i_product_name, NULL as d_year, NULL as d_qoy, NULL as d_moy, NULL as s_store_id), (i_category@7 as i_category, NULL as i_class, NULL as i_brand, NULL as i_product_name, NULL as d_year, NULL as d_qoy, NULL as d_moy, NULL as s_store_id), (i_category@7 as i_category, i_class@6 as i_class, NULL as i_brand, NULL as i_product_name, NULL as d_year, NULL as d_qoy, NULL as d_moy, NULL as s_store_id), (i_category@7 as i_category, i_class@6 as i_class, i_brand@5 as i_brand, NULL as i_product_name, NULL as d_year, NULL as d_qoy, NULL as d_moy, NULL as s_store_id), (i_category@7 as i_category, i_class@6 as i_class, i_brand@5 as i_brand, i_product_name@8 as i_product_name, NULL as d_year, NULL as d_qoy, NULL as d_moy, NULL as s_store_id), (i_category@7 as i_category, i_class@6 as i_class, i_brand@5 as i_brand, i_product_name@8 as i_product_name, d_year@1 as d_year, NULL as d_qoy, NULL as d_moy, NULL as s_store_id), (i_category@7 as i_category, i_class@6 as i_class, i_brand@5 as i_brand, i_product_name@8 as i_product_name, d_year@1 as d_year, d_qoy@3 as d_qoy, NULL as d_moy, NULL as s_store_id), (i_category@7 as i_category, i_class@6 as i_class, i_brand@5 as i_brand, i_product_name@8 as i_product_name, d_year@1 as d_year, d_qoy@3 as d_qoy, d_moy@2 as d_moy, NULL as s_store_id), (i_category@7 as i_category, i_class@6 as i_class, i_brand@5 as i_brand, i_product_name@8 as i_product_name, d_year@1 as d_year, d_qoy@3 as d_qoy, d_moy@2 as d_moy, s_store_id@4 as s_store_id)], aggr=[sum(CASE WHEN __common_expr_1 IS NOT NULL THEN __common_expr_1 ELSE 0.00 END) as sum(coalesce(store_sales.ss_sales_price * store_sales.ss_quantity,Int64(0)))] │ ProjectionExec: expr=[CAST(ss_sales_price@0 * CAST(ss_quantity@1 AS Decimal128(10, 0)) AS Decimal128(22, 2)) as __common_expr_1, d_year@2 as d_year, d_moy@3 as d_moy, d_qoy@4 as d_qoy, s_store_id@5 as s_store_id, i_brand@6 as i_brand, i_class@7 as i_class, i_category@8 as i_category, i_product_name@9 as i_product_name] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@0)], projection=[ss_sales_price@7, ss_quantity@6, d_year@8, d_moy@9, d_qoy@10, s_store_id@11, i_brand@1, i_class@2, i_category@3, i_product_name@4] │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(s_store_sk@0, ss_store_sk@1)], projection=[ss_item_sk@2, ss_quantity@4, ss_sales_price@5, d_year@6, d_moy@7, d_qoy@8, s_store_id@1] │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 @@ -8864,13 +8608,13 @@ mod tests { │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_product_name], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_product_name], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_product_name], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_product_name], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_product_name], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_product_name], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_product_name], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category, i_product_name], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -8883,12 +8627,11 @@ mod tests { ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_month_seq@1 >= 1200 AND d_month_seq@1 <= 1211, projection=[d_date_sk@0, d_year@2, d_moy@3, d_qoy@4] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq, d_year, d_moy, d_qoy], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq, d_year, d_moy, d_qoy], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq, d_year, d_moy, d_qoy], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq, d_year, d_moy, d_qoy], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq, d_year, d_moy, d_qoy], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq, d_year, d_moy, d_qoy], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq, d_year, d_moy, d_qoy], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq, d_year, d_moy, d_qoy], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] └────────────────────────────────────────────────── "#); Ok(()) @@ -8896,7 +8639,7 @@ mod tests { #[tokio::test] async fn test_tpcds_68() -> Result<()> { let display = test_tpcds_query("q68").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [c_last_name@0 ASC, ss_ticket_number@4 ASC], fetch=100 │ [Stage 8] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 @@ -8905,36 +8648,36 @@ mod tests { │ SortExec: TopK(fetch=100), expr=[c_last_name@0 ASC, ss_ticket_number@4 ASC], preserve_partitioning=[true] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, c_current_addr_sk@5)], filter=bought_city@0 != ca_city@1, projection=[c_last_name@9, c_first_name@8, ca_city@1, bought_city@3, ss_ticket_number@2, extended_price@4, extended_tax@6, list_price@5] │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ss_customer_sk@1)], projection=[ss_ticket_number@4, bought_city@6, extended_price@7, list_price@8, extended_tax@9, c_current_addr_sk@1, c_first_name@2, c_last_name@3] │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ ProjectionExec: expr=[ss_ticket_number@0 as ss_ticket_number, ss_customer_sk@1 as ss_customer_sk, ca_city@3 as bought_city, sum(store_sales.ss_ext_sales_price)@4 as extended_price, sum(store_sales.ss_ext_list_price)@5 as list_price, sum(store_sales.ss_ext_tax)@6 as extended_tax] │ AggregateExec: mode=FinalPartitioned, gby=[ss_ticket_number@0 as ss_ticket_number, ss_customer_sk@1 as ss_customer_sk, ss_addr_sk@2 as ss_addr_sk, ca_city@3 as ca_city], aggr=[sum(store_sales.ss_ext_sales_price), sum(store_sales.ss_ext_list_price), sum(store_sales.ss_ext_tax)] │ [Stage 7] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_ticket_number@0, ss_customer_sk@1, ss_addr_sk@2, ca_city@3], 12), input_partitions=3 │ AggregateExec: mode=Partial, gby=[ss_ticket_number@2 as ss_ticket_number, ss_customer_sk@0 as ss_customer_sk, ss_addr_sk@1 as ss_addr_sk, ca_city@6 as ca_city], aggr=[sum(store_sales.ss_ext_sales_price), sum(store_sales.ss_ext_list_price), sum(store_sales.ss_ext_tax)] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, ss_addr_sk@1)], projection=[ss_customer_sk@2, ss_addr_sk@3, ss_ticket_number@4, ss_ext_sales_price@5, ss_ext_list_price@6, ss_ext_tax@7, ca_city@1] │ CoalescePartitionsExec - │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(hd_demo_sk@0, ss_hdemo_sk@1)], projection=[ss_customer_sk@1, ss_addr_sk@3, ss_ticket_number@4, ss_ext_sales_price@5, ss_ext_list_price@6, ss_ext_tax@7] │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -8950,13 +8693,13 @@ mod tests { │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_ticket_number, ss_ext_sales_price, ss_ext_list_price, ss_ext_tax], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_ticket_number, ss_ext_sales_price, ss_ext_list_price, ss_ext_tax], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 3 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -8981,12 +8724,11 @@ mod tests { ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_dom@2 >= 1 AND d_dom@2 <= 2 AND (d_year@1 = 1999 OR d_year@1 = 2000 OR d_year@1 = 2001), projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_dom], file_type=parquet, predicate=d_dom@9 >= 1 AND d_dom@9 <= 2 AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 1 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 2 AND (d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_year in (1999, 2000, 2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_dom], file_type=parquet, predicate=d_dom@9 >= 1 AND d_dom@9 <= 2 AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 1 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 2 AND (d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_year in (1999, 2000, 2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_dom], file_type=parquet, predicate=d_dom@9 >= 1 AND d_dom@9 <= 2 AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 1 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 2 AND (d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_year in (1999, 2000, 2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_dom], file_type=parquet, predicate=d_dom@9 >= 1 AND d_dom@9 <= 2 AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 1 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 2 AND (d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_year in (1999, 2000, 2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_dom], file_type=parquet, predicate=d_dom@9 >= 1 AND d_dom@9 <= 2 AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 1 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 2 AND (d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_year in (1999, 2000, 2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_dom], file_type=parquet, predicate=d_dom@9 >= 1 AND d_dom@9 <= 2 AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 1 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 2 AND (d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_year in (1999, 2000, 2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_dom], file_type=parquet, predicate=d_dom@9 >= 1 AND d_dom@9 <= 2 AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 1 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 2 AND (d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_year in (1999, 2000, 2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_dom], file_type=parquet, predicate=d_dom@9 >= 1 AND d_dom@9 <= 2 AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 1 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 2 AND (d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_year in (1999, 2000, 2001)] └────────────────────────────────────────────────── "); Ok(()) @@ -8994,7 +8736,7 @@ mod tests { #[tokio::test] async fn test_tpcds_69() -> Result<()> { let display = test_tpcds_query("q69").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [cd_gender@0 ASC NULLS LAST, cd_marital_status@1 ASC NULLS LAST, cd_education_status@2 ASC NULLS LAST, cd_purchase_estimate@4 ASC NULLS LAST, cd_credit_rating@6 ASC NULLS LAST], fetch=100 │ SortExec: TopK(fetch=100), expr=[cd_gender@0 ASC NULLS LAST, cd_marital_status@1 ASC NULLS LAST, cd_education_status@2 ASC NULLS LAST, cd_purchase_estimate@4 ASC NULLS LAST, cd_credit_rating@6 ASC NULLS LAST], preserve_partitioning=[true] @@ -9004,88 +8746,90 @@ mod tests { │ AggregateExec: mode=Partial, gby=[cd_gender@0 as cd_gender, cd_marital_status@1 as cd_marital_status, cd_education_status@2 as cd_education_status, cd_purchase_estimate@3 as cd_purchase_estimate, cd_credit_rating@4 as cd_credit_rating], aggr=[count(Int64(1))] │ HashJoinExec: mode=CollectLeft, join_type=LeftAnti, on=[(c_customer_sk@0, cs_ship_customer_sk@0)], projection=[cd_gender@1, cd_marital_status@2, cd_education_status@3, cd_purchase_estimate@4, cd_credit_rating@5] │ CoalescePartitionsExec - │ HashJoinExec: mode=CollectLeft, join_type=LeftAnti, on=[(c_customer_sk@0, ws_bill_customer_sk@0)] + │ HashJoinExec: mode=CollectLeft, join_type=RightAnti, on=[(ws_bill_customer_sk@0, c_customer_sk@0)] │ CoalescePartitionsExec - │ HashJoinExec: mode=CollectLeft, join_type=LeftSemi, on=[(c_customer_sk@0, ss_customer_sk@0)] - │ CoalescePartitionsExec - │ [Stage 3] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_customer_sk@2] - │ CoalescePartitionsExec - │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[ws_bill_customer_sk@2] + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=LeftSemi, on=[(c_customer_sk@0, ss_customer_sk@0)] │ CoalescePartitionsExec - │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_ship_customer_sk@2] + │ [Stage 5] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_customer_sk@1] + │ CoalescePartitionsExec + │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_ship_customer_sk@1] │ CoalescePartitionsExec - │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 + │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_ship_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 3 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + ┌───── Stage 2 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[ws_bill_customer_sk@1] + │ CoalescePartitionsExec + │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + └────────────────────────────────────────────────── + ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ FilterExec: d_year@1 = 2001 AND d_moy@2 >= 4 AND d_moy@2 <= 6, projection=[d_date_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 >= 4 AND d_moy@8 <= 6, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 4 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 6, required_guarantees=[d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 >= 4 AND d_moy@8 <= 6, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 4 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 6, required_guarantees=[d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 >= 4 AND d_moy@8 <= 6, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 4 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 6, required_guarantees=[d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 >= 4 AND d_moy@8 <= 6, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 4 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 6, required_guarantees=[d_year in (2001)] + └────────────────────────────────────────────────── + ┌───── Stage 5 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_current_cdemo_sk@1, cd_demo_sk@0)], projection=[c_customer_sk@0, cd_gender@3, cd_marital_status@4, cd_education_status@5, cd_purchase_estimate@6, cd_credit_rating@7] │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, c_current_addr_sk@2)], projection=[c_customer_sk@1, c_current_cdemo_sk@2] │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: ca_state@1 = KY OR ca_state@1 = GA OR ca_state@1 = NM, projection=[ca_address_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = KY OR ca_state@8 = GA OR ca_state@8 = NM, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= KY AND KY <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= GA AND GA <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= NM AND NM <= ca_state_max@1, required_guarantees=[ca_state in (GA, KY, NM)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = KY OR ca_state@8 = GA OR ca_state@8 = NM, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= KY AND KY <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= GA AND GA <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= NM AND NM <= ca_state_max@1, required_guarantees=[ca_state in (GA, KY, NM)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = KY OR ca_state@8 = GA OR ca_state@8 = NM, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= KY AND KY <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= GA AND GA <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= NM AND NM <= ca_state_max@1, required_guarantees=[ca_state in (GA, KY, NM)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = KY OR ca_state@8 = GA OR ca_state@8 = NM, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= KY AND KY <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= GA AND GA <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= NM AND NM <= ca_state_max@1, required_guarantees=[ca_state in (GA, KY, NM)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = KY OR ca_state@8 = GA OR ca_state@8 = NM, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= KY AND KY <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= GA AND GA <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= NM AND NM <= ca_state_max@1, required_guarantees=[ca_state in (GA, KY, NM)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = KY OR ca_state@8 = GA OR ca_state@8 = NM, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= KY AND KY <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= GA AND GA <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= NM AND NM <= ca_state_max@1, required_guarantees=[ca_state in (GA, KY, NM)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = KY OR ca_state@8 = GA OR ca_state@8 = NM, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= KY AND KY <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= GA AND GA <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= NM AND NM <= ca_state_max@1, required_guarantees=[ca_state in (GA, KY, NM)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = KY OR ca_state@8 = GA OR ca_state@8 = NM, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= KY AND KY <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= GA AND GA <= ca_state_max@1 OR ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= NM AND NM <= ca_state_max@1, required_guarantees=[ca_state in (GA, KY, NM)] └────────────────────────────────────────────────── - ┌───── Stage 4 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] - │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 - │ FilterExec: d_year@1 = 2001 AND d_moy@2 >= 4 AND d_moy@2 <= 6, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 >= 4 AND d_moy@8 <= 6, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 4 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 6, required_guarantees=[d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 >= 4 AND d_moy@8 <= 6, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 4 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 6, required_guarantees=[d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 >= 4 AND d_moy@8 <= 6, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 4 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 6, required_guarantees=[d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 >= 4 AND d_moy@8 <= 6, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 4 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 6, required_guarantees=[d_year in (2001)] - └────────────────────────────────────────────────── - ┌───── Stage 5 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + ┌───── Stage 6 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 │ FilterExec: d_year@1 = 2001 AND d_moy@2 >= 4 AND d_moy@2 <= 6, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 >= 4 AND d_moy@8 <= 6, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 4 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 6, required_guarantees=[d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 >= 4 AND d_moy@8 <= 6, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 4 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 6, required_guarantees=[d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 >= 4 AND d_moy@8 <= 6, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 4 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 6, required_guarantees=[d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 >= 4 AND d_moy@8 <= 6, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 4 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 6, required_guarantees=[d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 >= 4 AND d_moy@8 <= 6, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 4 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 6, required_guarantees=[d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 >= 4 AND d_moy@8 <= 6, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 4 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 6, required_guarantees=[d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 >= 4 AND d_moy@8 <= 6, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 4 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 6, required_guarantees=[d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 >= 4 AND d_moy@8 <= 6, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 4 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 6, required_guarantees=[d_year in (2001)] └────────────────────────────────────────────────── - ┌───── Stage 6 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + ┌───── Stage 7 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 │ FilterExec: d_year@1 = 2001 AND d_moy@2 >= 4 AND d_moy@2 <= 6, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 >= 4 AND d_moy@8 <= 6, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 4 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 6, required_guarantees=[d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 >= 4 AND d_moy@8 <= 6, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 4 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 6, required_guarantees=[d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 >= 4 AND d_moy@8 <= 6, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 4 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 6, required_guarantees=[d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 >= 4 AND d_moy@8 <= 6, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 4 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 6, required_guarantees=[d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 >= 4 AND d_moy@8 <= 6, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 4 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 6, required_guarantees=[d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 >= 4 AND d_moy@8 <= 6, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 4 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 6, required_guarantees=[d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 >= 4 AND d_moy@8 <= 6, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 4 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 6, required_guarantees=[d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 2001 AND d_moy@8 >= 4 AND d_moy@8 <= 6, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 AND d_moy_null_count@5 != row_count@3 AND d_moy_max@4 >= 4 AND d_moy_null_count@5 != row_count@3 AND d_moy_min@6 <= 6, required_guarantees=[d_year in (2001)] └────────────────────────────────────────────────── "); Ok(()) @@ -9177,7 +8921,7 @@ mod tests { #[tokio::test] async fn test_tpcds_71() -> Result<()> { let display = test_tpcds_query("q71").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [ext_price@4 DESC, brand_id@0 ASC, t_hour@2 ASC] │ [Stage 7] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -9204,7 +8948,7 @@ mod tests { │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=6, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_sold_time_sk, ws_item_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_sold_time_sk, ws_item_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_sold_time_sk, ws_item_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ ProjectionExec: expr=[cs_ext_sales_price@0 as ext_price, cs_item_sk@1 as sold_item_sk, cs_sold_time_sk@2 as time_sk] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_ext_sales_price@4, cs_item_sk@3, cs_sold_time_sk@2] │ CoalescePartitionsExec @@ -9221,52 +8965,47 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: t_meal_time@3 = breakfast OR t_meal_time@3 = dinner, projection=[t_time_sk@0, t_hour@1, t_minute@2] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute, t_meal_time], file_type=parquet, predicate=t_meal_time@9 = breakfast OR t_meal_time@9 = dinner, pruning_predicate=t_meal_time_null_count@2 != row_count@3 AND t_meal_time_min@0 <= breakfast AND breakfast <= t_meal_time_max@1 OR t_meal_time_null_count@2 != row_count@3 AND t_meal_time_min@0 <= dinner AND dinner <= t_meal_time_max@1, required_guarantees=[t_meal_time in (breakfast, dinner)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute, t_meal_time], file_type=parquet, predicate=t_meal_time@9 = breakfast OR t_meal_time@9 = dinner, pruning_predicate=t_meal_time_null_count@2 != row_count@3 AND t_meal_time_min@0 <= breakfast AND breakfast <= t_meal_time_max@1 OR t_meal_time_null_count@2 != row_count@3 AND t_meal_time_min@0 <= dinner AND dinner <= t_meal_time_max@1, required_guarantees=[t_meal_time in (breakfast, dinner)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute, t_meal_time], file_type=parquet, predicate=t_meal_time@9 = breakfast OR t_meal_time@9 = dinner, pruning_predicate=t_meal_time_null_count@2 != row_count@3 AND t_meal_time_min@0 <= breakfast AND breakfast <= t_meal_time_max@1 OR t_meal_time_null_count@2 != row_count@3 AND t_meal_time_min@0 <= dinner AND dinner <= t_meal_time_max@1, required_guarantees=[t_meal_time in (breakfast, dinner)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute, t_meal_time], file_type=parquet, predicate=t_meal_time@9 = breakfast OR t_meal_time@9 = dinner, pruning_predicate=t_meal_time_null_count@2 != row_count@3 AND t_meal_time_min@0 <= breakfast AND breakfast <= t_meal_time_max@1 OR t_meal_time_null_count@2 != row_count@3 AND t_meal_time_min@0 <= dinner AND dinner <= t_meal_time_max@1, required_guarantees=[t_meal_time in (breakfast, dinner)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute, t_meal_time], file_type=parquet, predicate=t_meal_time@9 = breakfast OR t_meal_time@9 = dinner, pruning_predicate=t_meal_time_null_count@2 != row_count@3 AND t_meal_time_min@0 <= breakfast AND breakfast <= t_meal_time_max@1 OR t_meal_time_null_count@2 != row_count@3 AND t_meal_time_min@0 <= dinner AND dinner <= t_meal_time_max@1, required_guarantees=[t_meal_time in (breakfast, dinner)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute, t_meal_time], file_type=parquet, predicate=t_meal_time@9 = breakfast OR t_meal_time@9 = dinner, pruning_predicate=t_meal_time_null_count@2 != row_count@3 AND t_meal_time_min@0 <= breakfast AND breakfast <= t_meal_time_max@1 OR t_meal_time_null_count@2 != row_count@3 AND t_meal_time_min@0 <= dinner AND dinner <= t_meal_time_max@1, required_guarantees=[t_meal_time in (breakfast, dinner)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute, t_meal_time], file_type=parquet, predicate=t_meal_time@9 = breakfast OR t_meal_time@9 = dinner, pruning_predicate=t_meal_time_null_count@2 != row_count@3 AND t_meal_time_min@0 <= breakfast AND breakfast <= t_meal_time_max@1 OR t_meal_time_null_count@2 != row_count@3 AND t_meal_time_min@0 <= dinner AND dinner <= t_meal_time_max@1, required_guarantees=[t_meal_time in (breakfast, dinner)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute, t_meal_time], file_type=parquet, predicate=t_meal_time@9 = breakfast OR t_meal_time@9 = dinner, pruning_predicate=t_meal_time_null_count@2 != row_count@3 AND t_meal_time_min@0 <= breakfast AND breakfast <= t_meal_time_max@1 OR t_meal_time_null_count@2 != row_count@3 AND t_meal_time_min@0 <= dinner AND dinner <= t_meal_time_max@1, required_guarantees=[t_meal_time in (breakfast, dinner)] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_manager_id@3 = 1, projection=[i_item_sk@0, i_brand_id@1, i_brand@2] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 1, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 1 AND 1 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (1)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 1, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 1 AND 1 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (1)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 1, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 1 AND 1 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (1)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 1, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 1 AND 1 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (1)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 1, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 1 AND 1 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (1)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 1, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 1 AND 1 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (1)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 1, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 1 AND 1 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (1)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_brand, i_manager_id], file_type=parquet, predicate=i_manager_id@20 = 1, pruning_predicate=i_manager_id_null_count@2 != row_count@3 AND i_manager_id_min@0 <= 1 AND 1 <= i_manager_id_max@1, required_guarantees=[i_manager_id in (1)] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p5] t1:[p6..p11] t2:[p12..p17] t3:[p18..p23] │ BroadcastExec: input_partitions=3, consumer_tasks=2, output_partitions=6 │ FilterExec: d_moy@2 = 11 AND d_year@1 = 1999, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 │ FilterExec: d_moy@2 = 11 AND d_year@1 = 1999, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 │ FilterExec: d_moy@2 = 11 AND d_year@1 = 1999, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1999, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1999)] └────────────────────────────────────────────────── "); Ok(()) @@ -9274,7 +9013,7 @@ mod tests { #[tokio::test] async fn test_tpcds_72() -> Result<()> { let display = test_tpcds_query("q72").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [total_cnt@5 DESC, i_item_desc@0 ASC, w_warehouse_name@1 ASC, d_week_seq@2 ASC], fetch=100 │ [Stage 15] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -9307,10 +9046,10 @@ mod tests { │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_ship_date_sk@0)], filter=d_date@1 > d_date@0 + IntervalMonthDayNano { months: 0, days: 5, nanoseconds: 0 }, projection=[cs_item_sk@3, cs_promo_sk@4, cs_order_number@5, w_warehouse_name@6, i_item_desc@7, d_week_seq@9] │ CoalescePartitionsExec - │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, inv_date_sk@4), (d_week_seq@1, d_week_seq@8)], projection=[cs_ship_date_sk@2, cs_item_sk@3, cs_promo_sk@4, cs_order_number@5, w_warehouse_name@7, i_item_desc@8, d_date@9, d_week_seq@10] │ CoalescePartitionsExec - │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_ship_date_sk@4, cs_item_sk@5, cs_promo_sk@6, cs_order_number@7, inv_date_sk@8, w_warehouse_name@9, i_item_desc@10, d_date@1, d_week_seq@2] │ CoalescePartitionsExec │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -9329,31 +9068,30 @@ mod tests { │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/promotion/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/promotion/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/promotion/part-1.parquet:..]]}, projection=[p_promo_sk], file_type=parquet │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/promotion/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/promotion/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/promotion/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/promotion/part-3.parquet:..]]}, projection=[p_promo_sk], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 3 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 4 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_week_seq], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_week_seq], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_week_seq], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@3 = 1999, projection=[d_date_sk@0, d_date@1, d_week_seq@2] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_week_seq, d_year], file_type=parquet, predicate=d_year@6 = 1999, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1, required_guarantees=[d_year in (1999)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_week_seq, d_year], file_type=parquet, predicate=d_year@6 = 1999, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1, required_guarantees=[d_year in (1999)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_week_seq, d_year], file_type=parquet, predicate=d_year@6 = 1999, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1, required_guarantees=[d_year in (1999)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_week_seq, d_year], file_type=parquet, predicate=d_year@6 = 1999, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1, required_guarantees=[d_year in (1999)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_week_seq, d_year], file_type=parquet, predicate=d_year@6 = 1999, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1, required_guarantees=[d_year in (1999)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_week_seq, d_year], file_type=parquet, predicate=d_year@6 = 1999, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1, required_guarantees=[d_year in (1999)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_week_seq, d_year], file_type=parquet, predicate=d_year@6 = 1999, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1, required_guarantees=[d_year in (1999)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_week_seq, d_year], file_type=parquet, predicate=d_year@6 = 1999, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1, required_guarantees=[d_year in (1999)] └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -9372,13 +9110,13 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=cd_marital_status@2 = D, pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= D AND D <= cd_marital_status_max@1, required_guarantees=[cd_marital_status in (D)] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=cd_marital_status@2 = D, pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= D AND D <= cd_marital_status_max@1, required_guarantees=[cd_marital_status in (D)] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=cd_marital_status@2 = D, pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= D AND D <= cd_marital_status_max@1, required_guarantees=[cd_marital_status in (D)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=cd_marital_status@2 = D, pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= D AND D <= cd_marital_status_max@1, required_guarantees=[cd_marital_status in (D)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=cd_marital_status@2 = D, pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= D AND D <= cd_marital_status_max@1, required_guarantees=[cd_marital_status in (D)] └────────────────────────────────────────────────── ┌───── Stage 12 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cs_bill_cdemo_sk@2], 12), input_partitions=3 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, cs_item_sk@4)], projection=[cs_sold_date_sk@2, cs_ship_date_sk@3, cs_bill_cdemo_sk@4, cs_bill_hdemo_sk@5, cs_item_sk@6, cs_promo_sk@7, cs_order_number@8, inv_date_sk@9, w_warehouse_name@10, i_item_desc@1] │ CoalescePartitionsExec - │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(w_warehouse_sk@0, inv_warehouse_sk@8)], projection=[cs_sold_date_sk@2, cs_ship_date_sk@3, cs_bill_cdemo_sk@4, cs_bill_hdemo_sk@5, cs_item_sk@6, cs_promo_sk@7, cs_order_number@8, inv_date_sk@9, w_warehouse_name@1] │ CoalescePartitionsExec │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 @@ -9386,13 +9124,13 @@ mod tests { │ [Stage 10] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ [Stage 11] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 8 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_desc], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_desc], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_desc], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_desc], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_desc], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_desc], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_desc], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_desc], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 9 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -9416,7 +9154,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── "); Ok(()) @@ -9424,7 +9162,7 @@ mod tests { #[tokio::test] async fn test_tpcds_73() -> Result<()> { let display = test_tpcds_query("q73").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [cnt@5 DESC, c_last_name@0 ASC NULLS LAST] │ [Stage 6] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 @@ -9433,19 +9171,19 @@ mod tests { │ SortExec: expr=[cnt@5 DESC, c_last_name@0 ASC NULLS LAST], preserve_partitioning=[true] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ss_customer_sk@1)], projection=[c_last_name@3, c_first_name@2, c_salutation@1, c_preferred_cust_flag@4, ss_ticket_number@5, cnt@7] │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ ProjectionExec: expr=[ss_ticket_number@0 as ss_ticket_number, ss_customer_sk@1 as ss_customer_sk, count(Int64(1))@2 as cnt] │ FilterExec: count(Int64(1))@2 >= 1 AND count(Int64(1))@2 <= 5 │ AggregateExec: mode=FinalPartitioned, gby=[ss_ticket_number@0 as ss_ticket_number, ss_customer_sk@1 as ss_customer_sk], aggr=[count(Int64(1))] │ [Stage 5] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_salutation, c_first_name, c_last_name, c_preferred_cust_flag], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_salutation, c_first_name, c_last_name, c_preferred_cust_flag], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_salutation, c_first_name, c_last_name, c_preferred_cust_flag], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_salutation, c_first_name, c_last_name, c_preferred_cust_flag], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_salutation, c_first_name, c_last_name, c_preferred_cust_flag], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_salutation, c_first_name, c_last_name, c_preferred_cust_flag], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_salutation, c_first_name, c_last_name, c_preferred_cust_flag], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_salutation, c_first_name, c_last_name, c_preferred_cust_flag], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_ticket_number@0, ss_customer_sk@1], 12), input_partitions=3 @@ -9488,12 +9226,11 @@ mod tests { ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_dom@2 >= 1 AND d_dom@2 <= 2 AND (d_year@1 = 1999 OR d_year@1 = 2000 OR d_year@1 = 2001), projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_dom], file_type=parquet, predicate=d_dom@9 >= 1 AND d_dom@9 <= 2 AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 1 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 2 AND (d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_year in (1999, 2000, 2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_dom], file_type=parquet, predicate=d_dom@9 >= 1 AND d_dom@9 <= 2 AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 1 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 2 AND (d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_year in (1999, 2000, 2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_dom], file_type=parquet, predicate=d_dom@9 >= 1 AND d_dom@9 <= 2 AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 1 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 2 AND (d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_year in (1999, 2000, 2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_dom], file_type=parquet, predicate=d_dom@9 >= 1 AND d_dom@9 <= 2 AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 1 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 2 AND (d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_year in (1999, 2000, 2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_dom], file_type=parquet, predicate=d_dom@9 >= 1 AND d_dom@9 <= 2 AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 1 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 2 AND (d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_year in (1999, 2000, 2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_dom], file_type=parquet, predicate=d_dom@9 >= 1 AND d_dom@9 <= 2 AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 1 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 2 AND (d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_year in (1999, 2000, 2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_dom], file_type=parquet, predicate=d_dom@9 >= 1 AND d_dom@9 <= 2 AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 1 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 2 AND (d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_year in (1999, 2000, 2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_dom], file_type=parquet, predicate=d_dom@9 >= 1 AND d_dom@9 <= 2 AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=d_dom_null_count@1 != row_count@2 AND d_dom_max@0 >= 1 AND d_dom_null_count@1 != row_count@2 AND d_dom_min@3 <= 2 AND (d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@2 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_year in (1999, 2000, 2001)] └────────────────────────────────────────────────── "); Ok(()) @@ -9501,14 +9238,14 @@ mod tests { #[tokio::test] async fn test_tpcds_74() -> Result<()> { let display = test_tpcds_query("q74").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [customer_id@0 ASC], fetch=100 │ [Stage 16] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 └────────────────────────────────────────────────── ┌───── Stage 16 ── Tasks: t0:[p0..p2] t1:[p0..p2] │ SortExec: TopK(fetch=100), expr=[customer_id@0 ASC], preserve_partitioning=[true] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(customer_id@0, customer_id@0)], filter=CASE WHEN year_total@2 > Some(0),17,2 THEN year_total@3 / year_total@2 END > CASE WHEN year_total@0 > Some(0),17,2 THEN year_total@1 / year_total@0 END, projection=[customer_id@2, customer_first_name@3, customer_last_name@4] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(customer_id@0, customer_id@0)], filter=CASE WHEN year_total@2 > 0.00 THEN year_total@3 / year_total@2 END > CASE WHEN year_total@0 > 0.00 THEN year_total@1 / year_total@0 END, projection=[customer_id@2, customer_first_name@3, customer_last_name@4] │ CoalescePartitionsExec │ [Stage 12] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=6, input_tasks=2 │ ProjectionExec: expr=[c_customer_id@0 as customer_id, sum(web_sales.ws_net_paid)@4 as year_total] @@ -9530,7 +9267,7 @@ mod tests { ┌───── Stage 4 ── Tasks: t0:[p0..p5] t1:[p6..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=2, output_partitions=6 │ ProjectionExec: expr=[c_customer_id@0 as customer_id, sum(web_sales.ws_net_paid)@1 as year_total] - │ FilterExec: sum(web_sales.ws_net_paid)@1 > Some(0),17,2 + │ FilterExec: sum(web_sales.ws_net_paid)@1 > 0.00 │ ProjectionExec: expr=[c_customer_id@0 as c_customer_id, sum(web_sales.ws_net_paid)@4 as sum(web_sales.ws_net_paid)] │ AggregateExec: mode=FinalPartitioned, gby=[c_customer_id@0 as c_customer_id, c_first_name@1 as c_first_name, c_last_name@2 as c_last_name, d_year@3 as d_year], aggr=[sum(web_sales.ws_net_paid)], ordering_mode=PartiallySorted([3]) │ [Stage 3] => NetworkShuffleExec: output_partitions=3, input_tasks=4 @@ -9543,7 +9280,7 @@ mod tests { │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ws_bill_customer_sk@1)], projection=[c_customer_id@1, c_first_name@2, c_last_name@3, ws_sold_date_sk@4, ws_net_paid@6] │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] @@ -9553,25 +9290,24 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2001 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p5] t1:[p6..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=2, output_partitions=6 │ ProjectionExec: expr=[c_customer_id@0 as customer_id, sum(store_sales.ss_net_paid)@1 as year_total] - │ FilterExec: sum(store_sales.ss_net_paid)@1 > Some(0),17,2 + │ FilterExec: sum(store_sales.ss_net_paid)@1 > 0.00 │ ProjectionExec: expr=[c_customer_id@0 as c_customer_id, sum(store_sales.ss_net_paid)@4 as sum(store_sales.ss_net_paid)] │ AggregateExec: mode=FinalPartitioned, gby=[c_customer_id@0 as c_customer_id, c_first_name@1 as c_first_name, c_last_name@2 as c_last_name, d_year@3 as d_year], aggr=[sum(store_sales.ss_net_paid)], ordering_mode=PartiallySorted([3]) │ [Stage 7] => NetworkShuffleExec: output_partitions=3, input_tasks=4 @@ -9584,7 +9320,7 @@ mod tests { │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ss_customer_sk@1)], projection=[c_customer_id@1, c_first_name@2, c_last_name@3, ss_sold_date_sk@4, ss_net_paid@6] │ CoalescePartitionsExec - │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] @@ -9594,20 +9330,19 @@ mod tests { ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2001 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] └────────────────────────────────────────────────── - ┌───── Stage 6 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 11 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([c_customer_id@0, c_first_name@1, c_last_name@2, d_year@3], 6), input_partitions=3 @@ -9617,7 +9352,7 @@ mod tests { │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ss_customer_sk@1)], projection=[c_customer_id@1, c_first_name@2, c_last_name@3, ss_sold_date_sk@4, ss_net_paid@6] │ CoalescePartitionsExec - │ [Stage 10] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 10] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] @@ -9627,20 +9362,19 @@ mod tests { ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: (d_year@1 = 2001 OR d_year@1 = 2002) AND d_year@1 = 2002 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=(d_year@6 = 2001 OR d_year@6 = 2002) AND d_year@6 = 2002, pruning_predicate=(d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1) AND d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=(d_year@6 = 2001 OR d_year@6 = 2002) AND d_year@6 = 2002, pruning_predicate=(d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1) AND d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=(d_year@6 = 2001 OR d_year@6 = 2002) AND d_year@6 = 2002, pruning_predicate=(d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1) AND d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=(d_year@6 = 2001 OR d_year@6 = 2002) AND d_year@6 = 2002, pruning_predicate=(d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1) AND d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=(d_year@6 = 2001 OR d_year@6 = 2002) AND d_year@6 = 2002, pruning_predicate=(d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1) AND d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=(d_year@6 = 2001 OR d_year@6 = 2002) AND d_year@6 = 2002, pruning_predicate=(d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1) AND d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=(d_year@6 = 2001 OR d_year@6 = 2002) AND d_year@6 = 2002, pruning_predicate=(d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1) AND d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=(d_year@6 = 2001 OR d_year@6 = 2002) AND d_year@6 = 2002, pruning_predicate=(d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1) AND d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] └────────────────────────────────────────────────── - ┌───── Stage 10 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 10 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 15 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([c_customer_id@0, c_first_name@1, c_last_name@2, d_year@3], 6), input_partitions=3 @@ -9650,7 +9384,7 @@ mod tests { │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ws_bill_customer_sk@1)], projection=[c_customer_id@1, c_first_name@2, c_last_name@3, ws_sold_date_sk@4, ws_net_paid@6] │ CoalescePartitionsExec - │ [Stage 14] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 14] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] @@ -9660,20 +9394,19 @@ mod tests { ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: (d_year@1 = 2001 OR d_year@1 = 2002) AND d_year@1 = 2002 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=(d_year@6 = 2001 OR d_year@6 = 2002) AND d_year@6 = 2002, pruning_predicate=(d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1) AND d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=(d_year@6 = 2001 OR d_year@6 = 2002) AND d_year@6 = 2002, pruning_predicate=(d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1) AND d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=(d_year@6 = 2001 OR d_year@6 = 2002) AND d_year@6 = 2002, pruning_predicate=(d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1) AND d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=(d_year@6 = 2001 OR d_year@6 = 2002) AND d_year@6 = 2002, pruning_predicate=(d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1) AND d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=(d_year@6 = 2001 OR d_year@6 = 2002) AND d_year@6 = 2002, pruning_predicate=(d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1) AND d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=(d_year@6 = 2001 OR d_year@6 = 2002) AND d_year@6 = 2002, pruning_predicate=(d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1) AND d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=(d_year@6 = 2001 OR d_year@6 = 2002) AND d_year@6 = 2002, pruning_predicate=(d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1) AND d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=(d_year@6 = 2001 OR d_year@6 = 2002) AND d_year@6 = 2002, pruning_predicate=(d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1 OR d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1) AND d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] └────────────────────────────────────────────────── - ┌───── Stage 14 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 14 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── "); Ok(()) @@ -9681,12 +9414,12 @@ mod tests { #[tokio::test] async fn test_tpcds_75() -> Result<()> { let display = test_tpcds_query("q75").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [sales_cnt_diff@8 ASC NULLS LAST, sales_amt_diff@9 ASC NULLS LAST], fetch=100 │ SortExec: TopK(fetch=100), expr=[sales_cnt_diff@8 ASC NULLS LAST, sales_amt_diff@9 ASC NULLS LAST], preserve_partitioning=[true] │ ProjectionExec: expr=[d_year@0 as prev_year, d_year@1 as year_, i_brand_id@2 as i_brand_id, i_class_id@3 as i_class_id, i_category_id@4 as i_category_id, i_manufact_id@5 as i_manufact_id, sales_cnt@6 as prev_yr_cnt, sales_cnt@7 as curr_yr_cnt, sales_cnt@7 - sales_cnt@6 as sales_cnt_diff, sales_amt@8 - sales_amt@9 as sales_amt_diff] - │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(i_brand_id@1, i_brand_id@1), (i_class_id@2, i_class_id@2), (i_category_id@3, i_category_id@3), (i_manufact_id@4, i_manufact_id@4)], filter=CAST(sales_cnt@0 AS Decimal128(17, 2)) / CAST(sales_cnt@1 AS Decimal128(17, 2)) < Some(900000),23,6, projection=[d_year@7, d_year@0, i_brand_id@1, i_class_id@2, i_category_id@3, i_manufact_id@4, sales_cnt@12, sales_cnt@5, sales_amt@6, sales_amt@13] + │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(i_brand_id@1, i_brand_id@1), (i_class_id@2, i_class_id@2), (i_category_id@3, i_category_id@3), (i_manufact_id@4, i_manufact_id@4)], filter=CAST(sales_cnt@0 AS Decimal128(17, 2)) / CAST(sales_cnt@1 AS Decimal128(17, 2)) < 0.900000, projection=[d_year@7, d_year@0, i_brand_id@1, i_class_id@2, i_category_id@3, i_manufact_id@4, sales_cnt@12, sales_cnt@5, sales_amt@6, sales_amt@13] │ RepartitionExec: partitioning=Hash([i_brand_id@1, i_class_id@2, i_category_id@3, i_manufact_id@4], 3), input_partitions=3 │ ProjectionExec: expr=[d_year@0 as d_year, i_brand_id@1 as i_brand_id, i_class_id@2 as i_class_id, i_category_id@3 as i_category_id, i_manufact_id@4 as i_manufact_id, sum(sales_detail.sales_cnt)@5 as sales_cnt, sum(sales_detail.sales_amt)@6 as sales_amt] │ AggregateExec: mode=FinalPartitioned, gby=[d_year@0 as d_year, i_brand_id@1 as i_brand_id, i_class_id@2 as i_class_id, i_category_id@3 as i_category_id, i_manufact_id@4 as i_manufact_id], aggr=[sum(sales_detail.sales_cnt), sum(sales_detail.sales_amt)], ordering_mode=PartiallySorted([0]) @@ -9706,17 +9439,17 @@ mod tests { │ RepartitionExec: partitioning=Hash([d_year@0, i_brand_id@1, i_class_id@2, i_category_id@3, i_manufact_id@4, sales_cnt@5, sales_amt@6], 6), input_partitions=3 │ AggregateExec: mode=Partial, gby=[d_year@0 as d_year, i_brand_id@1 as i_brand_id, i_class_id@2 as i_class_id, i_category_id@3 as i_category_id, i_manufact_id@4 as i_manufact_id, sales_cnt@5 as sales_cnt, sales_amt@6 as sales_amt], aggr=[], ordering_mode=PartiallySorted([0]) │ DistributedUnionExec: t0:[c0(0/2)] t1:[c0(1/2)] t2:[c1] t3:[c2] - │ ProjectionExec: expr=[d_year@8 as d_year, i_brand_id@4 as i_brand_id, i_class_id@5 as i_class_id, i_category_id@6 as i_category_id, i_manufact_id@7 as i_manufact_id, CAST(cs_quantity@2 AS Int64) - CASE WHEN __common_expr_1@0 IS NOT NULL THEN __common_expr_1@0 ELSE 0 END as sales_cnt, cs_ext_sales_price@3 - CASE WHEN __common_expr_2@1 IS NOT NULL THEN __common_expr_2@1 ELSE Some(0),30,15 END as sales_amt] + │ ProjectionExec: expr=[d_year@8 as d_year, i_brand_id@4 as i_brand_id, i_class_id@5 as i_class_id, i_category_id@6 as i_category_id, i_manufact_id@7 as i_manufact_id, CAST(cs_quantity@2 AS Int64) - CASE WHEN __common_expr_1@0 IS NOT NULL THEN __common_expr_1@0 ELSE 0 END as sales_cnt, cs_ext_sales_price@3 - CASE WHEN __common_expr_2@1 IS NOT NULL THEN __common_expr_2@1 ELSE 0.000000000000000 END as sales_amt] │ ProjectionExec: expr=[CAST(cr_return_quantity@0 AS Int64) as __common_expr_1, CAST(cr_return_amount@1 AS Decimal128(30, 15)) as __common_expr_2, cs_quantity@2 as cs_quantity, cs_ext_sales_price@3 as cs_ext_sales_price, i_brand_id@4 as i_brand_id, i_class_id@5 as i_class_id, i_category_id@6 as i_category_id, i_manufact_id@7 as i_manufact_id, d_year@8 as d_year] │ HashJoinExec: mode=Partitioned, join_type=Left, on=[(cs_order_number@1, cr_order_number@1), (cs_item_sk@0, cr_item_sk@0)], projection=[cr_return_quantity@11, cr_return_amount@12, cs_quantity@2, cs_ext_sales_price@3, i_brand_id@4, i_class_id@5, i_category_id@6, i_manufact_id@7, d_year@8] │ [Stage 3] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ [Stage 4] => NetworkShuffleExec: output_partitions=3, input_tasks=4 - │ ProjectionExec: expr=[d_year@8 as d_year, i_brand_id@4 as i_brand_id, i_class_id@5 as i_class_id, i_category_id@6 as i_category_id, i_manufact_id@7 as i_manufact_id, CAST(ss_quantity@2 AS Int64) - CASE WHEN __common_expr_3@0 IS NOT NULL THEN __common_expr_3@0 ELSE 0 END as sales_cnt, ss_ext_sales_price@3 - CASE WHEN __common_expr_4@1 IS NOT NULL THEN __common_expr_4@1 ELSE Some(0),30,15 END as sales_amt] + │ ProjectionExec: expr=[d_year@8 as d_year, i_brand_id@4 as i_brand_id, i_class_id@5 as i_class_id, i_category_id@6 as i_category_id, i_manufact_id@7 as i_manufact_id, CAST(ss_quantity@2 AS Int64) - CASE WHEN __common_expr_3@0 IS NOT NULL THEN __common_expr_3@0 ELSE 0 END as sales_cnt, ss_ext_sales_price@3 - CASE WHEN __common_expr_4@1 IS NOT NULL THEN __common_expr_4@1 ELSE 0.000000000000000 END as sales_amt] │ ProjectionExec: expr=[CAST(sr_return_quantity@0 AS Int64) as __common_expr_3, CAST(sr_return_amt@1 AS Decimal128(30, 15)) as __common_expr_4, ss_quantity@2 as ss_quantity, ss_ext_sales_price@3 as ss_ext_sales_price, i_brand_id@4 as i_brand_id, i_class_id@5 as i_class_id, i_category_id@6 as i_category_id, i_manufact_id@7 as i_manufact_id, d_year@8 as d_year] │ HashJoinExec: mode=Partitioned, join_type=Left, on=[(ss_ticket_number@1, sr_ticket_number@1), (ss_item_sk@0, sr_item_sk@0)], projection=[sr_return_quantity@11, sr_return_amt@12, ss_quantity@2, ss_ext_sales_price@3, i_brand_id@4, i_class_id@5, i_category_id@6, i_manufact_id@7, d_year@8] │ [Stage 7] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ [Stage 8] => NetworkShuffleExec: output_partitions=3, input_tasks=4 - │ ProjectionExec: expr=[d_year@8 as d_year, i_brand_id@4 as i_brand_id, i_class_id@5 as i_class_id, i_category_id@6 as i_category_id, i_manufact_id@7 as i_manufact_id, CAST(ws_quantity@2 AS Int64) - CASE WHEN __common_expr_5@0 IS NOT NULL THEN __common_expr_5@0 ELSE 0 END as sales_cnt, ws_ext_sales_price@3 - CASE WHEN __common_expr_6@1 IS NOT NULL THEN __common_expr_6@1 ELSE Some(0),30,15 END as sales_amt] + │ ProjectionExec: expr=[d_year@8 as d_year, i_brand_id@4 as i_brand_id, i_class_id@5 as i_class_id, i_category_id@6 as i_category_id, i_manufact_id@7 as i_manufact_id, CAST(ws_quantity@2 AS Int64) - CASE WHEN __common_expr_5@0 IS NOT NULL THEN __common_expr_5@0 ELSE 0 END as sales_cnt, ws_ext_sales_price@3 - CASE WHEN __common_expr_6@1 IS NOT NULL THEN __common_expr_6@1 ELSE 0.000000000000000 END as sales_amt] │ ProjectionExec: expr=[CAST(wr_return_quantity@0 AS Int64) as __common_expr_5, CAST(wr_return_amt@1 AS Decimal128(30, 15)) as __common_expr_6, ws_quantity@2 as ws_quantity, ws_ext_sales_price@3 as ws_ext_sales_price, i_brand_id@4 as i_brand_id, i_class_id@5 as i_class_id, i_category_id@6 as i_category_id, i_manufact_id@7 as i_manufact_id, d_year@8 as d_year] │ HashJoinExec: mode=Partitioned, join_type=Left, on=[(ws_order_number@1, wr_order_number@1), (ws_item_sk@0, wr_item_sk@0)], projection=[wr_return_quantity@11, wr_return_amt@12, ws_quantity@2, ws_ext_sales_price@3, i_brand_id@4, i_class_id@5, i_category_id@6, i_manufact_id@7, d_year@8] │ [Stage 11] => NetworkShuffleExec: output_partitions=3, input_tasks=4 @@ -9739,22 +9472,20 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2002 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_category@4 = Books, projection=[i_item_sk@0, i_brand_id@1, i_class_id@2, i_category_id@3, i_manufact_id@5] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([cr_order_number@1, cr_item_sk@0], 6), input_partitions=3 @@ -9781,22 +9512,20 @@ mod tests { ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2002 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_category@4 = Books, projection=[i_item_sk@0, i_brand_id@1, i_class_id@2, i_category_id@3, i_manufact_id@5] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ RepartitionExec: partitioning=Hash([sr_ticket_number@1, sr_item_sk@0], 3), input_partitions=3 @@ -9823,30 +9552,28 @@ mod tests { ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2002 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] └────────────────────────────────────────────────── ┌───── Stage 10 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_category@4 = Books, projection=[i_item_sk@0, i_brand_id@1, i_class_id@2, i_category_id@3, i_manufact_id@5] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] └────────────────────────────────────────────────── ┌───── Stage 12 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] - │ RepartitionExec: partitioning=Hash([wr_order_number@1, wr_item_sk@0], 3), input_partitions=2 + │ RepartitionExec: partitioning=Hash([wr_order_number@1, wr_item_sk@0], 3), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 28 ── Tasks: t0:[p0..p2] t1:[p0..p2] │ RepartitionExec: partitioning=Hash([d_year@0, i_brand_id@1, i_class_id@2, i_category_id@3, i_manufact_id@4], 3), input_partitions=3 @@ -9858,17 +9585,17 @@ mod tests { │ RepartitionExec: partitioning=Hash([d_year@0, i_brand_id@1, i_class_id@2, i_category_id@3, i_manufact_id@4, sales_cnt@5, sales_amt@6], 6), input_partitions=3 │ AggregateExec: mode=Partial, gby=[d_year@0 as d_year, i_brand_id@1 as i_brand_id, i_class_id@2 as i_class_id, i_category_id@3 as i_category_id, i_manufact_id@4 as i_manufact_id, sales_cnt@5 as sales_cnt, sales_amt@6 as sales_amt], aggr=[], ordering_mode=PartiallySorted([0]) │ DistributedUnionExec: t0:[c0(0/2)] t1:[c0(1/2)] t2:[c1] t3:[c2] - │ ProjectionExec: expr=[d_year@8 as d_year, i_brand_id@4 as i_brand_id, i_class_id@5 as i_class_id, i_category_id@6 as i_category_id, i_manufact_id@7 as i_manufact_id, CAST(cs_quantity@2 AS Int64) - CASE WHEN __common_expr_7@0 IS NOT NULL THEN __common_expr_7@0 ELSE 0 END as sales_cnt, cs_ext_sales_price@3 - CASE WHEN __common_expr_8@1 IS NOT NULL THEN __common_expr_8@1 ELSE Some(0),30,15 END as sales_amt] + │ ProjectionExec: expr=[d_year@8 as d_year, i_brand_id@4 as i_brand_id, i_class_id@5 as i_class_id, i_category_id@6 as i_category_id, i_manufact_id@7 as i_manufact_id, CAST(cs_quantity@2 AS Int64) - CASE WHEN __common_expr_7@0 IS NOT NULL THEN __common_expr_7@0 ELSE 0 END as sales_cnt, cs_ext_sales_price@3 - CASE WHEN __common_expr_8@1 IS NOT NULL THEN __common_expr_8@1 ELSE 0.000000000000000 END as sales_amt] │ ProjectionExec: expr=[CAST(cr_return_quantity@0 AS Int64) as __common_expr_7, CAST(cr_return_amount@1 AS Decimal128(30, 15)) as __common_expr_8, cs_quantity@2 as cs_quantity, cs_ext_sales_price@3 as cs_ext_sales_price, i_brand_id@4 as i_brand_id, i_class_id@5 as i_class_id, i_category_id@6 as i_category_id, i_manufact_id@7 as i_manufact_id, d_year@8 as d_year] │ HashJoinExec: mode=Partitioned, join_type=Left, on=[(cs_order_number@1, cr_order_number@1), (cs_item_sk@0, cr_item_sk@0)], projection=[cr_return_quantity@11, cr_return_amount@12, cs_quantity@2, cs_ext_sales_price@3, i_brand_id@4, i_class_id@5, i_category_id@6, i_manufact_id@7, d_year@8] │ [Stage 17] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ [Stage 18] => NetworkShuffleExec: output_partitions=3, input_tasks=4 - │ ProjectionExec: expr=[d_year@8 as d_year, i_brand_id@4 as i_brand_id, i_class_id@5 as i_class_id, i_category_id@6 as i_category_id, i_manufact_id@7 as i_manufact_id, CAST(ss_quantity@2 AS Int64) - CASE WHEN __common_expr_9@0 IS NOT NULL THEN __common_expr_9@0 ELSE 0 END as sales_cnt, ss_ext_sales_price@3 - CASE WHEN __common_expr_10@1 IS NOT NULL THEN __common_expr_10@1 ELSE Some(0),30,15 END as sales_amt] + │ ProjectionExec: expr=[d_year@8 as d_year, i_brand_id@4 as i_brand_id, i_class_id@5 as i_class_id, i_category_id@6 as i_category_id, i_manufact_id@7 as i_manufact_id, CAST(ss_quantity@2 AS Int64) - CASE WHEN __common_expr_9@0 IS NOT NULL THEN __common_expr_9@0 ELSE 0 END as sales_cnt, ss_ext_sales_price@3 - CASE WHEN __common_expr_10@1 IS NOT NULL THEN __common_expr_10@1 ELSE 0.000000000000000 END as sales_amt] │ ProjectionExec: expr=[CAST(sr_return_quantity@0 AS Int64) as __common_expr_9, CAST(sr_return_amt@1 AS Decimal128(30, 15)) as __common_expr_10, ss_quantity@2 as ss_quantity, ss_ext_sales_price@3 as ss_ext_sales_price, i_brand_id@4 as i_brand_id, i_class_id@5 as i_class_id, i_category_id@6 as i_category_id, i_manufact_id@7 as i_manufact_id, d_year@8 as d_year] │ HashJoinExec: mode=Partitioned, join_type=Left, on=[(ss_ticket_number@1, sr_ticket_number@1), (ss_item_sk@0, sr_item_sk@0)], projection=[sr_return_quantity@11, sr_return_amt@12, ss_quantity@2, ss_ext_sales_price@3, i_brand_id@4, i_class_id@5, i_category_id@6, i_manufact_id@7, d_year@8] │ [Stage 21] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ [Stage 22] => NetworkShuffleExec: output_partitions=3, input_tasks=4 - │ ProjectionExec: expr=[d_year@8 as d_year, i_brand_id@4 as i_brand_id, i_class_id@5 as i_class_id, i_category_id@6 as i_category_id, i_manufact_id@7 as i_manufact_id, CAST(ws_quantity@2 AS Int64) - CASE WHEN __common_expr_11@0 IS NOT NULL THEN __common_expr_11@0 ELSE 0 END as sales_cnt, ws_ext_sales_price@3 - CASE WHEN __common_expr_12@1 IS NOT NULL THEN __common_expr_12@1 ELSE Some(0),30,15 END as sales_amt] + │ ProjectionExec: expr=[d_year@8 as d_year, i_brand_id@4 as i_brand_id, i_class_id@5 as i_class_id, i_category_id@6 as i_category_id, i_manufact_id@7 as i_manufact_id, CAST(ws_quantity@2 AS Int64) - CASE WHEN __common_expr_11@0 IS NOT NULL THEN __common_expr_11@0 ELSE 0 END as sales_cnt, ws_ext_sales_price@3 - CASE WHEN __common_expr_12@1 IS NOT NULL THEN __common_expr_12@1 ELSE 0.000000000000000 END as sales_amt] │ ProjectionExec: expr=[CAST(wr_return_quantity@0 AS Int64) as __common_expr_11, CAST(wr_return_amt@1 AS Decimal128(30, 15)) as __common_expr_12, ws_quantity@2 as ws_quantity, ws_ext_sales_price@3 as ws_ext_sales_price, i_brand_id@4 as i_brand_id, i_class_id@5 as i_class_id, i_category_id@6 as i_category_id, i_manufact_id@7 as i_manufact_id, d_year@8 as d_year] │ HashJoinExec: mode=Partitioned, join_type=Left, on=[(ws_order_number@1, wr_order_number@1), (ws_item_sk@0, wr_item_sk@0)], projection=[wr_return_quantity@11, wr_return_amt@12, ws_quantity@2, ws_ext_sales_price@3, i_brand_id@4, i_class_id@5, i_category_id@6, i_manufact_id@7, d_year@8] │ [Stage 25] => NetworkShuffleExec: output_partitions=3, input_tasks=4 @@ -9891,22 +9618,20 @@ mod tests { ┌───── Stage 15 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2001 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] └────────────────────────────────────────────────── ┌───── Stage 16 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_category@4 = Books, projection=[i_item_sk@0, i_brand_id@1, i_class_id@2, i_category_id@3, i_manufact_id@5] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] └────────────────────────────────────────────────── ┌───── Stage 18 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([cr_order_number@1, cr_item_sk@0], 6), input_partitions=3 @@ -9933,22 +9658,20 @@ mod tests { ┌───── Stage 19 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2001 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] └────────────────────────────────────────────────── ┌───── Stage 20 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_category@4 = Books, projection=[i_item_sk@0, i_brand_id@1, i_class_id@2, i_category_id@3, i_manufact_id@5] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] └────────────────────────────────────────────────── ┌───── Stage 22 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ RepartitionExec: partitioning=Hash([sr_ticket_number@1, sr_item_sk@0], 3), input_partitions=3 @@ -9975,30 +9698,28 @@ mod tests { ┌───── Stage 23 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2001 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2001, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2001 AND 2001 <= d_year_max@1, required_guarantees=[d_year in (2001)] └────────────────────────────────────────────────── ┌───── Stage 24 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_category@4 = Books, projection=[i_item_sk@0, i_brand_id@1, i_class_id@2, i_category_id@3, i_manufact_id@5] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] └────────────────────────────────────────────────── ┌───── Stage 26 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] - │ RepartitionExec: partitioning=Hash([wr_order_number@1, wr_item_sk@0], 3), input_partitions=2 + │ RepartitionExec: partitioning=Hash([wr_order_number@1, wr_item_sk@0], 3), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── "); Ok(()) @@ -10006,7 +9727,7 @@ mod tests { #[tokio::test] async fn test_tpcds_76() -> Result<()> { let display = test_tpcds_query("q76").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [channel@0 ASC, col_name@1 ASC, d_year@2 ASC, d_qoy@3 ASC, i_category@4 ASC], fetch=100 │ [Stage 8] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -10024,82 +9745,82 @@ mod tests { │ ProjectionExec: expr=[store as channel, ss_store_sk as col_name, d_year@0 as d_year, d_qoy@1 as d_qoy, i_category@2 as i_category, ss_ext_sales_price@3 as ext_sales_price] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[d_year@1, d_qoy@2, i_category@5, ss_ext_sales_price@4] │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=4, input_tasks=4 + │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=6, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@1)], projection=[ss_sold_date_sk@2, ss_ext_sales_price@4, i_category@1] │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=4, input_tasks=4 + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=6, input_tasks=4 │ FilterExec: ss_store_sk@2 IS NULL, projection=[ss_sold_date_sk@0, ss_item_sk@1, ss_ext_sales_price@3] │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price], file_type=parquet, predicate=ss_store_sk@7 IS NULL AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=ss_store_sk_null_count@0 > 0, required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price], file_type=parquet, predicate=ss_store_sk@7 IS NULL AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=ss_store_sk_null_count@0 > 0, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price], file_type=parquet, predicate=ss_store_sk@7 IS NULL AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=ss_store_sk_null_count@0 > 0, required_guarantees=[] │ ProjectionExec: expr=[web as channel, ws_ship_customer_sk as col_name, d_year@0 as d_year, d_qoy@1 as d_qoy, i_category@2 as i_category, ws_ext_sales_price@3 as ext_sales_price] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[d_year@1, d_qoy@2, i_category@5, ws_ext_sales_price@4] │ CoalescePartitionsExec - │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=2, input_tasks=4 + │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ws_item_sk@1)], projection=[ws_sold_date_sk@2, ws_ext_sales_price@4, i_category@1] │ CoalescePartitionsExec - │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=2, input_tasks=4 + │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 │ FilterExec: ws_ship_customer_sk@2 IS NULL, projection=[ws_sold_date_sk@0, ws_item_sk@1, ws_ext_sales_price@3] │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ship_customer_sk, ws_ext_sales_price], file_type=parquet, predicate=ws_ship_customer_sk@8 IS NULL AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=ws_ship_customer_sk_null_count@0 > 0, required_guarantees=[] │ ProjectionExec: expr=[catalog as channel, cs_ship_addr_sk as col_name, d_year@0 as d_year, d_qoy@1 as d_qoy, i_category@2 as i_category, cs_ext_sales_price@3 as ext_sales_price] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[d_year@1, d_qoy@2, i_category@5, cs_ext_sales_price@4] │ CoalescePartitionsExec - │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=2, input_tasks=4 + │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, cs_item_sk@1)], projection=[cs_sold_date_sk@2, cs_ext_sales_price@4, i_category@1] │ CoalescePartitionsExec - │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=2, input_tasks=4 + │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 │ FilterExec: cs_ship_addr_sk@1 IS NULL, projection=[cs_sold_date_sk@0, cs_item_sk@2, cs_ext_sales_price@3] │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_ship_addr_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=cs_ship_addr_sk@10 IS NULL AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=cs_ship_addr_sk_null_count@0 > 0, required_guarantees=[] └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p3] t1:[p4..p7] t2:[p8..p11] t3:[p12..p15] - │ BroadcastExec: input_partitions=2, consumer_tasks=2, output_partitions=4 + ┌───── Stage 1 ── Tasks: t0:[p0..p5] t1:[p6..p11] t2:[p12..p17] t3:[p18..p23] + │ BroadcastExec: input_partitions=3, consumer_tasks=2, output_partitions=6 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p3] t1:[p4..p7] t2:[p8..p11] t3:[p12..p15] - │ BroadcastExec: input_partitions=2, consumer_tasks=2, output_partitions=4 + ┌───── Stage 2 ── Tasks: t0:[p0..p5] t1:[p6..p11] t2:[p12..p17] t3:[p18..p23] + │ BroadcastExec: input_partitions=3, consumer_tasks=2, output_partitions=6 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 3 ── Tasks: t0:[p0..p1] t1:[p2..p3] t2:[p4..p5] t3:[p6..p7] - │ BroadcastExec: input_partitions=2, consumer_tasks=1, output_partitions=2 + ┌───── Stage 3 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 4 ── Tasks: t0:[p0..p1] t1:[p2..p3] t2:[p4..p5] t3:[p6..p7] - │ BroadcastExec: input_partitions=2, consumer_tasks=1, output_partitions=2 + ┌───── Stage 4 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 5 ── Tasks: t0:[p0..p1] t1:[p2..p3] t2:[p4..p5] t3:[p6..p7] - │ BroadcastExec: input_partitions=2, consumer_tasks=1, output_partitions=2 + ┌───── Stage 5 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_qoy], file_type=parquet └────────────────────────────────────────────────── - ┌───── Stage 6 ── Tasks: t0:[p0..p1] t1:[p2..p3] t2:[p4..p5] t3:[p6..p7] - │ BroadcastExec: input_partitions=2, consumer_tasks=1, output_partitions=2 + ┌───── Stage 6 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_category], file_type=parquet └────────────────────────────────────────────────── "); Ok(()) @@ -10107,7 +9828,7 @@ mod tests { #[tokio::test] async fn test_tpcds_77() -> Result<()> { let display = test_tpcds_query("q77").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [channel@0 ASC, id@1 ASC, returns_@3 DESC], fetch=100 │ SortExec: TopK(fetch=100), expr=[channel@0 ASC, id@1 ASC, returns_@3 DESC], preserve_partitioning=[true] @@ -10119,7 +9840,7 @@ mod tests { │ RepartitionExec: partitioning=Hash([channel@0, id@1, __grouping_id@2], 3), input_partitions=3 │ AggregateExec: mode=Partial, gby=[(NULL as channel, NULL as id), (channel@0 as channel, NULL as id), (channel@0 as channel, id@1 as id)], aggr=[sum(x.sales), sum(x.returns_), sum(x.profit)] │ InterleaveExec - │ ProjectionExec: expr=[store channel as channel, s_store_sk@2 as id, sales@3 as sales, CASE WHEN __common_expr_1@0 IS NOT NULL THEN __common_expr_1@0 ELSE Some(0),22,2 END as returns_, profit@4 - CASE WHEN __common_expr_2@1 IS NOT NULL THEN __common_expr_2@1 ELSE Some(0),22,2 END as profit] + │ ProjectionExec: expr=[store channel as channel, s_store_sk@2 as id, sales@3 as sales, CASE WHEN __common_expr_1@0 IS NOT NULL THEN __common_expr_1@0 ELSE 0.00 END as returns_, profit@4 - CASE WHEN __common_expr_2@1 IS NOT NULL THEN __common_expr_2@1 ELSE 0.00 END as profit] │ ProjectionExec: expr=[CAST(returns_@0 AS Decimal128(22, 2)) as __common_expr_1, CAST(profit_loss@1 AS Decimal128(22, 2)) as __common_expr_2, s_store_sk@2 as s_store_sk, sales@3 as sales, profit@4 as profit] │ HashJoinExec: mode=CollectLeft, join_type=Right, on=[(s_store_sk@0, s_store_sk@0)], projection=[returns_@1, profit_loss@2, s_store_sk@3, sales@4, profit@5] │ CoalescePartitionsExec @@ -10134,7 +9855,7 @@ mod tests { │ ProjectionExec: expr=[cs_call_center_sk@0 as cs_call_center_sk, sum(catalog_sales.cs_ext_sales_price)@1 as sales, sum(catalog_sales.cs_net_profit)@2 as profit] │ AggregateExec: mode=FinalPartitioned, gby=[cs_call_center_sk@0 as cs_call_center_sk], aggr=[sum(catalog_sales.cs_ext_sales_price), sum(catalog_sales.cs_net_profit)] │ [Stage 12] => NetworkShuffleExec: output_partitions=3, input_tasks=4 - │ ProjectionExec: expr=[web channel as channel, wp_web_page_sk@2 as id, sales@3 as sales, CASE WHEN __common_expr_3@0 IS NOT NULL THEN __common_expr_3@0 ELSE Some(0),22,2 END as returns_, profit@4 - CASE WHEN __common_expr_4@1 IS NOT NULL THEN __common_expr_4@1 ELSE Some(0),22,2 END as profit] + │ ProjectionExec: expr=[web channel as channel, wp_web_page_sk@2 as id, sales@3 as sales, CASE WHEN __common_expr_3@0 IS NOT NULL THEN __common_expr_3@0 ELSE 0.00 END as returns_, profit@4 - CASE WHEN __common_expr_4@1 IS NOT NULL THEN __common_expr_4@1 ELSE 0.00 END as profit] │ ProjectionExec: expr=[CAST(returns_@0 AS Decimal128(22, 2)) as __common_expr_3, CAST(profit_loss@1 AS Decimal128(22, 2)) as __common_expr_4, wp_web_page_sk@2 as wp_web_page_sk, sales@3 as sales, profit@4 as profit] │ HashJoinExec: mode=CollectLeft, join_type=Right, on=[(wp_web_page_sk@0, wp_web_page_sk@0)], projection=[returns_@1, profit_loss@2, wp_web_page_sk@3, sales@4, profit@5] │ CoalescePartitionsExec @@ -10175,12 +9896,11 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_date@1 >= 2000-08-23 AND d_date@1 <= 2000-09-22, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([s_store_sk@0], 6), input_partitions=3 @@ -10208,12 +9928,11 @@ mod tests { ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_date@1 >= 2000-08-23 AND d_date@1 <= 2000-09-22, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 10 ── Tasks: t0:[p0..p5] t1:[p6..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=2, output_partitions=6 @@ -10236,12 +9955,11 @@ mod tests { ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_date@1 >= 2000-08-23 AND d_date@1 <= 2000-09-22, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 12 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([cs_call_center_sk@0], 6), input_partitions=3 @@ -10258,12 +9976,11 @@ mod tests { ┌───── Stage 11 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_date@1 >= 2000-08-23 AND d_date@1 <= 2000-09-22, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 16 ── Tasks: t0:[p0..p5] t1:[p6..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=2, output_partitions=6 @@ -10280,12 +9997,11 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, wr_returned_date_sk@0)], projection=[wr_web_page_sk@2, wr_return_amt@3, wr_net_loss@4] │ CoalescePartitionsExec │ [Stage 14] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_returned_date_sk, wr_web_page_sk, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_returned_date_sk, wr_web_page_sk, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_web_page_sk, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_web_page_sk, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_returned_date_sk, wr_web_page_sk, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_web_page_sk, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_web_page_sk, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_web_page_sk, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 13 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -10298,12 +10014,11 @@ mod tests { ┌───── Stage 14 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_date@1 >= 2000-08-23 AND d_date@1 <= 2000-09-22, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 19 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([wp_web_page_sk@0], 6), input_partitions=3 @@ -10331,12 +10046,11 @@ mod tests { ┌───── Stage 18 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_date@1 >= 2000-08-23 AND d_date@1 <= 2000-09-22, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] └────────────────────────────────────────────────── "); Ok(()) @@ -10344,14 +10058,14 @@ mod tests { #[tokio::test] async fn test_tpcds_78() -> Result<()> { let display = test_tpcds_query("q78").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] - │ SortPreservingMergeExec: [ss_sold_year@0 ASC NULLS LAST, ss_item_sk@1 ASC NULLS LAST, ss_customer_sk@2 ASC NULLS LAST, store_sales_price@6 DESC, other_chan_qty@7 ASC NULLS LAST, other_chan_wholesale_cost@8 ASC NULLS LAST, other_chan_sales_price@9 ASC NULLS LAST], fetch=100 + │ SortPreservingMergeExec: [ss_sold_year@0 ASC NULLS LAST, ss_item_sk@1 ASC NULLS LAST, ss_customer_sk@2 ASC NULLS LAST, other_chan_qty@7 ASC NULLS LAST, other_chan_wholesale_cost@8 ASC NULLS LAST, other_chan_sales_price@9 ASC NULLS LAST, ratio@3 ASC NULLS LAST], fetch=100 │ [Stage 12] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 └────────────────────────────────────────────────── ┌───── Stage 12 ── Tasks: t0:[p0..p2] t1:[p0..p2] - │ SortExec: TopK(fetch=100), expr=[ss_item_sk@1 ASC NULLS LAST, ss_customer_sk@2 ASC NULLS LAST, store_sales_price@6 DESC, other_chan_qty@7 ASC NULLS LAST, other_chan_wholesale_cost@8 ASC NULLS LAST, other_chan_sales_price@9 ASC NULLS LAST], preserve_partitioning=[true] - │ ProjectionExec: expr=[ss_sold_year@5 as ss_sold_year, ss_item_sk@6 as ss_item_sk, ss_customer_sk@7 as ss_customer_sk, round(CAST(ss_qty@8 AS Float64) / CAST(__common_expr_1@0 AS Float64), 2) as ratio, ss_qty@8 as store_qty, ss_wc@9 as store_wholesale_cost, ss_sp@10 as store_sales_price, __common_expr_1@0 as other_chan_qty, CASE WHEN __common_expr_2@1 IS NOT NULL THEN __common_expr_2@1 ELSE Some(0),22,2 END + CASE WHEN __common_expr_3@2 IS NOT NULL THEN __common_expr_3@2 ELSE Some(0),22,2 END as other_chan_wholesale_cost, CASE WHEN __common_expr_4@3 IS NOT NULL THEN __common_expr_4@3 ELSE Some(0),22,2 END + CASE WHEN __common_expr_5@4 IS NOT NULL THEN __common_expr_5@4 ELSE Some(0),22,2 END as other_chan_sales_price] + │ SortExec: TopK(fetch=100), expr=[ss_item_sk@1 ASC NULLS LAST, ss_customer_sk@2 ASC NULLS LAST, other_chan_qty@7 ASC NULLS LAST, other_chan_wholesale_cost@8 ASC NULLS LAST, other_chan_sales_price@9 ASC NULLS LAST, ratio@3 ASC NULLS LAST], preserve_partitioning=[true] + │ ProjectionExec: expr=[ss_sold_year@5 as ss_sold_year, ss_item_sk@6 as ss_item_sk, ss_customer_sk@7 as ss_customer_sk, round(CAST(ss_qty@8 AS Float64) / CAST(__common_expr_1@0 AS Float64), 2) as ratio, ss_qty@8 as store_qty, ss_wc@9 as store_wholesale_cost, ss_sp@10 as store_sales_price, __common_expr_1@0 as other_chan_qty, CASE WHEN __common_expr_2@1 IS NOT NULL THEN __common_expr_2@1 ELSE 0.00 END + CASE WHEN __common_expr_3@2 IS NOT NULL THEN __common_expr_3@2 ELSE 0.00 END as other_chan_wholesale_cost, CASE WHEN __common_expr_4@3 IS NOT NULL THEN __common_expr_4@3 ELSE 0.00 END + CASE WHEN __common_expr_5@4 IS NOT NULL THEN __common_expr_5@4 ELSE 0.00 END as other_chan_sales_price] │ ProjectionExec: expr=[CASE WHEN ws_qty@6 IS NOT NULL THEN ws_qty@6 ELSE 0 END + CASE WHEN cs_qty@9 IS NOT NULL THEN cs_qty@9 ELSE 0 END as __common_expr_1, CAST(ws_wc@7 AS Decimal128(22, 2)) as __common_expr_2, CAST(cs_wc@10 AS Decimal128(22, 2)) as __common_expr_3, CAST(ws_sp@8 AS Decimal128(22, 2)) as __common_expr_4, CAST(cs_sp@11 AS Decimal128(22, 2)) as __common_expr_5, ss_sold_year@0 as ss_sold_year, ss_item_sk@1 as ss_item_sk, ss_customer_sk@2 as ss_customer_sk, ss_qty@3 as ss_qty, ss_wc@4 as ss_wc, ss_sp@5 as ss_sp] │ FilterExec: CASE WHEN ws_qty@6 IS NOT NULL THEN ws_qty@6 ELSE 0 END > 0 OR CASE WHEN cs_qty@9 IS NOT NULL THEN cs_qty@9 ELSE 0 END > 0 │ HashJoinExec: mode=Partitioned, join_type=Right, on=[(cs_sold_year@0, ss_sold_year@0), (cs_item_sk@1, ss_item_sk@1), (cs_customer_sk@2, ss_customer_sk@2)], projection=[ss_sold_year@6, ss_item_sk@7, ss_customer_sk@8, ss_qty@9, ss_wc@10, ss_sp@11, ws_qty@12, ws_wc@13, ws_sp@14, cs_qty@3, cs_wc@4, cs_sp@5] @@ -10380,12 +10094,11 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2000 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cr_order_number@1, cr_item_sk@0], 12), input_partitions=3 @@ -10412,7 +10125,7 @@ mod tests { │ FilterExec: wr_order_number@6 IS NULL, projection=[ws_sold_date_sk@0, ws_item_sk@1, ws_bill_customer_sk@2, ws_quantity@3, ws_wholesale_cost@4, ws_sales_price@5] │ HashJoinExec: mode=CollectLeft, join_type=Right, on=[(wr_order_number@1, ws_order_number@3), (wr_item_sk@0, ws_item_sk@1)], projection=[ws_sold_date_sk@2, ws_item_sk@3, ws_bill_customer_sk@4, ws_quantity@6, ws_wholesale_cost@7, ws_sales_price@8, wr_order_number@1] │ CoalescePartitionsExec - │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_order_number, ws_quantity, ws_wholesale_cost, ws_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_order_number, ws_quantity, ws_wholesale_cost, ws_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] @@ -10422,20 +10135,19 @@ mod tests { ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2000 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] └────────────────────────────────────────────────── - ┌───── Stage 6 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_item_sk, wr_order_number], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_item_sk, wr_order_number], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_item_sk, wr_order_number], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 11 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([d_year@0, ss_item_sk@1, ss_customer_sk@2], 6), input_partitions=3 @@ -10451,12 +10163,11 @@ mod tests { ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2000 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] └────────────────────────────────────────────────── ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([sr_ticket_number@1, sr_item_sk@0], 12), input_partitions=3 @@ -10480,7 +10191,7 @@ mod tests { #[tokio::test] async fn test_tpcds_79() -> Result<()> { let display = test_tpcds_query("q79").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [c_last_name@0 ASC, c_first_name@1 ASC, substr(ms.s_city,Int64(1),Int64(30))@2 ASC, profit@5 ASC, ss_ticket_number@3 ASC NULLS LAST], fetch=100 │ [Stage 6] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 @@ -10490,18 +10201,18 @@ mod tests { │ ProjectionExec: expr=[c_last_name@0 as c_last_name, c_first_name@1 as c_first_name, substr(s_city@2, 1, 30) as substr(ms.s_city,Int64(1),Int64(30)), ss_ticket_number@3 as ss_ticket_number, amt@4 as amt, profit@5 as profit] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ss_customer_sk@1)], projection=[c_last_name@2, c_first_name@1, s_city@5, ss_ticket_number@3, amt@6, profit@7] │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ ProjectionExec: expr=[ss_ticket_number@0 as ss_ticket_number, ss_customer_sk@1 as ss_customer_sk, s_city@3 as s_city, sum(store_sales.ss_coupon_amt)@4 as amt, sum(store_sales.ss_net_profit)@5 as profit] │ AggregateExec: mode=FinalPartitioned, gby=[ss_ticket_number@0 as ss_ticket_number, ss_customer_sk@1 as ss_customer_sk, ss_addr_sk@2 as ss_addr_sk, s_city@3 as s_city], aggr=[sum(store_sales.ss_coupon_amt), sum(store_sales.ss_net_profit)] │ [Stage 5] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_ticket_number@0, ss_customer_sk@1, ss_addr_sk@2, s_city@3], 12), input_partitions=3 @@ -10544,12 +10255,11 @@ mod tests { ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_dow@2 = 1 AND (d_year@1 = 1999 OR d_year@1 = 2000 OR d_year@1 = 2001), projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_dow], file_type=parquet, predicate=d_dow@7 = 1 AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=d_dow_null_count@2 != row_count@3 AND d_dow_min@0 <= 1 AND 1 <= d_dow_max@1 AND (d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_dow in (1), d_year in (1999, 2000, 2001)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_dow], file_type=parquet, predicate=d_dow@7 = 1 AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=d_dow_null_count@2 != row_count@3 AND d_dow_min@0 <= 1 AND 1 <= d_dow_max@1 AND (d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_dow in (1), d_year in (1999, 2000, 2001)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_dow], file_type=parquet, predicate=d_dow@7 = 1 AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=d_dow_null_count@2 != row_count@3 AND d_dow_min@0 <= 1 AND 1 <= d_dow_max@1 AND (d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_dow in (1), d_year in (1999, 2000, 2001)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_dow], file_type=parquet, predicate=d_dow@7 = 1 AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=d_dow_null_count@2 != row_count@3 AND d_dow_min@0 <= 1 AND 1 <= d_dow_max@1 AND (d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_dow in (1), d_year in (1999, 2000, 2001)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_dow], file_type=parquet, predicate=d_dow@7 = 1 AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=d_dow_null_count@2 != row_count@3 AND d_dow_min@0 <= 1 AND 1 <= d_dow_max@1 AND (d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_dow in (1), d_year in (1999, 2000, 2001)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_dow], file_type=parquet, predicate=d_dow@7 = 1 AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=d_dow_null_count@2 != row_count@3 AND d_dow_min@0 <= 1 AND 1 <= d_dow_max@1 AND (d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_dow in (1), d_year in (1999, 2000, 2001)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_dow], file_type=parquet, predicate=d_dow@7 = 1 AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=d_dow_null_count@2 != row_count@3 AND d_dow_min@0 <= 1 AND 1 <= d_dow_max@1 AND (d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_dow in (1), d_year in (1999, 2000, 2001)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_dow], file_type=parquet, predicate=d_dow@7 = 1 AND (d_year@6 = 1999 OR d_year@6 = 2000 OR d_year@6 = 2001), pruning_predicate=d_dow_null_count@2 != row_count@3 AND d_dow_min@0 <= 1 AND 1 <= d_dow_max@1 AND (d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1999 AND 1999 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2000 AND 2000 <= d_year_max@5 OR d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 2001 AND 2001 <= d_year_max@5), required_guarantees=[d_dow in (1), d_year in (1999, 2000, 2001)] └────────────────────────────────────────────────── "); Ok(()) @@ -10557,7 +10267,7 @@ mod tests { #[tokio::test] async fn test_tpcds_80() -> Result<()> { let display = test_tpcds_query("q80").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [channel@0 ASC, id@1 ASC], fetch=100 │ SortExec: TopK(fetch=100), expr=[channel@0 ASC, id@1 ASC], preserve_partitioning=[true] @@ -10570,18 +10280,18 @@ mod tests { │ AggregateExec: mode=Partial, gby=[(NULL as channel, NULL as id), (channel@0 as channel, NULL as id), (channel@0 as channel, id@1 as id)], aggr=[sum(x.sales), sum(x.returns_), sum(x.profit)] │ DistributedUnionExec: t0:[c0(0/2)] t1:[c0(1/2)] t2:[c1] t3:[c2] │ ProjectionExec: expr=[store channel as channel, concat(store, s_store_id@0) as id, sum(store_sales.ss_ext_sales_price)@1 as sales, sum(coalesce(store_returns.sr_return_amt,Int64(0)))@2 as returns_, sum(store_sales.ss_net_profit - coalesce(store_returns.sr_net_loss,Int64(0)))@3 as profit] - │ AggregateExec: mode=FinalPartitioned, gby=[s_store_id@0 as s_store_id], aggr=[sum(store_sales.ss_ext_sales_price), sum(CASE WHEN __common_expr_1 IS NOT NULL THEN __common_expr_1 ELSE Some(0),22,2 END) as sum(coalesce(store_returns.sr_return_amt,Int64(0))), sum(store_sales.ss_net_profit - CASE WHEN __common_expr_2 IS NOT NULL THEN __common_expr_2 ELSE Some(0),22,2 END) as sum(store_sales.ss_net_profit - coalesce(store_returns.sr_net_loss,Int64(0)))] + │ AggregateExec: mode=FinalPartitioned, gby=[s_store_id@0 as s_store_id], aggr=[sum(store_sales.ss_ext_sales_price), sum(CASE WHEN __common_expr_1 IS NOT NULL THEN __common_expr_1 ELSE 0.00 END) as sum(coalesce(store_returns.sr_return_amt,Int64(0))), sum(store_sales.ss_net_profit - CASE WHEN __common_expr_2 IS NOT NULL THEN __common_expr_2 ELSE 0.00 END) as sum(store_sales.ss_net_profit - coalesce(store_returns.sr_net_loss,Int64(0)))] │ [Stage 7] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ ProjectionExec: expr=[catalog channel as channel, concat(catalog_page, cp_catalog_page_id@0) as id, sum(catalog_sales.cs_ext_sales_price)@1 as sales, sum(coalesce(catalog_returns.cr_return_amount,Int64(0)))@2 as returns_, sum(catalog_sales.cs_net_profit - coalesce(catalog_returns.cr_net_loss,Int64(0)))@3 as profit] - │ AggregateExec: mode=FinalPartitioned, gby=[cp_catalog_page_id@0 as cp_catalog_page_id], aggr=[sum(catalog_sales.cs_ext_sales_price), sum(CASE WHEN __common_expr_3 IS NOT NULL THEN __common_expr_3 ELSE Some(0),22,2 END) as sum(coalesce(catalog_returns.cr_return_amount,Int64(0))), sum(catalog_sales.cs_net_profit - CASE WHEN __common_expr_4 IS NOT NULL THEN __common_expr_4 ELSE Some(0),22,2 END) as sum(catalog_sales.cs_net_profit - coalesce(catalog_returns.cr_net_loss,Int64(0)))] + │ AggregateExec: mode=FinalPartitioned, gby=[cp_catalog_page_id@0 as cp_catalog_page_id], aggr=[sum(catalog_sales.cs_ext_sales_price), sum(CASE WHEN __common_expr_3 IS NOT NULL THEN __common_expr_3 ELSE 0.00 END) as sum(coalesce(catalog_returns.cr_return_amount,Int64(0))), sum(catalog_sales.cs_net_profit - CASE WHEN __common_expr_4 IS NOT NULL THEN __common_expr_4 ELSE 0.00 END) as sum(catalog_sales.cs_net_profit - coalesce(catalog_returns.cr_net_loss,Int64(0)))] │ [Stage 14] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ ProjectionExec: expr=[web channel as channel, concat(web_site, web_site_id@0) as id, sum(web_sales.ws_ext_sales_price)@1 as sales, sum(coalesce(web_returns.wr_return_amt,Int64(0)))@2 as returns_, sum(web_sales.ws_net_profit - coalesce(web_returns.wr_net_loss,Int64(0)))@3 as profit] - │ AggregateExec: mode=FinalPartitioned, gby=[web_site_id@0 as web_site_id], aggr=[sum(web_sales.ws_ext_sales_price), sum(CASE WHEN __common_expr_5 IS NOT NULL THEN __common_expr_5 ELSE Some(0),22,2 END) as sum(coalesce(web_returns.wr_return_amt,Int64(0))), sum(web_sales.ws_net_profit - CASE WHEN __common_expr_6 IS NOT NULL THEN __common_expr_6 ELSE Some(0),22,2 END) as sum(web_sales.ws_net_profit - coalesce(web_returns.wr_net_loss,Int64(0)))] + │ AggregateExec: mode=FinalPartitioned, gby=[web_site_id@0 as web_site_id], aggr=[sum(web_sales.ws_ext_sales_price), sum(CASE WHEN __common_expr_5 IS NOT NULL THEN __common_expr_5 ELSE 0.00 END) as sum(coalesce(web_returns.wr_return_amt,Int64(0))), sum(web_sales.ws_net_profit - CASE WHEN __common_expr_6 IS NOT NULL THEN __common_expr_6 ELSE 0.00 END) as sum(web_sales.ws_net_profit - coalesce(web_returns.wr_net_loss,Int64(0)))] │ [Stage 21] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([s_store_id@0], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[s_store_id@4 as s_store_id], aggr=[sum(store_sales.ss_ext_sales_price), sum(CASE WHEN __common_expr_1 IS NOT NULL THEN __common_expr_1 ELSE Some(0),22,2 END) as sum(coalesce(store_returns.sr_return_amt,Int64(0))), sum(store_sales.ss_net_profit - CASE WHEN __common_expr_2 IS NOT NULL THEN __common_expr_2 ELSE Some(0),22,2 END) as sum(store_sales.ss_net_profit - coalesce(store_returns.sr_net_loss,Int64(0)))] + │ AggregateExec: mode=Partial, gby=[s_store_id@4 as s_store_id], aggr=[sum(store_sales.ss_ext_sales_price), sum(CASE WHEN __common_expr_1 IS NOT NULL THEN __common_expr_1 ELSE 0.00 END) as sum(coalesce(store_returns.sr_return_amt,Int64(0))), sum(store_sales.ss_net_profit - CASE WHEN __common_expr_2 IS NOT NULL THEN __common_expr_2 ELSE 0.00 END) as sum(store_sales.ss_net_profit - coalesce(store_returns.sr_net_loss,Int64(0)))] │ ProjectionExec: expr=[CAST(sr_return_amt@0 AS Decimal128(22, 2)) as __common_expr_1, CAST(sr_net_loss@1 AS Decimal128(22, 2)) as __common_expr_2, ss_ext_sales_price@2 as ss_ext_sales_price, ss_net_profit@3 as ss_net_profit, s_store_id@4 as s_store_id] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(p_promo_sk@0, ss_promo_sk@0)], projection=[sr_return_amt@4, sr_net_loss@5, ss_ext_sales_price@2, ss_net_profit@3, s_store_id@6] │ CoalescePartitionsExec @@ -10611,13 +10321,12 @@ mod tests { └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: i_current_price@1 > Some(5000),7,2, projection=[i_item_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price], file_type=parquet, predicate=i_current_price@5 > Some(5000),7,2, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 > Some(5000),7,2, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price], file_type=parquet, predicate=i_current_price@5 > Some(5000),7,2, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 > Some(5000),7,2, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price], file_type=parquet, predicate=i_current_price@5 > Some(5000),7,2, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 > Some(5000),7,2, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_current_price], file_type=parquet, predicate=i_current_price@5 > Some(5000),7,2, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 > Some(5000),7,2, required_guarantees=[] + │ FilterExec: i_current_price@1 > 50.00, projection=[i_item_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price], file_type=parquet, predicate=i_current_price@5 > 50.00, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 > 50.00, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price], file_type=parquet, predicate=i_current_price@5 > 50.00, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 > 50.00, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_current_price], file_type=parquet, predicate=i_current_price@5 > 50.00, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 > 50.00, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_current_price], file_type=parquet, predicate=i_current_price@5 > 50.00, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 > 50.00, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -10630,12 +10339,11 @@ mod tests { ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_date@1 >= 2000-08-23 AND d_date@1 <= 2000-09-22, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([sr_item_sk@0, sr_ticket_number@1], 12), input_partitions=3 @@ -10655,7 +10363,7 @@ mod tests { └────────────────────────────────────────────────── ┌───── Stage 14 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ RepartitionExec: partitioning=Hash([cp_catalog_page_id@0], 3), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[cp_catalog_page_id@4 as cp_catalog_page_id], aggr=[sum(catalog_sales.cs_ext_sales_price), sum(CASE WHEN __common_expr_3 IS NOT NULL THEN __common_expr_3 ELSE Some(0),22,2 END) as sum(coalesce(catalog_returns.cr_return_amount,Int64(0))), sum(catalog_sales.cs_net_profit - CASE WHEN __common_expr_4 IS NOT NULL THEN __common_expr_4 ELSE Some(0),22,2 END) as sum(catalog_sales.cs_net_profit - coalesce(catalog_returns.cr_net_loss,Int64(0)))] + │ AggregateExec: mode=Partial, gby=[cp_catalog_page_id@4 as cp_catalog_page_id], aggr=[sum(catalog_sales.cs_ext_sales_price), sum(CASE WHEN __common_expr_3 IS NOT NULL THEN __common_expr_3 ELSE 0.00 END) as sum(coalesce(catalog_returns.cr_return_amount,Int64(0))), sum(catalog_sales.cs_net_profit - CASE WHEN __common_expr_4 IS NOT NULL THEN __common_expr_4 ELSE 0.00 END) as sum(catalog_sales.cs_net_profit - coalesce(catalog_returns.cr_net_loss,Int64(0)))] │ ProjectionExec: expr=[CAST(cr_return_amount@0 AS Decimal128(22, 2)) as __common_expr_3, CAST(cr_net_loss@1 AS Decimal128(22, 2)) as __common_expr_4, cs_ext_sales_price@2 as cs_ext_sales_price, cs_net_profit@3 as cs_net_profit, cp_catalog_page_id@4 as cp_catalog_page_id] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(p_promo_sk@0, cs_promo_sk@0)], projection=[cr_return_amount@4, cr_net_loss@5, cs_ext_sales_price@2, cs_net_profit@3, cp_catalog_page_id@6] │ CoalescePartitionsExec @@ -10665,7 +10373,7 @@ mod tests { │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(cp_catalog_page_sk@0, cs_catalog_page_sk@0)], projection=[cs_item_sk@3, cs_promo_sk@4, cs_ext_sales_price@5, cs_net_profit@6, cr_return_amount@7, cr_net_loss@8, cp_catalog_page_id@1] │ CoalescePartitionsExec - │ [Stage 10] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 10] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_catalog_page_sk@2, cs_item_sk@3, cs_promo_sk@4, cs_ext_sales_price@5, cs_net_profit@6, cr_return_amount@7, cr_net_loss@8] │ CoalescePartitionsExec │ [Stage 11] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -10685,31 +10393,29 @@ mod tests { └────────────────────────────────────────────────── ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: i_current_price@1 > Some(5000),7,2, projection=[i_item_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price], file_type=parquet, predicate=i_current_price@5 > Some(5000),7,2, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 > Some(5000),7,2, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price], file_type=parquet, predicate=i_current_price@5 > Some(5000),7,2, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 > Some(5000),7,2, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price], file_type=parquet, predicate=i_current_price@5 > Some(5000),7,2, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 > Some(5000),7,2, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_current_price], file_type=parquet, predicate=i_current_price@5 > Some(5000),7,2, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 > Some(5000),7,2, required_guarantees=[] + │ FilterExec: i_current_price@1 > 50.00, projection=[i_item_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price], file_type=parquet, predicate=i_current_price@5 > 50.00, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 > 50.00, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price], file_type=parquet, predicate=i_current_price@5 > 50.00, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 > 50.00, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_current_price], file_type=parquet, predicate=i_current_price@5 > 50.00, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 > 50.00, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_current_price], file_type=parquet, predicate=i_current_price@5 > 50.00, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 > 50.00, required_guarantees=[] └────────────────────────────────────────────────── - ┌───── Stage 10 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 10 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..]]}, projection=[cp_catalog_page_sk, cp_catalog_page_id], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_page/part-1.parquet:..]]}, projection=[cp_catalog_page_sk, cp_catalog_page_id], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-1.parquet:..]]}, projection=[cp_catalog_page_sk, cp_catalog_page_id], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_page/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_page/part-3.parquet:..]]}, projection=[cp_catalog_page_sk, cp_catalog_page_id], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_page/part-1.parquet:..]]}, projection=[cp_catalog_page_sk, cp_catalog_page_id], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-1.parquet:..]]}, projection=[cp_catalog_page_sk, cp_catalog_page_id], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-1.parquet:..]]}, projection=[cp_catalog_page_sk, cp_catalog_page_id], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_page/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_page/part-3.parquet:..]]}, projection=[cp_catalog_page_sk, cp_catalog_page_id], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 11 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_date@1 >= 2000-08-23 AND d_date@1 <= 2000-09-22, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 12 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cr_item_sk@0, cr_order_number@1], 12), input_partitions=3 @@ -10729,7 +10435,7 @@ mod tests { └────────────────────────────────────────────────── ┌───── Stage 21 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ RepartitionExec: partitioning=Hash([web_site_id@0], 3), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[web_site_id@4 as web_site_id], aggr=[sum(web_sales.ws_ext_sales_price), sum(CASE WHEN __common_expr_5 IS NOT NULL THEN __common_expr_5 ELSE Some(0),22,2 END) as sum(coalesce(web_returns.wr_return_amt,Int64(0))), sum(web_sales.ws_net_profit - CASE WHEN __common_expr_6 IS NOT NULL THEN __common_expr_6 ELSE Some(0),22,2 END) as sum(web_sales.ws_net_profit - coalesce(web_returns.wr_net_loss,Int64(0)))] + │ AggregateExec: mode=Partial, gby=[web_site_id@4 as web_site_id], aggr=[sum(web_sales.ws_ext_sales_price), sum(CASE WHEN __common_expr_5 IS NOT NULL THEN __common_expr_5 ELSE 0.00 END) as sum(coalesce(web_returns.wr_return_amt,Int64(0))), sum(web_sales.ws_net_profit - CASE WHEN __common_expr_6 IS NOT NULL THEN __common_expr_6 ELSE 0.00 END) as sum(web_sales.ws_net_profit - coalesce(web_returns.wr_net_loss,Int64(0)))] │ ProjectionExec: expr=[CAST(wr_return_amt@0 AS Decimal128(22, 2)) as __common_expr_5, CAST(wr_net_loss@1 AS Decimal128(22, 2)) as __common_expr_6, ws_ext_sales_price@2 as ws_ext_sales_price, ws_net_profit@3 as ws_net_profit, web_site_id@4 as web_site_id] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(p_promo_sk@0, ws_promo_sk@0)], projection=[wr_return_amt@4, wr_net_loss@5, ws_ext_sales_price@2, ws_net_profit@3, web_site_id@6] │ CoalescePartitionsExec @@ -10759,13 +10465,12 @@ mod tests { └────────────────────────────────────────────────── ┌───── Stage 16 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: i_current_price@1 > Some(5000),7,2, projection=[i_item_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price], file_type=parquet, predicate=i_current_price@5 > Some(5000),7,2, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 > Some(5000),7,2, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price], file_type=parquet, predicate=i_current_price@5 > Some(5000),7,2, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 > Some(5000),7,2, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price], file_type=parquet, predicate=i_current_price@5 > Some(5000),7,2, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 > Some(5000),7,2, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_current_price], file_type=parquet, predicate=i_current_price@5 > Some(5000),7,2, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 > Some(5000),7,2, required_guarantees=[] + │ FilterExec: i_current_price@1 > 50.00, projection=[i_item_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price], file_type=parquet, predicate=i_current_price@5 > 50.00, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 > 50.00, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price], file_type=parquet, predicate=i_current_price@5 > 50.00, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 > 50.00, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_current_price], file_type=parquet, predicate=i_current_price@5 > 50.00, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 > 50.00, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_current_price], file_type=parquet, predicate=i_current_price@5 > 50.00, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 > 50.00, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 17 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -10778,20 +10483,19 @@ mod tests { ┌───── Stage 18 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_date@1 >= 2000-08-23 AND d_date@1 <= 2000-09-22, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-08-23 AND d_date@2 <= 2000-09-22, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-08-23 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-09-22, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 19 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([wr_item_sk@0, wr_order_number@1], 12), input_partitions=2 + │ RepartitionExec: partitioning=Hash([wr_item_sk@0, wr_order_number@1], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_amt, wr_net_loss], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_amt, wr_net_loss], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_amt, wr_net_loss], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_amt, wr_net_loss], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_amt, wr_net_loss], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_amt, wr_net_loss], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_amt, wr_net_loss], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_amt, wr_net_loss], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 20 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ws_item_sk@1, ws_order_number@4], 12), input_partitions=3 @@ -10807,196 +10511,174 @@ mod tests { #[tokio::test] async fn test_tpcds_81() -> Result<()> { let display = test_tpcds_query("q81").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [c_customer_id@0 ASC NULLS LAST, c_salutation@1 ASC NULLS LAST, c_first_name@2 ASC NULLS LAST, c_last_name@3 ASC NULLS LAST, ca_street_number@4 ASC NULLS LAST, ca_street_name@5 ASC NULLS LAST, ca_street_type@6 ASC NULLS LAST, ca_suite_number@7 ASC NULLS LAST, ca_city@8 ASC NULLS LAST, ca_county@9 ASC NULLS LAST, ca_state@10 ASC NULLS LAST, ca_zip@11 ASC NULLS LAST, ca_country@12 ASC NULLS LAST, ca_gmt_offset@13 ASC NULLS LAST, ca_location_type@14 ASC NULLS LAST, ctr_total_return@15 ASC NULLS LAST], fetch=100 - │ [Stage 11] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 + │ SortExec: TopK(fetch=100), expr=[c_customer_id@0 ASC NULLS LAST, c_salutation@1 ASC NULLS LAST, c_first_name@2 ASC NULLS LAST, c_last_name@3 ASC NULLS LAST, ca_street_number@4 ASC NULLS LAST, ca_street_name@5 ASC NULLS LAST, ca_street_type@6 ASC NULLS LAST, ca_suite_number@7 ASC NULLS LAST, ca_city@8 ASC NULLS LAST, ca_county@9 ASC NULLS LAST, ca_zip@11 ASC NULLS LAST, ca_country@12 ASC NULLS LAST, ca_gmt_offset@13 ASC NULLS LAST, ca_location_type@14 ASC NULLS LAST, ctr_total_return@15 ASC NULLS LAST], preserve_partitioning=[true] + │ HashJoinExec: mode=CollectLeft, join_type=LeftSemi, on=[(ctr_state@0, ctr_state@1)], filter=CAST(ctr_total_return@0 AS Decimal128(30, 15)) > avg(ctr2.ctr_total_return) * Float64(1.2)@1, projection=[c_customer_id@13, c_salutation@14, c_first_name@15, c_last_name@16, ca_street_number@2, ca_street_name@3, ca_street_type@4, ca_suite_number@5, ca_city@6, ca_county@7, ca_state@8, ca_zip@9, ca_country@10, ca_gmt_offset@11, ca_location_type@12, ctr_total_return@1] + │ CoalescePartitionsExec + │ [Stage 6] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 + │ ProjectionExec: expr=[CAST(CAST(avg(ctr2.ctr_total_return)@1 AS Float64) * 1.2 AS Decimal128(30, 15)) as avg(ctr2.ctr_total_return) * Float64(1.2), ctr_state@0 as ctr_state] + │ AggregateExec: mode=FinalPartitioned, gby=[ctr_state@0 as ctr_state], aggr=[avg(ctr2.ctr_total_return)] + │ [Stage 10] => NetworkShuffleExec: output_partitions=3, input_tasks=2 └────────────────────────────────────────────────── - ┌───── Stage 11 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] - │ SortExec: TopK(fetch=100), expr=[c_customer_id@0 ASC NULLS LAST, c_salutation@1 ASC NULLS LAST, c_first_name@2 ASC NULLS LAST, c_last_name@3 ASC NULLS LAST, ca_street_number@4 ASC NULLS LAST, ca_street_name@5 ASC NULLS LAST, ca_street_type@6 ASC NULLS LAST, ca_suite_number@7 ASC NULLS LAST, ca_city@8 ASC NULLS LAST, ca_county@9 ASC NULLS LAST, ca_zip@11 ASC NULLS LAST, ca_country@12 ASC NULLS LAST, ca_gmt_offset@13 ASC NULLS LAST, ca_location_type@14 ASC NULLS LAST, ctr_total_return@15 ASC NULLS LAST], preserve_partitioning=[true] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ctr_state@0, ctr_state@1)], filter=CAST(ctr_total_return@0 AS Decimal128(30, 15)) > avg(ctr2.ctr_total_return) * Float64(1.2)@1, projection=[c_customer_id@13, c_salutation@14, c_first_name@15, c_last_name@16, ca_street_number@2, ca_street_name@3, ca_street_type@4, ca_suite_number@5, ca_city@6, ca_county@7, ca_state@8, ca_zip@9, ca_country@10, ca_gmt_offset@11, ca_location_type@12, ctr_total_return@1] + ┌───── Stage 6 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, c_current_addr_sk@3)], projection=[ctr_state@12, ctr_total_return@13, ca_street_number@1, ca_street_name@2, ca_street_type@3, ca_suite_number@4, ca_city@5, ca_county@6, ca_state@7, ca_zip@8, ca_country@9, ca_gmt_offset@10, ca_location_type@11, c_customer_id@14, c_salutation@16, c_first_name@17, c_last_name@18] + │ CoalescePartitionsExec + │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ctr_customer_sk@0, c_customer_sk@0)], projection=[ctr_state@1, ctr_total_return@2, c_customer_id@4, c_current_addr_sk@5, c_salutation@6, c_first_name@7, c_last_name@8] │ CoalescePartitionsExec - │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ ProjectionExec: expr=[CAST(CAST(avg(ctr2.ctr_total_return)@1 AS Float64) * 1.2 AS Decimal128(30, 15)) as avg(ctr2.ctr_total_return) * Float64(1.2), ctr_state@0 as ctr_state] - │ AggregateExec: mode=FinalPartitioned, gby=[ctr_state@0 as ctr_state], aggr=[avg(ctr2.ctr_total_return)] - │ [Stage 10] => NetworkShuffleExec: output_partitions=3, input_tasks=2 + │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=2 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_current_addr_sk, c_salutation, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_current_addr_sk, c_salutation, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_current_addr_sk, c_salutation, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_current_addr_sk, c_salutation, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, c_current_addr_sk@3)], projection=[ctr_state@12, ctr_total_return@13, ca_street_number@1, ca_street_name@2, ca_street_type@3, ca_suite_number@4, ca_city@5, ca_county@6, ca_state@7, ca_zip@8, ca_country@9, ca_gmt_offset@10, ca_location_type@11, c_customer_id@14, c_salutation@16, c_first_name@17, c_last_name@18] - │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ctr_customer_sk@0, c_customer_sk@0)], projection=[ctr_state@1, ctr_total_return@2, c_customer_id@4, c_current_addr_sk@5, c_salutation@6, c_first_name@7, c_last_name@8] - │ CoalescePartitionsExec - │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=2 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_current_addr_sk, c_salutation, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_current_addr_sk, c_salutation, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_current_addr_sk, c_salutation, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_current_addr_sk, c_salutation, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ FilterExec: ca_state@7 = GA + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_street_type, ca_suite_number, ca_city, ca_county, ca_state, ca_zip, ca_country, ca_gmt_offset, ca_location_type], file_type=parquet, predicate=ca_state@8 = GA, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= GA AND GA <= ca_state_max@1, required_guarantees=[ca_state in (GA)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_street_type, ca_suite_number, ca_city, ca_county, ca_state, ca_zip, ca_country, ca_gmt_offset, ca_location_type], file_type=parquet, predicate=ca_state@8 = GA, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= GA AND GA <= ca_state_max@1, required_guarantees=[ca_state in (GA)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_street_type, ca_suite_number, ca_city, ca_county, ca_state, ca_zip, ca_country, ca_gmt_offset, ca_location_type], file_type=parquet, predicate=ca_state@8 = GA, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= GA AND GA <= ca_state_max@1, required_guarantees=[ca_state in (GA)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_street_type, ca_suite_number, ca_city, ca_county, ca_state, ca_zip, ca_country, ca_gmt_offset, ca_location_type], file_type=parquet, predicate=ca_state@8 = GA, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= GA AND GA <= ca_state_max@1, required_guarantees=[ca_state in (GA)] └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: ca_state@7 = GA - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_street_type, ca_suite_number, ca_city, ca_county, ca_state, ca_zip, ca_country, ca_gmt_offset, ca_location_type], file_type=parquet, predicate=ca_state@8 = GA, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= GA AND GA <= ca_state_max@1, required_guarantees=[ca_state in (GA)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_street_type, ca_suite_number, ca_city, ca_county, ca_state, ca_zip, ca_country, ca_gmt_offset, ca_location_type], file_type=parquet, predicate=ca_state@8 = GA, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= GA AND GA <= ca_state_max@1, required_guarantees=[ca_state in (GA)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_street_type, ca_suite_number, ca_city, ca_county, ca_state, ca_zip, ca_country, ca_gmt_offset, ca_location_type], file_type=parquet, predicate=ca_state@8 = GA, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= GA AND GA <= ca_state_max@1, required_guarantees=[ca_state in (GA)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_street_number, ca_street_name, ca_street_type, ca_suite_number, ca_city, ca_county, ca_state, ca_zip, ca_country, ca_gmt_offset, ca_location_type], file_type=parquet, predicate=ca_state@8 = GA, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= GA AND GA <= ca_state_max@1, required_guarantees=[ca_state in (GA)] - └────────────────────────────────────────────────── - ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ ProjectionExec: expr=[cr_returning_customer_sk@0 as ctr_customer_sk, ca_state@1 as ctr_state, sum(catalog_returns.cr_return_amt_inc_tax)@2 as ctr_total_return] - │ AggregateExec: mode=FinalPartitioned, gby=[cr_returning_customer_sk@0 as cr_returning_customer_sk, ca_state@1 as ca_state], aggr=[sum(catalog_returns.cr_return_amt_inc_tax)] - │ [Stage 4] => NetworkShuffleExec: output_partitions=3, input_tasks=4 - └────────────────────────────────────────────────── - ┌───── Stage 4 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] - │ RepartitionExec: partitioning=Hash([cr_returning_customer_sk@0, ca_state@1], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[cr_returning_customer_sk@0 as cr_returning_customer_sk, ca_state@2 as ca_state], aggr=[sum(catalog_returns.cr_return_amt_inc_tax)] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(cr_returning_addr_sk@1, ca_address_sk@0)], projection=[cr_returning_customer_sk@0, cr_return_amt_inc_tax@2, ca_state@4] - │ CoalescePartitionsExec - │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] - └────────────────────────────────────────────────── - ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cr_returned_date_sk@0)], projection=[cr_returning_customer_sk@2, cr_returning_addr_sk@3, cr_return_amt_inc_tax@4] - │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_returning_addr_sk, cr_return_amt_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_returning_addr_sk, cr_return_amt_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_returning_addr_sk, cr_return_amt_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_returning_addr_sk, cr_return_amt_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ] - └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: d_year@1 = 2000, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - └────────────────────────────────────────────────── - ┌───── Stage 10 ── Tasks: t0:[p0..p11] t1:[p0..p11] - │ RepartitionExec: partitioning=Hash([ctr_state@0], 12), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[ctr_state@0 as ctr_state], aggr=[avg(ctr2.ctr_total_return)] - │ ProjectionExec: expr=[ca_state@1 as ctr_state, sum(catalog_returns.cr_return_amt_inc_tax)@2 as ctr_total_return] - │ AggregateExec: mode=FinalPartitioned, gby=[cr_returning_customer_sk@0 as cr_returning_customer_sk, ca_state@1 as ca_state], aggr=[sum(catalog_returns.cr_return_amt_inc_tax)] - │ [Stage 9] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ ProjectionExec: expr=[cr_returning_customer_sk@0 as ctr_customer_sk, ca_state@1 as ctr_state, sum(catalog_returns.cr_return_amt_inc_tax)@2 as ctr_total_return] + │ AggregateExec: mode=FinalPartitioned, gby=[cr_returning_customer_sk@0 as cr_returning_customer_sk, ca_state@1 as ca_state], aggr=[sum(catalog_returns.cr_return_amt_inc_tax)] + │ [Stage 4] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 9 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] + ┌───── Stage 4 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([cr_returning_customer_sk@0, ca_state@1], 6), input_partitions=3 │ AggregateExec: mode=Partial, gby=[cr_returning_customer_sk@0 as cr_returning_customer_sk, ca_state@2 as ca_state], aggr=[sum(catalog_returns.cr_return_amt_inc_tax)] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(cr_returning_addr_sk@1, ca_address_sk@0)], projection=[cr_returning_customer_sk@0, cr_return_amt_inc_tax@2, ca_state@4] │ CoalescePartitionsExec - │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cr_returned_date_sk@0)], projection=[cr_returning_customer_sk@2, cr_returning_addr_sk@3, cr_return_amt_inc_tax@4] │ CoalescePartitionsExec - │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_returning_addr_sk, cr_return_amt_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_returning_addr_sk, cr_return_amt_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_returning_addr_sk, cr_return_amt_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_returning_addr_sk, cr_return_amt_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2000, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] └────────────────────────────────────────────────── + ┌───── Stage 10 ── Tasks: t0:[p0..p2] t1:[p0..p2] + │ RepartitionExec: partitioning=Hash([ctr_state@0], 3), input_partitions=3 + │ AggregateExec: mode=Partial, gby=[ctr_state@0 as ctr_state], aggr=[avg(ctr2.ctr_total_return)] + │ ProjectionExec: expr=[ca_state@1 as ctr_state, sum(catalog_returns.cr_return_amt_inc_tax)@2 as ctr_total_return] + │ AggregateExec: mode=FinalPartitioned, gby=[cr_returning_customer_sk@0 as cr_returning_customer_sk, ca_state@1 as ca_state], aggr=[sum(catalog_returns.cr_return_amt_inc_tax)] + │ [Stage 9] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + └────────────────────────────────────────────────── + ┌───── Stage 9 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] + │ RepartitionExec: partitioning=Hash([cr_returning_customer_sk@0, ca_state@1], 6), input_partitions=3 + │ AggregateExec: mode=Partial, gby=[cr_returning_customer_sk@0 as cr_returning_customer_sk, ca_state@2 as ca_state], aggr=[sum(catalog_returns.cr_return_amt_inc_tax)] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(cr_returning_addr_sk@1, ca_address_sk@0)], projection=[cr_returning_customer_sk@0, cr_return_amt_inc_tax@2, ca_state@4] + │ CoalescePartitionsExec + │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + └────────────────────────────────────────────────── + ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cr_returned_date_sk@0)], projection=[cr_returning_customer_sk@2, cr_returning_addr_sk@3, cr_return_amt_inc_tax@4] + │ CoalescePartitionsExec + │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_returning_addr_sk, cr_return_amt_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_returning_addr_sk, cr_return_amt_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_returning_addr_sk, cr_return_amt_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_returning_addr_sk, cr_return_amt_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ] + └────────────────────────────────────────────────── + ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ FilterExec: d_year@1 = 2000, projection=[d_date_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + └────────────────────────────────────────────────── "); Ok(()) } #[tokio::test] async fn test_tpcds_82() -> Result<()> { let display = test_tpcds_query("q82").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [i_item_id@0 ASC NULLS LAST], fetch=100 - │ [Stage 5] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 + │ SortExec: TopK(fetch=100), expr=[i_item_id@0 ASC NULLS LAST], preserve_partitioning=[true] + │ AggregateExec: mode=FinalPartitioned, gby=[i_item_id@0 as i_item_id, i_item_desc@1 as i_item_desc, i_current_price@2 as i_current_price], aggr=[] + │ RepartitionExec: partitioning=Hash([i_item_id@0, i_item_desc@1, i_current_price@2], 3), input_partitions=3 + │ AggregateExec: mode=Partial, gby=[i_item_id@0 as i_item_id, i_item_desc@1 as i_item_desc, i_current_price@2 as i_current_price], aggr=[] + │ HashJoinExec: mode=CollectLeft, join_type=LeftSemi, on=[(i_item_sk@0, ss_item_sk@0)], projection=[i_item_id@1, i_item_desc@2, i_current_price@3] + │ CoalescePartitionsExec + │ [Stage 3] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 5 ── Tasks: t0:[p0..p2] t1:[p0..p2] - │ SortExec: TopK(fetch=100), expr=[i_item_id@0 ASC NULLS LAST], preserve_partitioning=[true] - │ AggregateExec: mode=FinalPartitioned, gby=[i_item_id@0 as i_item_id, i_item_desc@1 as i_item_desc, i_current_price@2 as i_current_price], aggr=[] - │ [Stage 4] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + ┌───── Stage 3 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_date_sk@0, inv_date_sk@4)], projection=[i_item_sk@0, i_item_id@1, i_item_desc@2, i_current_price@3] + │ CoalescePartitionsExec + │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, inv_item_sk@1)], projection=[i_item_sk@0, i_item_id@1, i_item_desc@2, i_current_price@3, inv_date_sk@4] + │ CoalescePartitionsExec + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ FilterExec: inv_quantity_on_hand@2 >= 100 AND inv_quantity_on_hand@2 <= 500, projection=[inv_date_sk@0, inv_item_sk@1] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] └────────────────────────────────────────────────── - ┌───── Stage 4 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] - │ RepartitionExec: partitioning=Hash([i_item_id@0, i_item_desc@1, i_current_price@2], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[i_item_id@0 as i_item_id, i_item_desc@1 as i_item_desc, i_current_price@2 as i_current_price], aggr=[] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ss_item_sk@0)], projection=[i_item_id@1, i_item_desc@2, i_current_price@3] - │ CoalescePartitionsExec - │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ FilterExec: d_date@1 >= 2000-05-25 AND d_date@1 <= 2000-07-24, projection=[d_date_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-05-25 AND d_date@2 <= 2000-07-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-05-25 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-07-24, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-05-25 AND d_date@2 <= 2000-07-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-05-25 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-07-24, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-05-25 AND d_date@2 <= 2000-07-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-05-25 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-07-24, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-05-25 AND d_date@2 <= 2000-07-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-05-25 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-07-24, required_guarantees=[] + └────────────────────────────────────────────────── + ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ FilterExec: i_current_price@3 >= 62.00 AND i_current_price@3 <= 92.00 AND i_manufact_id@4 IN (SET) ([129, 270, 821, 423]), projection=[i_item_sk@0, i_item_id@1, i_item_desc@2, i_current_price@3] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= 62.00 AND i_current_price@5 <= 92.00 AND i_manufact_id@13 IN (SET) ([129, 270, 821, 423]) AND DynamicFilter [ empty ], pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 62.00 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 92.00 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 129 AND 129 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 270 AND 270 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 821 AND 821 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 423 AND 423 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (129, 270, 423, 821)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= 62.00 AND i_current_price@5 <= 92.00 AND i_manufact_id@13 IN (SET) ([129, 270, 821, 423]) AND DynamicFilter [ empty ], pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 62.00 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 92.00 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 129 AND 129 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 270 AND 270 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 821 AND 821 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 423 AND 423 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (129, 270, 423, 821)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= 62.00 AND i_current_price@5 <= 92.00 AND i_manufact_id@13 IN (SET) ([129, 270, 821, 423]) AND DynamicFilter [ empty ], pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 62.00 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 92.00 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 129 AND 129 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 270 AND 270 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 821 AND 821 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 423 AND 423 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (129, 270, 423, 821)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= 62.00 AND i_current_price@5 <= 92.00 AND i_manufact_id@13 IN (SET) ([129, 270, 821, 423]) AND DynamicFilter [ empty ], pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 62.00 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 92.00 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 129 AND 129 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 270 AND 270 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 821 AND 821 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 423 AND 423 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (129, 270, 423, 821)] └────────────────────────────────────────────────── - ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, inv_date_sk@4)], projection=[i_item_sk@1, i_item_id@2, i_item_desc@3, i_current_price@4] - │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, inv_item_sk@1)], projection=[i_item_sk@0, i_item_id@1, i_item_desc@2, i_current_price@3, inv_date_sk@4] - │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ FilterExec: inv_quantity_on_hand@2 >= 100 AND inv_quantity_on_hand@2 <= 500, projection=[inv_date_sk@0, inv_item_sk@1] - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] - └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: d_date@1 >= 2000-05-25 AND d_date@1 <= 2000-07-24, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-05-25 AND d_date@2 <= 2000-07-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-05-25 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-07-24, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-05-25 AND d_date@2 <= 2000-07-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-05-25 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-07-24, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-05-25 AND d_date@2 <= 2000-07-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-05-25 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-07-24, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-05-25 AND d_date@2 <= 2000-07-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-05-25 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-07-24, required_guarantees=[] - └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: i_current_price@3 >= Some(6200),7,2 AND i_current_price@3 <= Some(9200),7,2 AND i_manufact_id@4 IN (SET) ([129, 270, 821, 423]), projection=[i_item_sk@0, i_item_id@1, i_item_desc@2, i_current_price@3] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= Some(6200),7,2 AND i_current_price@5 <= Some(9200),7,2 AND i_manufact_id@13 IN (SET) ([129, 270, 821, 423]) AND DynamicFilter [ empty ], pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= Some(6200),7,2 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= Some(9200),7,2 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 129 AND 129 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 270 AND 270 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 821 AND 821 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 423 AND 423 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (129, 270, 423, 821)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= Some(6200),7,2 AND i_current_price@5 <= Some(9200),7,2 AND i_manufact_id@13 IN (SET) ([129, 270, 821, 423]) AND DynamicFilter [ empty ], pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= Some(6200),7,2 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= Some(9200),7,2 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 129 AND 129 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 270 AND 270 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 821 AND 821 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 423 AND 423 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (129, 270, 423, 821)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= Some(6200),7,2 AND i_current_price@5 <= Some(9200),7,2 AND i_manufact_id@13 IN (SET) ([129, 270, 821, 423]) AND DynamicFilter [ empty ], pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= Some(6200),7,2 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= Some(9200),7,2 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 129 AND 129 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 270 AND 270 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 821 AND 821 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 423 AND 423 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (129, 270, 423, 821)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= Some(6200),7,2 AND i_current_price@5 <= Some(9200),7,2 AND i_manufact_id@13 IN (SET) ([129, 270, 821, 423]) AND DynamicFilter [ empty ], pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= Some(6200),7,2 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= Some(9200),7,2 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 129 AND 129 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 270 AND 270 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 821 AND 821 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 423 AND 423 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (129, 270, 423, 821)] - └────────────────────────────────────────────────── "); Ok(()) } #[tokio::test] async fn test_tpcds_83() -> Result<()> { let display = test_tpcds_query("q83").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [item_id@0 ASC], fetch=100 │ [Stage 16] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -11028,50 +10710,46 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_week_seq@0, d_week_seq@1)], projection=[d_date@0] │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(wr_returned_date_sk@0, d_date_sk@0)], projection=[wr_return_quantity@1, i_item_id@2, d_date@4] │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, wr_item_sk@1)], projection=[wr_returned_date_sk@2, wr_return_quantity@4, i_item_id@1] │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] + │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 │ FilterExec: d_date@0 = 2000-06-30 OR d_date@0 = 2000-09-27 OR d_date@0 = 2000-11-17, projection=[d_week_seq@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-06-30 OR d_date@2 = 2000-09-27 OR d_date@2 = 2000-11-17, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-06-30 AND 2000-06-30 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-09-27 AND 2000-09-27 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-11-17 AND 2000-11-17 <= d_date_max@1, required_guarantees=[d_date in (2000-06-30, 2000-09-27, 2000-11-17)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-06-30 OR d_date@2 = 2000-09-27 OR d_date@2 = 2000-11-17, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-06-30 AND 2000-06-30 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-09-27 AND 2000-09-27 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-11-17 AND 2000-11-17 <= d_date_max@1, required_guarantees=[d_date in (2000-06-30, 2000-09-27, 2000-11-17)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-06-30 OR d_date@2 = 2000-09-27 OR d_date@2 = 2000-11-17, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-06-30 AND 2000-06-30 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-09-27 AND 2000-09-27 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-11-17 AND 2000-11-17 <= d_date_max@1, required_guarantees=[d_date in (2000-06-30, 2000-09-27, 2000-11-17)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-06-30 OR d_date@2 = 2000-09-27 OR d_date@2 = 2000-11-17, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-06-30 AND 2000-06-30 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-09-27 AND 2000-09-27 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-11-17 AND 2000-11-17 <= d_date_max@1, required_guarantees=[d_date in (2000-06-30, 2000-09-27, 2000-11-17)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-06-30 OR d_date@2 = 2000-09-27 OR d_date@2 = 2000-11-17, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-06-30 AND 2000-06-30 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-09-27 AND 2000-09-27 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-11-17 AND 2000-11-17 <= d_date_max@1, required_guarantees=[d_date in (2000-06-30, 2000-09-27, 2000-11-17)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-06-30 OR d_date@2 = 2000-09-27 OR d_date@2 = 2000-11-17, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-06-30 AND 2000-06-30 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-09-27 AND 2000-09-27 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-11-17 AND 2000-11-17 <= d_date_max@1, required_guarantees=[d_date in (2000-06-30, 2000-09-27, 2000-11-17)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-06-30 OR d_date@2 = 2000-09-27 OR d_date@2 = 2000-11-17, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-06-30 AND 2000-06-30 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-09-27 AND 2000-09-27 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-11-17 AND 2000-11-17 <= d_date_max@1, required_guarantees=[d_date in (2000-06-30, 2000-09-27, 2000-11-17)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-06-30 OR d_date@2 = 2000-09-27 OR d_date@2 = 2000-11-17, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-06-30 AND 2000-06-30 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-09-27 AND 2000-09-27 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-11-17 AND 2000-11-17 <= d_date_max@1, required_guarantees=[d_date in (2000-06-30, 2000-09-27, 2000-11-17)] └────────────────────────────────────────────────── ┌───── Stage 10 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([i_item_id@0], 6), input_partitions=3 @@ -11081,10 +10759,10 @@ mod tests { │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cr_returned_date_sk@0)], projection=[cr_return_quantity@3, i_item_id@4, d_date@1] │ CoalescePartitionsExec - │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, cr_item_sk@1)], projection=[cr_returned_date_sk@2, cr_return_quantity@4, i_item_id@1] │ CoalescePartitionsExec - │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..]]}, projection=[cr_returned_date_sk, cr_item_sk, cr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_item_sk, cr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] @@ -11096,38 +10774,36 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_week_seq@0, d_week_seq@1)], projection=[d_date@0] │ CoalescePartitionsExec │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_date@0 = 2000-06-30 OR d_date@0 = 2000-09-27 OR d_date@0 = 2000-11-17, projection=[d_week_seq@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-06-30 OR d_date@2 = 2000-09-27 OR d_date@2 = 2000-11-17, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-06-30 AND 2000-06-30 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-09-27 AND 2000-09-27 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-11-17 AND 2000-11-17 <= d_date_max@1, required_guarantees=[d_date in (2000-06-30, 2000-09-27, 2000-11-17)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-06-30 OR d_date@2 = 2000-09-27 OR d_date@2 = 2000-11-17, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-06-30 AND 2000-06-30 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-09-27 AND 2000-09-27 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-11-17 AND 2000-11-17 <= d_date_max@1, required_guarantees=[d_date in (2000-06-30, 2000-09-27, 2000-11-17)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-06-30 OR d_date@2 = 2000-09-27 OR d_date@2 = 2000-11-17, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-06-30 AND 2000-06-30 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-09-27 AND 2000-09-27 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-11-17 AND 2000-11-17 <= d_date_max@1, required_guarantees=[d_date in (2000-06-30, 2000-09-27, 2000-11-17)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-06-30 OR d_date@2 = 2000-09-27 OR d_date@2 = 2000-11-17, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-06-30 AND 2000-06-30 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-09-27 AND 2000-09-27 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-11-17 AND 2000-11-17 <= d_date_max@1, required_guarantees=[d_date in (2000-06-30, 2000-09-27, 2000-11-17)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-06-30 OR d_date@2 = 2000-09-27 OR d_date@2 = 2000-11-17, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-06-30 AND 2000-06-30 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-09-27 AND 2000-09-27 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-11-17 AND 2000-11-17 <= d_date_max@1, required_guarantees=[d_date in (2000-06-30, 2000-09-27, 2000-11-17)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-06-30 OR d_date@2 = 2000-09-27 OR d_date@2 = 2000-11-17, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-06-30 AND 2000-06-30 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-09-27 AND 2000-09-27 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-11-17 AND 2000-11-17 <= d_date_max@1, required_guarantees=[d_date in (2000-06-30, 2000-09-27, 2000-11-17)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-06-30 OR d_date@2 = 2000-09-27 OR d_date@2 = 2000-11-17, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-06-30 AND 2000-06-30 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-09-27 AND 2000-09-27 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-11-17 AND 2000-11-17 <= d_date_max@1, required_guarantees=[d_date in (2000-06-30, 2000-09-27, 2000-11-17)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-06-30 OR d_date@2 = 2000-09-27 OR d_date@2 = 2000-11-17, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-06-30 AND 2000-06-30 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-09-27 AND 2000-09-27 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-11-17 AND 2000-11-17 <= d_date_max@1, required_guarantees=[d_date in (2000-06-30, 2000-09-27, 2000-11-17)] └────────────────────────────────────────────────── - ┌───── Stage 8 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - └────────────────────────────────────────────────── - ┌───── Stage 9 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + └────────────────────────────────────────────────── + ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 15 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([i_item_id@0], 6), input_partitions=3 @@ -11137,10 +10813,10 @@ mod tests { │ [Stage 12] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, sr_returned_date_sk@0)], projection=[sr_return_quantity@3, i_item_id@4, d_date@1] │ CoalescePartitionsExec - │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, sr_item_sk@1)], projection=[sr_returned_date_sk@2, sr_return_quantity@4, i_item_id@1] │ CoalescePartitionsExec - │ [Stage 14] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 14] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] @@ -11152,38 +10828,36 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_week_seq@0, d_week_seq@1)], projection=[d_date@0] │ CoalescePartitionsExec │ [Stage 11] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 11 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_date@0 = 2000-06-30 OR d_date@0 = 2000-09-27 OR d_date@0 = 2000-11-17, projection=[d_week_seq@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-06-30 OR d_date@2 = 2000-09-27 OR d_date@2 = 2000-11-17, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-06-30 AND 2000-06-30 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-09-27 AND 2000-09-27 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-11-17 AND 2000-11-17 <= d_date_max@1, required_guarantees=[d_date in (2000-06-30, 2000-09-27, 2000-11-17)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-06-30 OR d_date@2 = 2000-09-27 OR d_date@2 = 2000-11-17, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-06-30 AND 2000-06-30 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-09-27 AND 2000-09-27 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-11-17 AND 2000-11-17 <= d_date_max@1, required_guarantees=[d_date in (2000-06-30, 2000-09-27, 2000-11-17)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-06-30 OR d_date@2 = 2000-09-27 OR d_date@2 = 2000-11-17, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-06-30 AND 2000-06-30 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-09-27 AND 2000-09-27 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-11-17 AND 2000-11-17 <= d_date_max@1, required_guarantees=[d_date in (2000-06-30, 2000-09-27, 2000-11-17)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-06-30 OR d_date@2 = 2000-09-27 OR d_date@2 = 2000-11-17, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-06-30 AND 2000-06-30 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-09-27 AND 2000-09-27 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-11-17 AND 2000-11-17 <= d_date_max@1, required_guarantees=[d_date in (2000-06-30, 2000-09-27, 2000-11-17)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-06-30 OR d_date@2 = 2000-09-27 OR d_date@2 = 2000-11-17, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-06-30 AND 2000-06-30 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-09-27 AND 2000-09-27 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-11-17 AND 2000-11-17 <= d_date_max@1, required_guarantees=[d_date in (2000-06-30, 2000-09-27, 2000-11-17)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-06-30 OR d_date@2 = 2000-09-27 OR d_date@2 = 2000-11-17, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-06-30 AND 2000-06-30 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-09-27 AND 2000-09-27 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-11-17 AND 2000-11-17 <= d_date_max@1, required_guarantees=[d_date in (2000-06-30, 2000-09-27, 2000-11-17)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-06-30 OR d_date@2 = 2000-09-27 OR d_date@2 = 2000-11-17, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-06-30 AND 2000-06-30 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-09-27 AND 2000-09-27 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-11-17 AND 2000-11-17 <= d_date_max@1, required_guarantees=[d_date in (2000-06-30, 2000-09-27, 2000-11-17)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=d_date@2 = 2000-06-30 OR d_date@2 = 2000-09-27 OR d_date@2 = 2000-11-17, pruning_predicate=d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-06-30 AND 2000-06-30 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-09-27 AND 2000-09-27 <= d_date_max@1 OR d_date_null_count@2 != row_count@3 AND d_date_min@0 <= 2000-11-17 AND 2000-11-17 <= d_date_max@1, required_guarantees=[d_date in (2000-06-30, 2000-09-27, 2000-11-17)] └────────────────────────────────────────────────── - ┌───── Stage 13 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 14 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 14 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── "); Ok(()) @@ -11191,7 +10865,7 @@ mod tests { #[tokio::test] async fn test_tpcds_84() -> Result<()> { let display = test_tpcds_query("q84").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [customer_id@0 ASC], fetch=100 │ [Stage 6] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 @@ -11223,7 +10897,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk], file_type=parquet, predicate=DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk], file_type=parquet, predicate=DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -11248,22 +10922,20 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, c_current_addr_sk@3)], projection=[c_customer_id@1, c_current_cdemo_sk@2, c_current_hdemo_sk@3, c_first_name@5, c_last_name@6] │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_id, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_id, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_id, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_id, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_id, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_id, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_id, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_id, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: ca_city@1 = Edgewood, projection=[ca_address_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet, predicate=ca_city@6 = Edgewood, pruning_predicate=ca_city_null_count@2 != row_count@3 AND ca_city_min@0 <= Edgewood AND Edgewood <= ca_city_max@1, required_guarantees=[ca_city in (Edgewood)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet, predicate=ca_city@6 = Edgewood, pruning_predicate=ca_city_null_count@2 != row_count@3 AND ca_city_min@0 <= Edgewood AND Edgewood <= ca_city_max@1, required_guarantees=[ca_city in (Edgewood)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet, predicate=ca_city@6 = Edgewood, pruning_predicate=ca_city_null_count@2 != row_count@3 AND ca_city_min@0 <= Edgewood AND Edgewood <= ca_city_max@1, required_guarantees=[ca_city in (Edgewood)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet, predicate=ca_city@6 = Edgewood, pruning_predicate=ca_city_null_count@2 != row_count@3 AND ca_city_min@0 <= Edgewood AND Edgewood <= ca_city_max@1, required_guarantees=[ca_city in (Edgewood)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet, predicate=ca_city@6 = Edgewood, pruning_predicate=ca_city_null_count@2 != row_count@3 AND ca_city_min@0 <= Edgewood AND Edgewood <= ca_city_max@1, required_guarantees=[ca_city in (Edgewood)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet, predicate=ca_city@6 = Edgewood, pruning_predicate=ca_city_null_count@2 != row_count@3 AND ca_city_min@0 <= Edgewood AND Edgewood <= ca_city_max@1, required_guarantees=[ca_city in (Edgewood)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet, predicate=ca_city@6 = Edgewood, pruning_predicate=ca_city_null_count@2 != row_count@3 AND ca_city_min@0 <= Edgewood AND Edgewood <= ca_city_max@1, required_guarantees=[ca_city in (Edgewood)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city], file_type=parquet, predicate=ca_city@6 = Edgewood, pruning_predicate=ca_city_null_count@2 != row_count@3 AND ca_city_min@0 <= Edgewood AND Edgewood <= ca_city_max@1, required_guarantees=[ca_city in (Edgewood)] └────────────────────────────────────────────────── "); Ok(()) @@ -11271,7 +10943,7 @@ mod tests { #[tokio::test] async fn test_tpcds_85() -> Result<()> { let display = test_tpcds_query("q85").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [substr(reason.r_reason_desc,Int64(1),Int64(20))@0 ASC NULLS LAST, avg1@1 ASC NULLS LAST, avg2@2 ASC NULLS LAST, avg(web_returns.wr_fee)@3 ASC NULLS LAST], fetch=100 │ [Stage 12] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -11291,7 +10963,7 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[ws_quantity@2, wr_reason_sk@3, wr_fee@4, wr_refunded_cash@5] │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, wr_refunded_addr_sk@3)], filter=(ca_state@1 = IN OR ca_state@1 = OH OR ca_state@1 = NJ) AND ws_net_profit@0 >= Some(10000),7,2 AND ws_net_profit@0 <= Some(20000),7,2 OR (ca_state@1 = WI OR ca_state@1 = CT OR ca_state@1 = KY) AND ws_net_profit@0 >= Some(15000),7,2 AND ws_net_profit@0 <= Some(30000),7,2 OR (ca_state@1 = LA OR ca_state@1 = IA OR ca_state@1 = AR) AND ws_net_profit@0 >= Some(5000),7,2 AND ws_net_profit@0 <= Some(25000),7,2, projection=[ws_sold_date_sk@2, ws_quantity@3, wr_reason_sk@6, wr_fee@7, wr_refunded_cash@8] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, wr_refunded_addr_sk@3)], filter=(ca_state@1 = IN OR ca_state@1 = OH OR ca_state@1 = NJ) AND ws_net_profit@0 >= 100.00 AND ws_net_profit@0 <= 200.00 OR (ca_state@1 = WI OR ca_state@1 = CT OR ca_state@1 = KY) AND ws_net_profit@0 >= 150.00 AND ws_net_profit@0 <= 300.00 OR (ca_state@1 = LA OR ca_state@1 = IA OR ca_state@1 = AR) AND ws_net_profit@0 >= 50.00 AND ws_net_profit@0 <= 250.00, projection=[ws_sold_date_sk@2, ws_quantity@3, wr_reason_sk@6, wr_fee@7, wr_refunded_cash@8] │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(wr_returning_cdemo_sk@4, cd_demo_sk@0), (cd_marital_status@8, cd_marital_status@1), (cd_education_status@9, cd_education_status@2)], projection=[ws_sold_date_sk@0, ws_quantity@1, ws_net_profit@2, wr_refunded_addr_sk@3, wr_reason_sk@5, wr_fee@6, wr_refunded_cash@7] @@ -11309,26 +10981,24 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2000, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2000, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2000 AND 2000 <= d_year_max@1, required_guarantees=[d_year in (2000)] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: ca_country@2 = United States AND ca_state@1 IN (SET) ([IN, OH, NJ, WI, CT, KY, LA, IA, AR]) AND (ca_state@1 = IN OR ca_state@1 = OH OR ca_state@1 = NJ OR ca_state@1 = WI OR ca_state@1 = CT OR ca_state@1 = KY OR ca_state@1 = LA OR ca_state@1 = IA OR ca_state@1 = AR), projection=[ca_address_sk@0, ca_state@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_country], file_type=parquet, predicate=ca_country@10 = United States AND ca_state@8 IN (SET) ([IN, OH, NJ, WI, CT, KY, LA, IA, AR]) AND (ca_state@8 = IN OR ca_state@8 = OH OR ca_state@8 = NJ OR ca_state@8 = WI OR ca_state@8 = CT OR ca_state@8 = KY OR ca_state@8 = LA OR ca_state@8 = IA OR ca_state@8 = AR), pruning_predicate=ca_country_null_count@2 != row_count@3 AND ca_country_min@0 <= United States AND United States <= ca_country_max@1 AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IN AND IN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NJ AND NJ <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= WI AND WI <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CT AND CT <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= LA AND LA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IA AND IA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= AR AND AR <= ca_state_max@5) AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IN AND IN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NJ AND NJ <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= WI AND WI <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CT AND CT <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= LA AND LA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IA AND IA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= AR AND AR <= ca_state_max@5), required_guarantees=[ca_country in (United States), ca_state in (AR, CT, IA, IN, KY, LA, NJ, OH, WI)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_country], file_type=parquet, predicate=ca_country@10 = United States AND ca_state@8 IN (SET) ([IN, OH, NJ, WI, CT, KY, LA, IA, AR]) AND (ca_state@8 = IN OR ca_state@8 = OH OR ca_state@8 = NJ OR ca_state@8 = WI OR ca_state@8 = CT OR ca_state@8 = KY OR ca_state@8 = LA OR ca_state@8 = IA OR ca_state@8 = AR), pruning_predicate=ca_country_null_count@2 != row_count@3 AND ca_country_min@0 <= United States AND United States <= ca_country_max@1 AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IN AND IN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NJ AND NJ <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= WI AND WI <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CT AND CT <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= LA AND LA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IA AND IA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= AR AND AR <= ca_state_max@5) AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IN AND IN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NJ AND NJ <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= WI AND WI <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CT AND CT <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= LA AND LA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IA AND IA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= AR AND AR <= ca_state_max@5), required_guarantees=[ca_country in (United States), ca_state in (AR, CT, IA, IN, KY, LA, NJ, OH, WI)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_country], file_type=parquet, predicate=ca_country@10 = United States AND ca_state@8 IN (SET) ([IN, OH, NJ, WI, CT, KY, LA, IA, AR]) AND (ca_state@8 = IN OR ca_state@8 = OH OR ca_state@8 = NJ OR ca_state@8 = WI OR ca_state@8 = CT OR ca_state@8 = KY OR ca_state@8 = LA OR ca_state@8 = IA OR ca_state@8 = AR), pruning_predicate=ca_country_null_count@2 != row_count@3 AND ca_country_min@0 <= United States AND United States <= ca_country_max@1 AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IN AND IN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NJ AND NJ <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= WI AND WI <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CT AND CT <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= LA AND LA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IA AND IA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= AR AND AR <= ca_state_max@5) AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IN AND IN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NJ AND NJ <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= WI AND WI <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CT AND CT <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= LA AND LA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IA AND IA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= AR AND AR <= ca_state_max@5), required_guarantees=[ca_country in (United States), ca_state in (AR, CT, IA, IN, KY, LA, NJ, OH, WI)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_country], file_type=parquet, predicate=ca_country@10 = United States AND ca_state@8 IN (SET) ([IN, OH, NJ, WI, CT, KY, LA, IA, AR]) AND (ca_state@8 = IN OR ca_state@8 = OH OR ca_state@8 = NJ OR ca_state@8 = WI OR ca_state@8 = CT OR ca_state@8 = KY OR ca_state@8 = LA OR ca_state@8 = IA OR ca_state@8 = AR), pruning_predicate=ca_country_null_count@2 != row_count@3 AND ca_country_min@0 <= United States AND United States <= ca_country_max@1 AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IN AND IN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NJ AND NJ <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= WI AND WI <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CT AND CT <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= LA AND LA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IA AND IA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= AR AND AR <= ca_state_max@5) AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IN AND IN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NJ AND NJ <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= WI AND WI <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CT AND CT <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= LA AND LA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IA AND IA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= AR AND AR <= ca_state_max@5), required_guarantees=[ca_country in (United States), ca_state in (AR, CT, IA, IN, KY, LA, NJ, OH, WI)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_country], file_type=parquet, predicate=ca_country@10 = United States AND ca_state@8 IN (SET) ([IN, OH, NJ, WI, CT, KY, LA, IA, AR]) AND (ca_state@8 = IN OR ca_state@8 = OH OR ca_state@8 = NJ OR ca_state@8 = WI OR ca_state@8 = CT OR ca_state@8 = KY OR ca_state@8 = LA OR ca_state@8 = IA OR ca_state@8 = AR), pruning_predicate=ca_country_null_count@2 != row_count@3 AND ca_country_min@0 <= United States AND United States <= ca_country_max@1 AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IN AND IN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NJ AND NJ <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= WI AND WI <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CT AND CT <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= LA AND LA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IA AND IA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= AR AND AR <= ca_state_max@5) AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IN AND IN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NJ AND NJ <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= WI AND WI <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CT AND CT <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= LA AND LA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IA AND IA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= AR AND AR <= ca_state_max@5), required_guarantees=[ca_country in (United States), ca_state in (AR, CT, IA, IN, KY, LA, NJ, OH, WI)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_country], file_type=parquet, predicate=ca_country@10 = United States AND ca_state@8 IN (SET) ([IN, OH, NJ, WI, CT, KY, LA, IA, AR]) AND (ca_state@8 = IN OR ca_state@8 = OH OR ca_state@8 = NJ OR ca_state@8 = WI OR ca_state@8 = CT OR ca_state@8 = KY OR ca_state@8 = LA OR ca_state@8 = IA OR ca_state@8 = AR), pruning_predicate=ca_country_null_count@2 != row_count@3 AND ca_country_min@0 <= United States AND United States <= ca_country_max@1 AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IN AND IN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NJ AND NJ <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= WI AND WI <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CT AND CT <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= LA AND LA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IA AND IA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= AR AND AR <= ca_state_max@5) AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IN AND IN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NJ AND NJ <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= WI AND WI <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CT AND CT <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= LA AND LA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IA AND IA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= AR AND AR <= ca_state_max@5), required_guarantees=[ca_country in (United States), ca_state in (AR, CT, IA, IN, KY, LA, NJ, OH, WI)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_country], file_type=parquet, predicate=ca_country@10 = United States AND ca_state@8 IN (SET) ([IN, OH, NJ, WI, CT, KY, LA, IA, AR]) AND (ca_state@8 = IN OR ca_state@8 = OH OR ca_state@8 = NJ OR ca_state@8 = WI OR ca_state@8 = CT OR ca_state@8 = KY OR ca_state@8 = LA OR ca_state@8 = IA OR ca_state@8 = AR), pruning_predicate=ca_country_null_count@2 != row_count@3 AND ca_country_min@0 <= United States AND United States <= ca_country_max@1 AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IN AND IN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NJ AND NJ <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= WI AND WI <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CT AND CT <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= LA AND LA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IA AND IA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= AR AND AR <= ca_state_max@5) AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IN AND IN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NJ AND NJ <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= WI AND WI <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CT AND CT <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= LA AND LA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IA AND IA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= AR AND AR <= ca_state_max@5), required_guarantees=[ca_country in (United States), ca_state in (AR, CT, IA, IN, KY, LA, NJ, OH, WI)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_country], file_type=parquet, predicate=ca_country@10 = United States AND ca_state@8 IN (SET) ([IN, OH, NJ, WI, CT, KY, LA, IA, AR]) AND (ca_state@8 = IN OR ca_state@8 = OH OR ca_state@8 = NJ OR ca_state@8 = WI OR ca_state@8 = CT OR ca_state@8 = KY OR ca_state@8 = LA OR ca_state@8 = IA OR ca_state@8 = AR), pruning_predicate=ca_country_null_count@2 != row_count@3 AND ca_country_min@0 <= United States AND United States <= ca_country_max@1 AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IN AND IN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NJ AND NJ <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= WI AND WI <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CT AND CT <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= LA AND LA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IA AND IA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= AR AND AR <= ca_state_max@5) AND (ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IN AND IN <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= OH AND OH <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= NJ AND NJ <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= WI AND WI <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= CT AND CT <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= KY AND KY <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= LA AND LA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= IA AND IA <= ca_state_max@5 OR ca_state_null_count@6 != row_count@3 AND ca_state_min@4 <= AR AND AR <= ca_state_max@5), required_guarantees=[ca_country in (United States), ca_state in (AR, CT, IA, IN, KY, LA, NJ, OH, WI)] └────────────────────────────────────────────────── ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([wr_returning_cdemo_sk@4, cd_marital_status@8, cd_education_status@9], 12), input_partitions=3 - │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(wr_refunded_cdemo_sk@4, cd_demo_sk@0)], filter=cd_marital_status@1 = M AND cd_education_status@2 = Advanced Degree AND ws_sales_price@0 >= Some(10000),7,2 AND ws_sales_price@0 <= Some(15000),7,2 OR cd_marital_status@1 = S AND cd_education_status@2 = College AND ws_sales_price@0 >= Some(5000),7,2 AND ws_sales_price@0 <= Some(10000),7,2 OR cd_marital_status@1 = W AND cd_education_status@2 = 2 yr Degree AND ws_sales_price@0 >= Some(15000),7,2 AND ws_sales_price@0 <= Some(20000),7,2, projection=[ws_sold_date_sk@0, ws_quantity@1, ws_net_profit@3, wr_refunded_addr_sk@5, wr_returning_cdemo_sk@6, wr_reason_sk@7, wr_fee@8, wr_refunded_cash@9, cd_marital_status@11, cd_education_status@12] + │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(wr_refunded_cdemo_sk@4, cd_demo_sk@0)], filter=cd_marital_status@1 = M AND cd_education_status@2 = Advanced Degree AND ws_sales_price@0 >= 100.00 AND ws_sales_price@0 <= 150.00 OR cd_marital_status@1 = S AND cd_education_status@2 = College AND ws_sales_price@0 >= 50.00 AND ws_sales_price@0 <= 100.00 OR cd_marital_status@1 = W AND cd_education_status@2 = 2 yr Degree AND ws_sales_price@0 >= 150.00 AND ws_sales_price@0 <= 200.00, projection=[ws_sold_date_sk@0, ws_quantity@1, ws_net_profit@3, wr_refunded_addr_sk@5, wr_returning_cdemo_sk@6, wr_reason_sk@7, wr_fee@8, wr_refunded_cash@9, cd_marital_status@11, cd_education_status@12] │ [Stage 7] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ [Stage 8] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── @@ -11350,21 +11020,21 @@ mod tests { │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_page/part-3.parquet:..]]}, projection=[wp_web_page_sk], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([wr_item_sk@0, wr_order_number@5], 12), input_partitions=2 + │ RepartitionExec: partitioning=Hash([wr_item_sk@0, wr_order_number@5], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_item_sk, wr_refunded_cdemo_sk, wr_refunded_addr_sk, wr_returning_cdemo_sk, wr_reason_sk, wr_order_number, wr_fee, wr_refunded_cash], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_item_sk, wr_refunded_cdemo_sk, wr_refunded_addr_sk, wr_returning_cdemo_sk, wr_reason_sk, wr_order_number, wr_fee, wr_refunded_cash], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_refunded_cdemo_sk, wr_refunded_addr_sk, wr_returning_cdemo_sk, wr_reason_sk, wr_order_number, wr_fee, wr_refunded_cash], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_refunded_cdemo_sk, wr_refunded_addr_sk, wr_returning_cdemo_sk, wr_reason_sk, wr_order_number, wr_fee, wr_refunded_cash], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_item_sk, wr_refunded_cdemo_sk, wr_refunded_addr_sk, wr_returning_cdemo_sk, wr_reason_sk, wr_order_number, wr_fee, wr_refunded_cash], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_refunded_cdemo_sk, wr_refunded_addr_sk, wr_returning_cdemo_sk, wr_reason_sk, wr_order_number, wr_fee, wr_refunded_cash], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_refunded_cdemo_sk, wr_refunded_addr_sk, wr_returning_cdemo_sk, wr_reason_sk, wr_order_number, wr_fee, wr_refunded_cash], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_refunded_cdemo_sk, wr_refunded_addr_sk, wr_returning_cdemo_sk, wr_reason_sk, wr_order_number, wr_fee, wr_refunded_cash], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ws_item_sk@1, ws_order_number@3], 12), input_partitions=3 - │ FilterExec: (ws_net_profit@6 >= Some(10000),7,2 AND ws_net_profit@6 <= Some(20000),7,2 OR ws_net_profit@6 >= Some(15000),7,2 AND ws_net_profit@6 <= Some(30000),7,2 OR ws_net_profit@6 >= Some(5000),7,2 AND ws_net_profit@6 <= Some(25000),7,2) AND (ws_sales_price@5 >= Some(10000),7,2 AND ws_sales_price@5 <= Some(15000),7,2 OR ws_sales_price@5 >= Some(5000),7,2 AND ws_sales_price@5 <= Some(10000),7,2 OR ws_sales_price@5 >= Some(15000),7,2 AND ws_sales_price@5 <= Some(20000),7,2) + │ FilterExec: (ws_net_profit@6 >= 100.00 AND ws_net_profit@6 <= 200.00 OR ws_net_profit@6 >= 150.00 AND ws_net_profit@6 <= 300.00 OR ws_net_profit@6 >= 50.00 AND ws_net_profit@6 <= 250.00) AND (ws_sales_price@5 >= 100.00 AND ws_sales_price@5 <= 150.00 OR ws_sales_price@5 >= 50.00 AND ws_sales_price@5 <= 100.00 OR ws_sales_price@5 >= 150.00 AND ws_sales_price@5 <= 200.00) │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_web_page_sk, ws_order_number, ws_quantity, ws_sales_price, ws_net_profit], file_type=parquet, predicate=(ws_net_profit@33 >= Some(10000),7,2 AND ws_net_profit@33 <= Some(20000),7,2 OR ws_net_profit@33 >= Some(15000),7,2 AND ws_net_profit@33 <= Some(30000),7,2 OR ws_net_profit@33 >= Some(5000),7,2 AND ws_net_profit@33 <= Some(25000),7,2) AND (ws_sales_price@21 >= Some(10000),7,2 AND ws_sales_price@21 <= Some(15000),7,2 OR ws_sales_price@21 >= Some(5000),7,2 AND ws_sales_price@21 <= Some(10000),7,2 OR ws_sales_price@21 >= Some(15000),7,2 AND ws_sales_price@21 <= Some(20000),7,2) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= Some(10000),7,2 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= Some(20000),7,2 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= Some(15000),7,2 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= Some(30000),7,2 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= Some(5000),7,2 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= Some(25000),7,2) AND (ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= Some(10000),7,2 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= Some(15000),7,2 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= Some(5000),7,2 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= Some(10000),7,2 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= Some(15000),7,2 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= Some(20000),7,2), required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_web_page_sk, ws_order_number, ws_quantity, ws_sales_price, ws_net_profit], file_type=parquet, predicate=(ws_net_profit@33 >= Some(10000),7,2 AND ws_net_profit@33 <= Some(20000),7,2 OR ws_net_profit@33 >= Some(15000),7,2 AND ws_net_profit@33 <= Some(30000),7,2 OR ws_net_profit@33 >= Some(5000),7,2 AND ws_net_profit@33 <= Some(25000),7,2) AND (ws_sales_price@21 >= Some(10000),7,2 AND ws_sales_price@21 <= Some(15000),7,2 OR ws_sales_price@21 >= Some(5000),7,2 AND ws_sales_price@21 <= Some(10000),7,2 OR ws_sales_price@21 >= Some(15000),7,2 AND ws_sales_price@21 <= Some(20000),7,2) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= Some(10000),7,2 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= Some(20000),7,2 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= Some(15000),7,2 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= Some(30000),7,2 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= Some(5000),7,2 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= Some(25000),7,2) AND (ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= Some(10000),7,2 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= Some(15000),7,2 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= Some(5000),7,2 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= Some(10000),7,2 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= Some(15000),7,2 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= Some(20000),7,2), required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_web_page_sk, ws_order_number, ws_quantity, ws_sales_price, ws_net_profit], file_type=parquet, predicate=(ws_net_profit@33 >= Some(10000),7,2 AND ws_net_profit@33 <= Some(20000),7,2 OR ws_net_profit@33 >= Some(15000),7,2 AND ws_net_profit@33 <= Some(30000),7,2 OR ws_net_profit@33 >= Some(5000),7,2 AND ws_net_profit@33 <= Some(25000),7,2) AND (ws_sales_price@21 >= Some(10000),7,2 AND ws_sales_price@21 <= Some(15000),7,2 OR ws_sales_price@21 >= Some(5000),7,2 AND ws_sales_price@21 <= Some(10000),7,2 OR ws_sales_price@21 >= Some(15000),7,2 AND ws_sales_price@21 <= Some(20000),7,2) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= Some(10000),7,2 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= Some(20000),7,2 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= Some(15000),7,2 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= Some(30000),7,2 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= Some(5000),7,2 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= Some(25000),7,2) AND (ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= Some(10000),7,2 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= Some(15000),7,2 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= Some(5000),7,2 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= Some(10000),7,2 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= Some(15000),7,2 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= Some(20000),7,2), required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_web_page_sk, ws_order_number, ws_quantity, ws_sales_price, ws_net_profit], file_type=parquet, predicate=(ws_net_profit@33 >= Some(10000),7,2 AND ws_net_profit@33 <= Some(20000),7,2 OR ws_net_profit@33 >= Some(15000),7,2 AND ws_net_profit@33 <= Some(30000),7,2 OR ws_net_profit@33 >= Some(5000),7,2 AND ws_net_profit@33 <= Some(25000),7,2) AND (ws_sales_price@21 >= Some(10000),7,2 AND ws_sales_price@21 <= Some(15000),7,2 OR ws_sales_price@21 >= Some(5000),7,2 AND ws_sales_price@21 <= Some(10000),7,2 OR ws_sales_price@21 >= Some(15000),7,2 AND ws_sales_price@21 <= Some(20000),7,2) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= Some(10000),7,2 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= Some(20000),7,2 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= Some(15000),7,2 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= Some(30000),7,2 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= Some(5000),7,2 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= Some(25000),7,2) AND (ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= Some(10000),7,2 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= Some(15000),7,2 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= Some(5000),7,2 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= Some(10000),7,2 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= Some(15000),7,2 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= Some(20000),7,2), required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_web_page_sk, ws_order_number, ws_quantity, ws_sales_price, ws_net_profit], file_type=parquet, predicate=(ws_net_profit@33 >= 100.00 AND ws_net_profit@33 <= 200.00 OR ws_net_profit@33 >= 150.00 AND ws_net_profit@33 <= 300.00 OR ws_net_profit@33 >= 50.00 AND ws_net_profit@33 <= 250.00) AND (ws_sales_price@21 >= 100.00 AND ws_sales_price@21 <= 150.00 OR ws_sales_price@21 >= 50.00 AND ws_sales_price@21 <= 100.00 OR ws_sales_price@21 >= 150.00 AND ws_sales_price@21 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 100.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 200.00 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 150.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 300.00 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 50.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 250.00) AND (ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 100.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 150.00 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 50.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 100.00 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 150.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 200.00), required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_web_page_sk, ws_order_number, ws_quantity, ws_sales_price, ws_net_profit], file_type=parquet, predicate=(ws_net_profit@33 >= 100.00 AND ws_net_profit@33 <= 200.00 OR ws_net_profit@33 >= 150.00 AND ws_net_profit@33 <= 300.00 OR ws_net_profit@33 >= 50.00 AND ws_net_profit@33 <= 250.00) AND (ws_sales_price@21 >= 100.00 AND ws_sales_price@21 <= 150.00 OR ws_sales_price@21 >= 50.00 AND ws_sales_price@21 <= 100.00 OR ws_sales_price@21 >= 150.00 AND ws_sales_price@21 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 100.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 200.00 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 150.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 300.00 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 50.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 250.00) AND (ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 100.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 150.00 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 50.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 100.00 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 150.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 200.00), required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_web_page_sk, ws_order_number, ws_quantity, ws_sales_price, ws_net_profit], file_type=parquet, predicate=(ws_net_profit@33 >= 100.00 AND ws_net_profit@33 <= 200.00 OR ws_net_profit@33 >= 150.00 AND ws_net_profit@33 <= 300.00 OR ws_net_profit@33 >= 50.00 AND ws_net_profit@33 <= 250.00) AND (ws_sales_price@21 >= 100.00 AND ws_sales_price@21 <= 150.00 OR ws_sales_price@21 >= 50.00 AND ws_sales_price@21 <= 100.00 OR ws_sales_price@21 >= 150.00 AND ws_sales_price@21 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 100.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 200.00 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 150.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 300.00 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 50.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 250.00) AND (ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 100.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 150.00 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 50.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 100.00 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 150.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 200.00), required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_web_page_sk, ws_order_number, ws_quantity, ws_sales_price, ws_net_profit], file_type=parquet, predicate=(ws_net_profit@33 >= 100.00 AND ws_net_profit@33 <= 200.00 OR ws_net_profit@33 >= 150.00 AND ws_net_profit@33 <= 300.00 OR ws_net_profit@33 >= 50.00 AND ws_net_profit@33 <= 250.00) AND (ws_sales_price@21 >= 100.00 AND ws_sales_price@21 <= 150.00 OR ws_sales_price@21 >= 50.00 AND ws_sales_price@21 <= 100.00 OR ws_sales_price@21 >= 150.00 AND ws_sales_price@21 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 100.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 200.00 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 150.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 300.00 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 50.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 250.00) AND (ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 100.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 150.00 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 50.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 100.00 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 150.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 200.00), required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cd_demo_sk@0], 12), input_partitions=3 @@ -11373,7 +11043,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=(cd_marital_status@2 = M AND cd_education_status@3 = Advanced Degree OR cd_marital_status@2 = S AND cd_education_status@3 = College OR cd_marital_status@2 = W AND cd_education_status@3 = 2 yr Degree) AND DynamicFilter [ empty ], pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= S AND S <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= College AND College <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= 2 yr Degree AND 2 yr Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (2 yr Degree, Advanced Degree, College), cd_marital_status in (M, S, W)] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=(cd_marital_status@2 = M AND cd_education_status@3 = Advanced Degree OR cd_marital_status@2 = S AND cd_education_status@3 = College OR cd_marital_status@2 = W AND cd_education_status@3 = 2 yr Degree) AND DynamicFilter [ empty ], pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= S AND S <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= College AND College <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= 2 yr Degree AND 2 yr Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (2 yr Degree, Advanced Degree, College), cd_marital_status in (M, S, W)] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=(cd_marital_status@2 = M AND cd_education_status@3 = Advanced Degree OR cd_marital_status@2 = S AND cd_education_status@3 = College OR cd_marital_status@2 = W AND cd_education_status@3 = 2 yr Degree) AND DynamicFilter [ empty ], pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= S AND S <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= College AND College <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= 2 yr Degree AND 2 yr Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (2 yr Degree, Advanced Degree, College), cd_marital_status in (M, S, W)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=(cd_marital_status@2 = M AND cd_education_status@3 = Advanced Degree OR cd_marital_status@2 = S AND cd_education_status@3 = College OR cd_marital_status@2 = W AND cd_education_status@3 = 2 yr Degree) AND DynamicFilter [ empty ], pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= S AND S <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= College AND College <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= 2 yr Degree AND 2 yr Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (2 yr Degree, Advanced Degree, College), cd_marital_status in (M, S, W)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=(cd_marital_status@2 = M AND cd_education_status@3 = Advanced Degree OR cd_marital_status@2 = S AND cd_education_status@3 = College OR cd_marital_status@2 = W AND cd_education_status@3 = 2 yr Degree) AND DynamicFilter [ empty ], pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= S AND S <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= College AND College <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= 2 yr Degree AND 2 yr Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (2 yr Degree, Advanced Degree, College), cd_marital_status in (M, S, W)] └────────────────────────────────────────────────── ┌───── Stage 10 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cd_demo_sk@0, cd_marital_status@1, cd_education_status@2], 12), input_partitions=3 @@ -11381,7 +11051,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── "); Ok(()) @@ -11437,7 +11107,7 @@ mod tests { #[tokio::test] async fn test_tpcds_87() -> Result<()> { let display = test_tpcds_query("q87").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ ProjectionExec: expr=[count(Int64(1))@0 as count(*)] │ AggregateExec: mode=Final, gby=[], aggr=[count(Int64(1))] @@ -11462,7 +11132,7 @@ mod tests { │ AggregateExec: mode=Partial, gby=[c_last_name@0 as c_last_name, c_first_name@1 as c_first_name, d_date@2 as d_date], aggr=[] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ws_bill_customer_sk@0)], projection=[c_last_name@2, c_first_name@1, d_date@4] │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[ws_bill_customer_sk@3, d_date@1] │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -11472,30 +11142,29 @@ mod tests { │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_month_seq@2 >= 1200 AND d_month_seq@2 <= 1211, projection=[d_date_sk@0, d_date@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([c_last_name@0, c_first_name@1, d_date@2], 6), input_partitions=3 │ AggregateExec: mode=Partial, gby=[c_last_name@0 as c_last_name, c_first_name@1 as c_first_name, d_date@2 as d_date], aggr=[] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, cs_bill_customer_sk@0)], projection=[c_last_name@2, c_first_name@1, d_date@4] │ CoalescePartitionsExec - │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_bill_customer_sk@3, d_date@1] │ CoalescePartitionsExec │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -11505,30 +11174,29 @@ mod tests { │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 4 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_month_seq@2 >= 1200 AND d_month_seq@2 <= 1211, projection=[d_date_sk@0, d_date@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 9 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([c_last_name@0, c_first_name@1, d_date@2], 6), input_partitions=3 │ AggregateExec: mode=Partial, gby=[c_last_name@0 as c_last_name, c_first_name@1 as c_first_name, d_date@2 as d_date], aggr=[] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_customer_sk@0, ss_customer_sk@0)], projection=[c_last_name@2, c_first_name@1, d_date@4] │ CoalescePartitionsExec - │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 + │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_customer_sk@3, d_date@1] │ CoalescePartitionsExec │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -11538,23 +11206,22 @@ mod tests { │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 7 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] - │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 + ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_first_name, c_last_name], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_month_seq@2 >= 1200 AND d_month_seq@2 <= 1211, projection=[d_date_sk@0, d_date@1] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] └────────────────────────────────────────────────── "); Ok(()) @@ -11562,7 +11229,7 @@ mod tests { #[tokio::test] async fn test_tpcds_88() -> Result<()> { let display = test_tpcds_query("q88").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ ProjectionExec: expr=[h8_30_to_9@1 as h8_30_to_9, h9_to_9_30@2 as h9_to_9_30, h9_30_to_10@3 as h9_30_to_10, h10_to_10_30@4 as h10_to_10_30, h10_30_to_11@5 as h10_30_to_11, h11_to_11_30@6 as h11_to_11_30, h11_30_to_12@7 as h11_30_to_12, h12_to_12_30@0 as h12_to_12_30] │ CrossJoinExec @@ -11654,12 +11321,11 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: t_hour@1 = 12 AND t_minute@2 < 30, projection=[t_time_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 12 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 12 AND 12 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (12)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 12 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 12 AND 12 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (12)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 12 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 12 AND 12 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (12)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 12 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 12 AND 12 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (12)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 12 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 12 AND 12 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (12)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 12 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 12 AND 12 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (12)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 12 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 12 AND 12 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (12)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 12 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 12 AND 12 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (12)] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -11701,12 +11367,11 @@ mod tests { ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: t_hour@1 = 11 AND t_minute@2 >= 30, projection=[t_time_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 11 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 11 AND 11 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (11)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 11 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 11 AND 11 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (11)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 11 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 11 AND 11 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (11)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 11 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 11 AND 11 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (11)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 11 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 11 AND 11 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (11)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 11 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 11 AND 11 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (11)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 11 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 11 AND 11 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (11)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 11 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 11 AND 11 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (11)] └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -11748,12 +11413,11 @@ mod tests { ┌───── Stage 10 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: t_hour@1 = 11 AND t_minute@2 < 30, projection=[t_time_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 11 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 11 AND 11 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (11)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 11 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 11 AND 11 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (11)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 11 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 11 AND 11 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (11)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 11 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 11 AND 11 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (11)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 11 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 11 AND 11 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (11)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 11 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 11 AND 11 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (11)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 11 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 11 AND 11 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (11)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 11 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 11 AND 11 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (11)] └────────────────────────────────────────────────── ┌───── Stage 11 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -11795,12 +11459,11 @@ mod tests { ┌───── Stage 14 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: t_hour@1 = 10 AND t_minute@2 >= 30, projection=[t_time_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 10 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 10 AND 10 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (10)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 10 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 10 AND 10 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (10)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 10 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 10 AND 10 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (10)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 10 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 10 AND 10 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (10)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 10 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 10 AND 10 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (10)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 10 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 10 AND 10 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (10)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 10 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 10 AND 10 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (10)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 10 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 10 AND 10 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (10)] └────────────────────────────────────────────────── ┌───── Stage 15 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -11842,12 +11505,11 @@ mod tests { ┌───── Stage 18 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: t_hour@1 = 10 AND t_minute@2 < 30, projection=[t_time_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 10 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 10 AND 10 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (10)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 10 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 10 AND 10 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (10)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 10 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 10 AND 10 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (10)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 10 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 10 AND 10 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (10)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 10 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 10 AND 10 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (10)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 10 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 10 AND 10 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (10)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 10 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 10 AND 10 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (10)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 10 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 10 AND 10 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (10)] └────────────────────────────────────────────────── ┌───── Stage 19 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -11889,12 +11551,11 @@ mod tests { ┌───── Stage 22 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: t_hour@1 = 9 AND t_minute@2 >= 30, projection=[t_time_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 9 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 9 AND 9 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (9)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 9 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 9 AND 9 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (9)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 9 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 9 AND 9 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (9)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 9 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 9 AND 9 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (9)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 9 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 9 AND 9 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (9)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 9 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 9 AND 9 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (9)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 9 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 9 AND 9 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (9)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 9 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 9 AND 9 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (9)] └────────────────────────────────────────────────── ┌───── Stage 23 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -11936,12 +11597,11 @@ mod tests { ┌───── Stage 26 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: t_hour@1 = 8 AND t_minute@2 >= 30, projection=[t_time_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 8 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 8 AND 8 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (8)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 8 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 8 AND 8 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (8)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 8 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 8 AND 8 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (8)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 8 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 8 AND 8 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (8)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 8 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 8 AND 8 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (8)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 8 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 8 AND 8 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (8)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 8 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 8 AND 8 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (8)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 8 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 8 AND 8 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (8)] └────────────────────────────────────────────────── ┌───── Stage 27 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -11983,12 +11643,11 @@ mod tests { ┌───── Stage 30 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: t_hour@1 = 9 AND t_minute@2 < 30, projection=[t_time_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 9 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 9 AND 9 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (9)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 9 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 9 AND 9 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (9)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 9 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 9 AND 9 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (9)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 9 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 9 AND 9 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (9)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 9 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 9 AND 9 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (9)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 9 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 9 AND 9 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (9)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 9 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 9 AND 9 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (9)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 9 AND t_minute@4 < 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 9 AND 9 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_min@4 < 30, required_guarantees=[t_hour in (9)] └────────────────────────────────────────────────── ┌───── Stage 31 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -12011,7 +11670,7 @@ mod tests { │ SortPreservingMergeExec: [sum_sales@6 - avg_monthly_sales@7 ASC NULLS LAST, s_store_name@3 ASC NULLS LAST, i_category@0 ASC NULLS LAST, i_class@1 ASC NULLS LAST, i_brand@2 ASC NULLS LAST, s_company_name@4 ASC NULLS LAST, d_moy@5 ASC NULLS LAST], fetch=100 │ SortExec: TopK(fetch=100), expr=[sum_sales@6 - avg_monthly_sales@7 ASC NULLS LAST, s_store_name@3 ASC NULLS LAST, i_category@0 ASC NULLS LAST, i_class@1 ASC NULLS LAST, i_brand@2 ASC NULLS LAST, s_company_name@4 ASC NULLS LAST, d_moy@5 ASC NULLS LAST], preserve_partitioning=[true] │ ProjectionExec: expr=[i_category@0 as i_category, i_class@1 as i_class, i_brand@2 as i_brand, s_store_name@3 as s_store_name, s_company_name@4 as s_company_name, d_moy@5 as d_moy, sum(store_sales.ss_sales_price)@6 as sum_sales, avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING@7 as avg_monthly_sales] - │ FilterExec: CASE WHEN avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING@7 != Some(0),21,6 THEN abs(sum(store_sales.ss_sales_price)@6 - avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING@7) / avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING@7 END > Some(1000000000),32,10 + │ FilterExec: CASE WHEN avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING@7 != 0.000000 THEN abs(sum(store_sales.ss_sales_price)@6 - avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING@7) / avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING@7 END > 0.1000000000 │ WindowAggExec: wdw=[avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING: Ok(Field { name: "avg(sum(store_sales.ss_sales_price)) PARTITION BY [item.i_category, item.i_brand, store.s_store_name, store.s_company_name] ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING", data_type: Decimal128(21, 6), nullable: true }), frame: WindowFrame { units: Rows, start_bound: Preceding(UInt64(NULL)), end_bound: Following(UInt64(NULL)), is_causal: false }] │ SortExec: expr=[i_category@0 ASC NULLS LAST, i_brand@2 ASC NULLS LAST, s_store_name@3 ASC NULLS LAST, s_company_name@4 ASC NULLS LAST], preserve_partitioning=[true] │ [Stage 5] => NetworkShuffleExec: output_partitions=3, input_tasks=2 @@ -12050,22 +11709,20 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 1999, projection=[d_date_sk@0, d_moy@2] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1, required_guarantees=[d_year in (1999)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1, required_guarantees=[d_year in (1999)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1, required_guarantees=[d_year in (1999)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1, required_guarantees=[d_year in (1999)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1, required_guarantees=[d_year in (1999)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1, required_guarantees=[d_year in (1999)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1, required_guarantees=[d_year in (1999)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1999, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1999 AND 1999 <= d_year_max@1, required_guarantees=[d_year in (1999)] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: (i_category@3 = Books OR i_category@3 = Electronics OR i_category@3 = Sports) AND (i_class@2 = computers OR i_class@2 = stereo OR i_class@2 = football) OR (i_category@3 = Men OR i_category@3 = Jewelry OR i_category@3 = Women) AND (i_class@2 = shirts OR i_class@2 = birdal OR i_class@2 = dresses) - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category], file_type=parquet, predicate=(i_category@12 = Books OR i_category@12 = Electronics OR i_category@12 = Sports) AND (i_class@10 = computers OR i_class@10 = stereo OR i_class@10 = football) OR (i_category@12 = Men OR i_category@12 = Jewelry OR i_category@12 = Women) AND (i_class@10 = shirts OR i_class@10 = birdal OR i_class@10 = dresses), pruning_predicate=(i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= computers AND computers <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= stereo AND stereo <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= football AND football <= i_class_max@5) OR (i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Jewelry AND Jewelry <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= shirts AND shirts <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= birdal AND birdal <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= dresses AND dresses <= i_class_max@5), required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category], file_type=parquet, predicate=(i_category@12 = Books OR i_category@12 = Electronics OR i_category@12 = Sports) AND (i_class@10 = computers OR i_class@10 = stereo OR i_class@10 = football) OR (i_category@12 = Men OR i_category@12 = Jewelry OR i_category@12 = Women) AND (i_class@10 = shirts OR i_class@10 = birdal OR i_class@10 = dresses), pruning_predicate=(i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= computers AND computers <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= stereo AND stereo <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= football AND football <= i_class_max@5) OR (i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Jewelry AND Jewelry <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= shirts AND shirts <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= birdal AND birdal <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= dresses AND dresses <= i_class_max@5), required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category], file_type=parquet, predicate=(i_category@12 = Books OR i_category@12 = Electronics OR i_category@12 = Sports) AND (i_class@10 = computers OR i_class@10 = stereo OR i_class@10 = football) OR (i_category@12 = Men OR i_category@12 = Jewelry OR i_category@12 = Women) AND (i_class@10 = shirts OR i_class@10 = birdal OR i_class@10 = dresses), pruning_predicate=(i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= computers AND computers <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= stereo AND stereo <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= football AND football <= i_class_max@5) OR (i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Jewelry AND Jewelry <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= shirts AND shirts <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= birdal AND birdal <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= dresses AND dresses <= i_class_max@5), required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category], file_type=parquet, predicate=(i_category@12 = Books OR i_category@12 = Electronics OR i_category@12 = Sports) AND (i_class@10 = computers OR i_class@10 = stereo OR i_class@10 = football) OR (i_category@12 = Men OR i_category@12 = Jewelry OR i_category@12 = Women) AND (i_class@10 = shirts OR i_class@10 = birdal OR i_class@10 = dresses), pruning_predicate=(i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= computers AND computers <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= stereo AND stereo <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= football AND football <= i_class_max@5) OR (i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Jewelry AND Jewelry <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= shirts AND shirts <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= birdal AND birdal <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= dresses AND dresses <= i_class_max@5), required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category], file_type=parquet, predicate=(i_category@12 = Books OR i_category@12 = Electronics OR i_category@12 = Sports) AND (i_class@10 = computers OR i_class@10 = stereo OR i_class@10 = football) OR (i_category@12 = Men OR i_category@12 = Jewelry OR i_category@12 = Women) AND (i_class@10 = shirts OR i_class@10 = birdal OR i_class@10 = dresses), pruning_predicate=(i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= computers AND computers <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= stereo AND stereo <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= football AND football <= i_class_max@5) OR (i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Jewelry AND Jewelry <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= shirts AND shirts <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= birdal AND birdal <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= dresses AND dresses <= i_class_max@5), required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category], file_type=parquet, predicate=(i_category@12 = Books OR i_category@12 = Electronics OR i_category@12 = Sports) AND (i_class@10 = computers OR i_class@10 = stereo OR i_class@10 = football) OR (i_category@12 = Men OR i_category@12 = Jewelry OR i_category@12 = Women) AND (i_class@10 = shirts OR i_class@10 = birdal OR i_class@10 = dresses), pruning_predicate=(i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= computers AND computers <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= stereo AND stereo <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= football AND football <= i_class_max@5) OR (i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Jewelry AND Jewelry <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= shirts AND shirts <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= birdal AND birdal <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= dresses AND dresses <= i_class_max@5), required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category], file_type=parquet, predicate=(i_category@12 = Books OR i_category@12 = Electronics OR i_category@12 = Sports) AND (i_class@10 = computers OR i_class@10 = stereo OR i_class@10 = football) OR (i_category@12 = Men OR i_category@12 = Jewelry OR i_category@12 = Women) AND (i_class@10 = shirts OR i_class@10 = birdal OR i_class@10 = dresses), pruning_predicate=(i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= computers AND computers <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= stereo AND stereo <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= football AND football <= i_class_max@5) OR (i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Jewelry AND Jewelry <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= shirts AND shirts <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= birdal AND birdal <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= dresses AND dresses <= i_class_max@5), required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand, i_class, i_category], file_type=parquet, predicate=(i_category@12 = Books OR i_category@12 = Electronics OR i_category@12 = Sports) AND (i_class@10 = computers OR i_class@10 = stereo OR i_class@10 = football) OR (i_category@12 = Men OR i_category@12 = Jewelry OR i_category@12 = Women) AND (i_class@10 = shirts OR i_class@10 = birdal OR i_class@10 = dresses), pruning_predicate=(i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Electronics AND Electronics <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= computers AND computers <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= stereo AND stereo <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= football AND football <= i_class_max@5) OR (i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Men AND Men <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Jewelry AND Jewelry <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Women AND Women <= i_category_max@1) AND (i_class_null_count@6 != row_count@3 AND i_class_min@4 <= shirts AND shirts <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= birdal AND birdal <= i_class_max@5 OR i_class_null_count@6 != row_count@3 AND i_class_min@4 <= dresses AND dresses <= i_class_max@5), required_guarantees=[] └────────────────────────────────────────────────── "#); Ok(()) @@ -12073,10 +11730,10 @@ mod tests { #[tokio::test] async fn test_tpcds_90() -> Result<()> { let display = test_tpcds_query("q90").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortExec: TopK(fetch=100), expr=[am_pm_ratio@0 ASC NULLS LAST], preserve_partitioning=[false] - │ ProjectionExec: expr=[CASE WHEN pmc@1 = 0 THEN None,23,8 ELSE CAST(amc@0 AS Decimal128(15, 4)) / CAST(pmc@1 AS Decimal128(15, 4)) END as am_pm_ratio] + │ ProjectionExec: expr=[CASE WHEN pmc@1 = 0 THEN NULL ELSE CAST(amc@0 AS Decimal128(15, 4)) / CAST(pmc@1 AS Decimal128(15, 4)) END as am_pm_ratio] │ CrossJoinExec │ CoalescePartitionsExec │ BroadcastExec: input_partitions=1, consumer_tasks=1, output_partitions=1 @@ -12119,12 +11776,11 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: t_hour@1 >= 8 AND t_hour@1 <= 9, projection=[t_time_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour], file_type=parquet, predicate=t_hour@3 >= 8 AND t_hour@3 <= 9, pruning_predicate=t_hour_null_count@1 != row_count@2 AND t_hour_max@0 >= 8 AND t_hour_null_count@1 != row_count@2 AND t_hour_min@3 <= 9, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour], file_type=parquet, predicate=t_hour@3 >= 8 AND t_hour@3 <= 9, pruning_predicate=t_hour_null_count@1 != row_count@2 AND t_hour_max@0 >= 8 AND t_hour_null_count@1 != row_count@2 AND t_hour_min@3 <= 9, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour], file_type=parquet, predicate=t_hour@3 >= 8 AND t_hour@3 <= 9, pruning_predicate=t_hour_null_count@1 != row_count@2 AND t_hour_max@0 >= 8 AND t_hour_null_count@1 != row_count@2 AND t_hour_min@3 <= 9, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour], file_type=parquet, predicate=t_hour@3 >= 8 AND t_hour@3 <= 9, pruning_predicate=t_hour_null_count@1 != row_count@2 AND t_hour_max@0 >= 8 AND t_hour_null_count@1 != row_count@2 AND t_hour_min@3 <= 9, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour], file_type=parquet, predicate=t_hour@3 >= 8 AND t_hour@3 <= 9, pruning_predicate=t_hour_null_count@1 != row_count@2 AND t_hour_max@0 >= 8 AND t_hour_null_count@1 != row_count@2 AND t_hour_min@3 <= 9, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour], file_type=parquet, predicate=t_hour@3 >= 8 AND t_hour@3 <= 9, pruning_predicate=t_hour_null_count@1 != row_count@2 AND t_hour_max@0 >= 8 AND t_hour_null_count@1 != row_count@2 AND t_hour_min@3 <= 9, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour], file_type=parquet, predicate=t_hour@3 >= 8 AND t_hour@3 <= 9, pruning_predicate=t_hour_null_count@1 != row_count@2 AND t_hour_max@0 >= 8 AND t_hour_null_count@1 != row_count@2 AND t_hour_min@3 <= 9, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour], file_type=parquet, predicate=t_hour@3 >= 8 AND t_hour@3 <= 9, pruning_predicate=t_hour_null_count@1 != row_count@2 AND t_hour_max@0 >= 8 AND t_hour_null_count@1 != row_count@2 AND t_hour_min@3 <= 9, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -12166,12 +11822,11 @@ mod tests { ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: t_hour@1 >= 19 AND t_hour@1 <= 20, projection=[t_time_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour], file_type=parquet, predicate=t_hour@3 >= 19 AND t_hour@3 <= 20, pruning_predicate=t_hour_null_count@1 != row_count@2 AND t_hour_max@0 >= 19 AND t_hour_null_count@1 != row_count@2 AND t_hour_min@3 <= 20, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour], file_type=parquet, predicate=t_hour@3 >= 19 AND t_hour@3 <= 20, pruning_predicate=t_hour_null_count@1 != row_count@2 AND t_hour_max@0 >= 19 AND t_hour_null_count@1 != row_count@2 AND t_hour_min@3 <= 20, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour], file_type=parquet, predicate=t_hour@3 >= 19 AND t_hour@3 <= 20, pruning_predicate=t_hour_null_count@1 != row_count@2 AND t_hour_max@0 >= 19 AND t_hour_null_count@1 != row_count@2 AND t_hour_min@3 <= 20, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour], file_type=parquet, predicate=t_hour@3 >= 19 AND t_hour@3 <= 20, pruning_predicate=t_hour_null_count@1 != row_count@2 AND t_hour_max@0 >= 19 AND t_hour_null_count@1 != row_count@2 AND t_hour_min@3 <= 20, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour], file_type=parquet, predicate=t_hour@3 >= 19 AND t_hour@3 <= 20, pruning_predicate=t_hour_null_count@1 != row_count@2 AND t_hour_max@0 >= 19 AND t_hour_null_count@1 != row_count@2 AND t_hour_min@3 <= 20, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour], file_type=parquet, predicate=t_hour@3 >= 19 AND t_hour@3 <= 20, pruning_predicate=t_hour_null_count@1 != row_count@2 AND t_hour_max@0 >= 19 AND t_hour_null_count@1 != row_count@2 AND t_hour_min@3 <= 20, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour], file_type=parquet, predicate=t_hour@3 >= 19 AND t_hour@3 <= 20, pruning_predicate=t_hour_null_count@1 != row_count@2 AND t_hour_max@0 >= 19 AND t_hour_null_count@1 != row_count@2 AND t_hour_min@3 <= 20, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour], file_type=parquet, predicate=t_hour@3 >= 19 AND t_hour@3 <= 20, pruning_predicate=t_hour_null_count@1 != row_count@2 AND t_hour_max@0 >= 19 AND t_hour_null_count@1 != row_count@2 AND t_hour_min@3 <= 20, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -12189,7 +11844,7 @@ mod tests { #[tokio::test] async fn test_tpcds_91() -> Result<()> { let display = test_tpcds_query("q91").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [returns_loss@3 DESC] │ [Stage 8] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -12214,7 +11869,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=(cd_marital_status@2 = M AND cd_education_status@3 = Unknown OR cd_marital_status@2 = W AND cd_education_status@3 = Advanced Degree) AND DynamicFilter [ empty ], pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Unknown AND Unknown <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (Advanced Degree, Unknown), cd_marital_status in (M, W)] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=(cd_marital_status@2 = M AND cd_education_status@3 = Unknown OR cd_marital_status@2 = W AND cd_education_status@3 = Advanced Degree) AND DynamicFilter [ empty ], pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Unknown AND Unknown <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (Advanced Degree, Unknown), cd_marital_status in (M, W)] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=(cd_marital_status@2 = M AND cd_education_status@3 = Unknown OR cd_marital_status@2 = W AND cd_education_status@3 = Advanced Degree) AND DynamicFilter [ empty ], pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Unknown AND Unknown <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (Advanced Degree, Unknown), cd_marital_status in (M, W)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=(cd_marital_status@2 = M AND cd_education_status@3 = Unknown OR cd_marital_status@2 = W AND cd_education_status@3 = Advanced Degree) AND DynamicFilter [ empty ], pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Unknown AND Unknown <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (Advanced Degree, Unknown), cd_marital_status in (M, W)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=(cd_marital_status@2 = M AND cd_education_status@3 = Unknown OR cd_marital_status@2 = W AND cd_education_status@3 = Advanced Degree) AND DynamicFilter [ empty ], pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Unknown AND Unknown <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (Advanced Degree, Unknown), cd_marital_status in (M, W)] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -12231,25 +11886,23 @@ mod tests { │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(c_current_addr_sk@6, ca_address_sk@0)], projection=[cc_call_center_id@0, cc_name@1, cc_manager@2, cr_net_loss@3, c_current_cdemo_sk@4, c_current_hdemo_sk@5] │ CoalescePartitionsExec │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ FilterExec: ca_gmt_offset@1 = Some(-700),5,2, projection=[ca_address_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-700),5,2 AND DynamicFilter [ empty ], pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-700),5,2 AND Some(-700),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-700),5,2)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-700),5,2 AND DynamicFilter [ empty ], pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-700),5,2 AND Some(-700),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-700),5,2)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-700),5,2 AND DynamicFilter [ empty ], pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-700),5,2 AND Some(-700),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-700),5,2)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = Some(-700),5,2 AND DynamicFilter [ empty ], pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= Some(-700),5,2 AND Some(-700),5,2 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (Some(-700),5,2)] + │ FilterExec: ca_gmt_offset@1 = -7.00, projection=[ca_address_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -7.00 AND DynamicFilter [ empty ], pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -7.00 AND -7.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-7.00)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -7.00 AND DynamicFilter [ empty ], pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -7.00 AND -7.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-7.00)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -7.00 AND DynamicFilter [ empty ], pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -7.00 AND -7.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-7.00)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -7.00 AND DynamicFilter [ empty ], pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -7.00 AND -7.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-7.00)] └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(cr_returning_customer_sk@3, c_customer_sk@0)], projection=[cc_call_center_id@0, cc_name@1, cc_manager@2, cr_net_loss@4, c_current_cdemo_sk@6, c_current_hdemo_sk@7, c_current_addr_sk@8] │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -12267,13 +11920,12 @@ mod tests { └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: d_year@1 = 1998 AND d_moy@2 = 11, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_year@6 = 1998 AND d_moy@8 = 11, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 1998 AND 1998 <= d_year_max@1 AND d_moy_null_count@6 != row_count@3 AND d_moy_min@4 <= 11 AND 11 <= d_moy_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] + │ FilterExec: d_moy@2 = 11 AND d_year@1 = 1998, projection=[d_date_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1998, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1998 AND 1998 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1998, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1998 AND 1998 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1998, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1998 AND 1998 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year, d_moy], file_type=parquet, predicate=d_moy@8 = 11 AND d_year@6 = 1998, pruning_predicate=d_moy_null_count@2 != row_count@3 AND d_moy_min@0 <= 11 AND 11 <= d_moy_max@1 AND d_year_null_count@6 != row_count@3 AND d_year_min@4 <= 1998 AND 1998 <= d_year_max@5, required_guarantees=[d_moy in (11), d_year in (1998)] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -12289,79 +11941,72 @@ mod tests { #[tokio::test] async fn test_tpcds_92() -> Result<()> { let display = test_tpcds_query("q92").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ ProjectionExec: expr=[sum(web_sales.ws_ext_discount_amt)@0 as Excess Discount Amount] │ GlobalLimitExec: skip=0, fetch=100 │ AggregateExec: mode=Final, gby=[], aggr=[sum(web_sales.ws_ext_discount_amt)] │ CoalescePartitionsExec - │ [Stage 6] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 + │ AggregateExec: mode=Partial, gby=[], aggr=[sum(web_sales.ws_ext_discount_amt)] + │ HashJoinExec: mode=CollectLeft, join_type=LeftSemi, on=[(i_item_sk@1, ws_item_sk@1)], filter=CAST(ws_ext_discount_amt@0 AS Decimal128(30, 15)) > Float64(1.3) * avg(web_sales.ws_ext_discount_amt)@1, projection=[ws_ext_discount_amt@0] + │ CoalescePartitionsExec + │ [Stage 3] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 + │ ProjectionExec: expr=[CAST(1.3 * CAST(avg(web_sales.ws_ext_discount_amt)@1 AS Float64) AS Decimal128(30, 15)) as Float64(1.3) * avg(web_sales.ws_ext_discount_amt), ws_item_sk@0 as ws_item_sk] + │ AggregateExec: mode=FinalPartitioned, gby=[ws_item_sk@0 as ws_item_sk], aggr=[avg(web_sales.ws_ext_discount_amt)] + │ [Stage 5] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 6 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] - │ AggregateExec: mode=Partial, gby=[], aggr=[sum(web_sales.ws_ext_discount_amt)] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@1, ws_item_sk@1)], filter=CAST(ws_ext_discount_amt@0 AS Decimal128(30, 15)) > Float64(1.3) * avg(web_sales.ws_ext_discount_amt)@1, projection=[ws_ext_discount_amt@0] + ┌───── Stage 3 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[ws_ext_discount_amt@2, i_item_sk@3] + │ CoalescePartitionsExec + │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ws_item_sk@1)], projection=[ws_sold_date_sk@1, ws_ext_discount_amt@3, i_item_sk@0] │ CoalescePartitionsExec - │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ ProjectionExec: expr=[CAST(1.3 * CAST(avg(web_sales.ws_ext_discount_amt)@1 AS Float64) AS Decimal128(30, 15)) as Float64(1.3) * avg(web_sales.ws_ext_discount_amt), ws_item_sk@0 as ws_item_sk] - │ AggregateExec: mode=FinalPartitioned, gby=[ws_item_sk@0 as ws_item_sk], aggr=[avg(web_sales.ws_ext_discount_amt)] - │ [Stage 5] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[ws_ext_discount_amt@2, i_item_sk@3] - │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(i_item_sk@0, ws_item_sk@1)], projection=[ws_sold_date_sk@1, ws_ext_discount_amt@3, i_item_sk@0] - │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ FilterExec: d_date@1 >= 2000-01-27 AND d_date@1 <= 2000-04-26, projection=[d_date_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: d_date@1 >= 2000-01-27 AND d_date@1 <= 2000-04-26, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] - └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: i_manufact_id@1 = 350, projection=[i_item_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=i_manufact_id@13 = 350, pruning_predicate=i_manufact_id_null_count@2 != row_count@3 AND i_manufact_id_min@0 <= 350 AND 350 <= i_manufact_id_max@1, required_guarantees=[i_manufact_id in (350)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=i_manufact_id@13 = 350, pruning_predicate=i_manufact_id_null_count@2 != row_count@3 AND i_manufact_id_min@0 <= 350 AND 350 <= i_manufact_id_max@1, required_guarantees=[i_manufact_id in (350)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=i_manufact_id@13 = 350, pruning_predicate=i_manufact_id_null_count@2 != row_count@3 AND i_manufact_id_min@0 <= 350 AND 350 <= i_manufact_id_max@1, required_guarantees=[i_manufact_id in (350)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=i_manufact_id@13 = 350, pruning_predicate=i_manufact_id_null_count@2 != row_count@3 AND i_manufact_id_min@0 <= 350 AND 350 <= i_manufact_id_max@1, required_guarantees=[i_manufact_id in (350)] - └────────────────────────────────────────────────── - ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([ws_item_sk@0], 12), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[ws_item_sk@0 as ws_item_sk], aggr=[avg(web_sales.ws_ext_discount_amt)] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[ws_item_sk@2, ws_ext_discount_amt@3] - │ CoalescePartitionsExec - │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ FilterExec: i_manufact_id@1 = 350, projection=[i_item_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=i_manufact_id@13 = 350, pruning_predicate=i_manufact_id_null_count@2 != row_count@3 AND i_manufact_id_min@0 <= 350 AND 350 <= i_manufact_id_max@1, required_guarantees=[i_manufact_id in (350)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=i_manufact_id@13 = 350, pruning_predicate=i_manufact_id_null_count@2 != row_count@3 AND i_manufact_id_min@0 <= 350 AND 350 <= i_manufact_id_max@1, required_guarantees=[i_manufact_id in (350)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=i_manufact_id@13 = 350, pruning_predicate=i_manufact_id_null_count@2 != row_count@3 AND i_manufact_id_min@0 <= 350 AND 350 <= i_manufact_id_max@1, required_guarantees=[i_manufact_id in (350)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=i_manufact_id@13 = 350, pruning_predicate=i_manufact_id_null_count@2 != row_count@3 AND i_manufact_id_min@0 <= 350 AND 350 <= i_manufact_id_max@1, required_guarantees=[i_manufact_id in (350)] + └────────────────────────────────────────────────── + ┌───── Stage 5 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] + │ RepartitionExec: partitioning=Hash([ws_item_sk@0], 3), input_partitions=3 + │ AggregateExec: mode=Partial, gby=[ws_item_sk@0 as ws_item_sk], aggr=[avg(web_sales.ws_ext_discount_amt)] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[ws_item_sk@2, ws_ext_discount_amt@3] + │ CoalescePartitionsExec + │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + └────────────────────────────────────────────────── + ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ FilterExec: d_date@1 >= 2000-01-27 AND d_date@1 <= 2000-04-26, projection=[d_date_sk@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] └────────────────────────────────────────────────── - ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: d_date@1 >= 2000-01-27 AND d_date@1 <= 2000-04-26, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 2000-01-27 AND d_date@2 <= 2000-04-26, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 2000-01-27 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 2000-04-26, required_guarantees=[] - └────────────────────────────────────────────────── "); Ok(()) } @@ -12422,7 +12067,7 @@ mod tests { #[tokio::test] async fn test_tpcds_94() -> Result<()> { let display = test_tpcds_query("q94").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ ProjectionExec: expr=[count(alias1)@0 as order count, sum(alias2)@1 as total shipping cost, sum(alias3)@2 as total net profit] │ GlobalLimitExec: skip=0, fetch=100 @@ -12439,9 +12084,8 @@ mod tests { │ [Stage 4] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(web_site_sk@0, ws_web_site_sk@0)], projection=[ws_warehouse_sk@2, ws_order_number@3, ws_ext_ship_cost@4, ws_net_profit@5] @@ -12472,22 +12116,20 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: ca_state@1 = IL, projection=[ca_address_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = IL, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= IL AND IL <= ca_state_max@1, required_guarantees=[ca_state in (IL)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = IL, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= IL AND IL <= ca_state_max@1, required_guarantees=[ca_state in (IL)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = IL, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= IL AND IL <= ca_state_max@1, required_guarantees=[ca_state in (IL)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = IL, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= IL AND IL <= ca_state_max@1, required_guarantees=[ca_state in (IL)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = IL, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= IL AND IL <= ca_state_max@1, required_guarantees=[ca_state in (IL)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = IL, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= IL AND IL <= ca_state_max@1, required_guarantees=[ca_state in (IL)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = IL, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= IL AND IL <= ca_state_max@1, required_guarantees=[ca_state in (IL)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = IL, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= IL AND IL <= ca_state_max@1, required_guarantees=[ca_state in (IL)] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_date@1 >= 1999-02-01 AND d_date@1 <= 1999-04-02, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-01 AND d_date@2 <= 1999-04-02, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-04-02, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-01 AND d_date@2 <= 1999-04-02, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-04-02, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-01 AND d_date@2 <= 1999-04-02, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-04-02, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-01 AND d_date@2 <= 1999-04-02, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-04-02, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-01 AND d_date@2 <= 1999-04-02, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-04-02, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-01 AND d_date@2 <= 1999-04-02, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-04-02, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-01 AND d_date@2 <= 1999-04-02, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-04-02, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-01 AND d_date@2 <= 1999-04-02, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-04-02, required_guarantees=[] └────────────────────────────────────────────────── "); Ok(()) @@ -12495,7 +12137,7 @@ mod tests { #[tokio::test] async fn test_tpcds_95() -> Result<()> { let display = test_tpcds_query("q95").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ ProjectionExec: expr=[count(alias1)@0 as order count, sum(alias2)@1 as total shipping cost, sum(alias3)@2 as total net profit] │ GlobalLimitExec: skip=0, fetch=100 @@ -12505,38 +12147,56 @@ mod tests { │ AggregateExec: mode=FinalPartitioned, gby=[alias1@0 as alias1], aggr=[sum(ws1.ws_ext_ship_cost) as alias2, sum(ws1.ws_net_profit) as alias3] │ RepartitionExec: partitioning=Hash([alias1@0], 3), input_partitions=3 │ AggregateExec: mode=Partial, gby=[ws_order_number@0 as alias1], aggr=[sum(ws1.ws_ext_ship_cost) as alias2, sum(ws1.ws_net_profit) as alias3] - │ HashJoinExec: mode=CollectLeft, join_type=LeftSemi, on=[(ws_order_number@0, wr_order_number@0)] + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(wr_order_number@0, ws_order_number@0)] │ CoalescePartitionsExec - │ HashJoinExec: mode=CollectLeft, join_type=LeftSemi, on=[(ws_order_number@0, ws_order_number@0)] - │ CoalescePartitionsExec - │ [Stage 4] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 - │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(ws_order_number@1, ws_order_number@1)], filter=ws_warehouse_sk@1 != ws_warehouse_sk@0, projection=[ws_order_number@1] - │ [Stage 5] => NetworkShuffleExec: output_partitions=3, input_tasks=4 - │ [Stage 6] => NetworkShuffleExec: output_partitions=3, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(wr_order_number@0, ws_order_number@0)], projection=[wr_order_number@0] + │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 + │ HashJoinExec: mode=CollectLeft, join_type=LeftSemi, on=[(wr_order_number@0, ws_order_number@0)] + │ CoalescePartitionsExec + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_order_number], file_type=parquet + │ HashJoinExec: mode=Partitioned, join_type=LeftSemi, on=[(ws_order_number@1, ws_order_number@1)], filter=ws_warehouse_sk@1 != ws_warehouse_sk@0, projection=[ws_order_number@1] + │ [Stage 1] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 2] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=LeftSemi, on=[(ws_order_number@0, ws_order_number@0)] │ CoalescePartitionsExec - │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=2, input_tasks=4 - │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(ws_order_number@1, ws_order_number@1)], filter=ws_warehouse_sk@1 != ws_warehouse_sk@0, projection=[ws_order_number@1] + │ [Stage 6] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 + │ HashJoinExec: mode=Partitioned, join_type=LeftSemi, on=[(ws_order_number@1, ws_order_number@1)], filter=ws_warehouse_sk@1 != ws_warehouse_sk@0, projection=[ws_order_number@1] + │ [Stage 7] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ [Stage 8] => NetworkShuffleExec: output_partitions=3, input_tasks=4 - │ [Stage 9] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 4 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + ┌───── Stage 1 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] + │ RepartitionExec: partitioning=Hash([ws_order_number@1], 3), input_partitions=3 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] + └────────────────────────────────────────────────── + ┌───── Stage 2 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] + │ RepartitionExec: partitioning=Hash([ws_order_number@1], 3), input_partitions=3 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + └────────────────────────────────────────────────── + ┌───── Stage 6 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(web_site_sk@0, ws_web_site_sk@0)], projection=[ws_order_number@2, ws_ext_ship_cost@3, ws_net_profit@4] │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ca_address_sk@0, ws_ship_addr_sk@0)], projection=[ws_web_site_sk@2, ws_order_number@3, ws_ext_ship_cost@4, ws_net_profit@5] │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_ship_date_sk@0)], projection=[ws_ship_addr_sk@2, ws_web_site_sk@3, ws_order_number@4, ws_ext_ship_cost@5, ws_net_profit@6] │ CoalescePartitionsExec - │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_ship_date_sk, ws_ship_addr_sk, ws_web_site_sk, ws_order_number, ws_ext_ship_cost, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_ship_date_sk, ws_ship_addr_sk, ws_web_site_sk, ws_order_number, ws_ext_ship_cost, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_ship_date_sk, ws_ship_addr_sk, ws_web_site_sk, ws_order_number, ws_ext_ship_cost, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_ship_date_sk, ws_ship_addr_sk, ws_web_site_sk, ws_order_number, ws_ext_ship_cost, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_ship_date_sk, ws_ship_addr_sk, ws_web_site_sk, ws_order_number, ws_ext_ship_cost, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_ship_date_sk, ws_ship_addr_sk, ws_web_site_sk, ws_order_number, ws_ext_ship_cost, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_ship_date_sk, ws_ship_addr_sk, ws_web_site_sk, ws_order_number, ws_ext_ship_cost, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_ship_date_sk, ws_ship_addr_sk, ws_web_site_sk, ws_order_number, ws_ext_ship_cost, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: web_company_name@1 = pri, projection=[web_site_sk@0] │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 @@ -12546,65 +12206,39 @@ mod tests { │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_site/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_site/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_site/part-3.parquet:..]]}, projection=[web_site_sk, web_company_name], file_type=parquet, predicate=web_company_name@14 = pri, pruning_predicate=web_company_name_null_count@2 != row_count@3 AND web_company_name_min@0 <= pri AND pri <= web_company_name_max@1, required_guarantees=[web_company_name in (pri)] │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_site/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_site/part-3.parquet:..]]}, projection=[web_site_sk, web_company_name], file_type=parquet, predicate=web_company_name@14 = pri, pruning_predicate=web_company_name_null_count@2 != row_count@3 AND web_company_name_min@0 <= pri AND pri <= web_company_name_max@1, required_guarantees=[web_company_name in (pri)] └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: ca_state@1 = IL, projection=[ca_address_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = IL, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= IL AND IL <= ca_state_max@1, required_guarantees=[ca_state in (IL)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = IL, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= IL AND IL <= ca_state_max@1, required_guarantees=[ca_state in (IL)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = IL, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= IL AND IL <= ca_state_max@1, required_guarantees=[ca_state in (IL)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = IL, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= IL AND IL <= ca_state_max@1, required_guarantees=[ca_state in (IL)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = IL, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= IL AND IL <= ca_state_max@1, required_guarantees=[ca_state in (IL)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = IL, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= IL AND IL <= ca_state_max@1, required_guarantees=[ca_state in (IL)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = IL, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= IL AND IL <= ca_state_max@1, required_guarantees=[ca_state in (IL)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=ca_state@8 = IL, pruning_predicate=ca_state_null_count@2 != row_count@3 AND ca_state_min@0 <= IL AND IL <= ca_state_max@1, required_guarantees=[ca_state in (IL)] └────────────────────────────────────────────────── - ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_date@1 >= 1999-02-01 AND d_date@1 <= 1999-04-02, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-01 AND d_date@2 <= 1999-04-02, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-04-02, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-01 AND d_date@2 <= 1999-04-02, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-04-02, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-01 AND d_date@2 <= 1999-04-02, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-04-02, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-01 AND d_date@2 <= 1999-04-02, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-04-02, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-01 AND d_date@2 <= 1999-04-02, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-04-02, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-01 AND d_date@2 <= 1999-04-02, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-04-02, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-01 AND d_date@2 <= 1999-04-02, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-04-02, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-01 AND d_date@2 <= 1999-04-02, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-01 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-04-02, required_guarantees=[] └────────────────────────────────────────────────── - ┌───── Stage 5 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] - │ RepartitionExec: partitioning=Hash([ws_order_number@1], 3), input_partitions=3 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] - └────────────────────────────────────────────────── - ┌───── Stage 6 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] + ┌───── Stage 7 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ RepartitionExec: partitioning=Hash([ws_order_number@1], 3), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] - └────────────────────────────────────────────────── - ┌───── Stage 7 ── Tasks: t0:[p0..p1] t1:[p2..p3] t2:[p4..p5] t3:[p6..p7] - │ BroadcastExec: input_partitions=2, consumer_tasks=1, output_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ RepartitionExec: partitioning=Hash([ws_order_number@1], 3), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] - └────────────────────────────────────────────────── - ┌───── Stage 9 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] - │ RepartitionExec: partitioning=Hash([ws_order_number@1], 3), input_partitions=3 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── "); Ok(()) @@ -12612,7 +12246,7 @@ mod tests { #[tokio::test] async fn test_tpcds_96() -> Result<()> { let display = test_tpcds_query("q96").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ ProjectionExec: expr=[count(Int64(1))@0 as count(*)] │ GlobalLimitExec: skip=0, fetch=100 @@ -12650,12 +12284,11 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: t_hour@1 = 20 AND t_minute@2 >= 30, projection=[t_time_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 20 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 20 AND 20 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (20)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 20 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 20 AND 20 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (20)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 20 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 20 AND 20 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (20)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 20 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 20 AND 20 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (20)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 20 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 20 AND 20 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (20)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 20 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 20 AND 20 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (20)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 20 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 20 AND 20 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (20)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/time_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/time_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/time_dim/part-3.parquet:..]]}, projection=[t_time_sk, t_hour, t_minute], file_type=parquet, predicate=t_hour@3 = 20 AND t_minute@4 >= 30, pruning_predicate=t_hour_null_count@2 != row_count@3 AND t_hour_min@0 <= 20 AND 20 <= t_hour_max@1 AND t_minute_null_count@5 != row_count@3 AND t_minute_max@4 >= 30, required_guarantees=[t_hour in (20)] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -12673,7 +12306,7 @@ mod tests { #[tokio::test] async fn test_tpcds_97() -> Result<()> { let display = test_tpcds_query("q97").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ ProjectionExec: expr=[sum(CASE WHEN ssci.customer_sk IS NOT NULL AND csci.customer_sk IS NULL THEN Int64(1) ELSE Int64(0) END)@0 as store_only, sum(CASE WHEN ssci.customer_sk IS NULL AND csci.customer_sk IS NOT NULL THEN Int64(1) ELSE Int64(0) END)@1 as catalog_only, sum(CASE WHEN ssci.customer_sk IS NOT NULL AND csci.customer_sk IS NOT NULL THEN Int64(1) ELSE Int64(0) END)@2 as store_and_catalog] │ GlobalLimitExec: skip=0, fetch=100 @@ -12695,7 +12328,7 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([cs_bill_customer_sk@0, cs_item_sk@1], 6), input_partitions=3 │ AggregateExec: mode=Partial, gby=[cs_bill_customer_sk@0 as cs_bill_customer_sk, cs_item_sk@1 as cs_item_sk], aggr=[] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_bill_customer_sk@2, cs_item_sk@3] + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_bill_customer_sk@1, cs_item_sk@2] │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: @@ -12707,17 +12340,16 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_month_seq@1 >= 1200 AND d_month_seq@1 <= 1211, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([ss_customer_sk@0, ss_item_sk@1], 6), input_partitions=3 │ AggregateExec: mode=Partial, gby=[ss_customer_sk@1 as ss_customer_sk, ss_item_sk@0 as ss_item_sk], aggr=[] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_item_sk@2, ss_customer_sk@3] + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_item_sk@1, ss_customer_sk@2] │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: @@ -12729,12 +12361,11 @@ mod tests { ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_month_seq@1 >= 1200 AND d_month_seq@1 <= 1211, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] └────────────────────────────────────────────────── "); Ok(()) @@ -12774,22 +12405,20 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_date@1 >= 1999-02-22 AND d_date@1 <= 1999-03-24, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-22 AND d_date@2 <= 1999-03-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-22 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-03-24, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-22 AND d_date@2 <= 1999-03-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-22 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-03-24, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-22 AND d_date@2 <= 1999-03-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-22 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-03-24, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-22 AND d_date@2 <= 1999-03-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-22 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-03-24, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-22 AND d_date@2 <= 1999-03-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-22 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-03-24, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-22 AND d_date@2 <= 1999-03-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-22 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-03-24, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-22 AND d_date@2 <= 1999-03-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-22 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-03-24, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=d_date@2 >= 1999-02-22 AND d_date@2 <= 1999-03-24, pruning_predicate=d_date_null_count@1 != row_count@2 AND d_date_max@0 >= 1999-02-22 AND d_date_null_count@1 != row_count@2 AND d_date_min@3 <= 1999-03-24, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_category@5 = Sports OR i_category@5 = Books OR i_category@5 = Home - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_class, i_category], file_type=parquet, predicate=i_category@12 = Sports OR i_category@12 = Books OR i_category@12 = Home, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Home AND Home <= i_category_max@1, required_guarantees=[i_category in (Books, Home, Sports)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_class, i_category], file_type=parquet, predicate=i_category@12 = Sports OR i_category@12 = Books OR i_category@12 = Home, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Home AND Home <= i_category_max@1, required_guarantees=[i_category in (Books, Home, Sports)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_class, i_category], file_type=parquet, predicate=i_category@12 = Sports OR i_category@12 = Books OR i_category@12 = Home, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Home AND Home <= i_category_max@1, required_guarantees=[i_category in (Books, Home, Sports)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_class, i_category], file_type=parquet, predicate=i_category@12 = Sports OR i_category@12 = Books OR i_category@12 = Home, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Home AND Home <= i_category_max@1, required_guarantees=[i_category in (Books, Home, Sports)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_class, i_category], file_type=parquet, predicate=i_category@12 = Sports OR i_category@12 = Books OR i_category@12 = Home, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Home AND Home <= i_category_max@1, required_guarantees=[i_category in (Books, Home, Sports)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_class, i_category], file_type=parquet, predicate=i_category@12 = Sports OR i_category@12 = Books OR i_category@12 = Home, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Home AND Home <= i_category_max@1, required_guarantees=[i_category in (Books, Home, Sports)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_class, i_category], file_type=parquet, predicate=i_category@12 = Sports OR i_category@12 = Books OR i_category@12 = Home, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Home AND Home <= i_category_max@1, required_guarantees=[i_category in (Books, Home, Sports)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_class, i_category], file_type=parquet, predicate=i_category@12 = Sports OR i_category@12 = Books OR i_category@12 = Home, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Sports AND Sports <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1 OR i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Home AND Home <= i_category_max@1, required_guarantees=[i_category in (Books, Home, Sports)] └────────────────────────────────────────────────── "#); Ok(()) @@ -12797,7 +12426,7 @@ mod tests { #[tokio::test] async fn test_tpcds_99() -> Result<()> { let display = test_tpcds_query("q99").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [w_substr@0 ASC, sm_type@1 ASC, cc_name_lower@2 ASC], fetch=100 │ [Stage 6] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -12833,12 +12462,11 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_month_seq@1 >= 1200 AND d_month_seq@1 <= 1211, projection=[d_date_sk@0] - │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=d_month_seq@3 >= 1200 AND d_month_seq@3 <= 1211, pruning_predicate=d_month_seq_null_count@1 != row_count@2 AND d_month_seq_max@0 >= 1200 AND d_month_seq_null_count@1 != row_count@2 AND d_month_seq_min@3 <= 1211, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -12907,9 +12535,16 @@ mod tests { let df = d_ctx.sql(&query_sql).await?; let plan = df.create_physical_plan().await?; if plan.is::() { - Ok(display_plan_ascii(plan.as_ref(), false)) + Ok(normalize_plan_display(display_plan_ascii( + plan.as_ref(), + false, + ))) } else { Ok("".to_string()) } } + + fn normalize_plan_display(display: String) -> String { + display.replace(", dynamic_rg_pruning=eligible", "") + } } From 8f529548c921b6e24fa66d37439945cf7ae20db0 Mon Sep 17 00:00:00 2001 From: Jayant Shrivastava Date: Thu, 2 Jul 2026 17:25:17 +0000 Subject: [PATCH 09/12] tpch plans test --- tests/tpch_plans_test.rs | 461 +++++++++++++++++++-------------------- 1 file changed, 230 insertions(+), 231 deletions(-) diff --git a/tests/tpch_plans_test.rs b/tests/tpch_plans_test.rs index 231ee3b0..2667c5a1 100644 --- a/tests/tpch_plans_test.rs +++ b/tests/tpch_plans_test.rs @@ -20,7 +20,7 @@ mod tests { #[tokio::test] async fn test_tpch_1() -> Result<(), Box> { let plan = test_tpch_query("q1").await?; - assert_snapshot!(plan, @r" + assert_snapshot!(plan, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [l_returnflag@0 ASC NULLS LAST, l_linestatus@1 ASC NULLS LAST] │ [Stage 2] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -28,19 +28,19 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p2] t1:[p0..p2] │ SortExec: expr=[l_returnflag@0 ASC NULLS LAST, l_linestatus@1 ASC NULLS LAST], preserve_partitioning=[true] │ ProjectionExec: expr=[l_returnflag@0 as l_returnflag, l_linestatus@1 as l_linestatus, sum(lineitem.l_quantity)@2 as sum_qty, sum(lineitem.l_extendedprice)@3 as sum_base_price, sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)@4 as sum_disc_price, sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount * Int64(1) + lineitem.l_tax)@5 as sum_charge, avg(lineitem.l_quantity)@6 as avg_qty, avg(lineitem.l_extendedprice)@7 as avg_price, avg(lineitem.l_discount)@8 as avg_disc, count(Int64(1))@9 as count_order] - │ AggregateExec: mode=FinalPartitioned, gby=[l_returnflag@0 as l_returnflag, l_linestatus@1 as l_linestatus], aggr=[sum(lineitem.l_quantity), sum(lineitem.l_extendedprice), sum(__common_expr_1) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount), sum(__common_expr_1 * Some(1),20,0 + lineitem.l_tax) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount * Int64(1) + lineitem.l_tax), avg(lineitem.l_quantity), avg(lineitem.l_extendedprice), avg(lineitem.l_discount), count(Int64(1))] + │ AggregateExec: mode=FinalPartitioned, gby=[l_returnflag@0 as l_returnflag, l_linestatus@1 as l_linestatus], aggr=[sum(lineitem.l_quantity), sum(lineitem.l_extendedprice), sum(__common_expr_1) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount), sum(__common_expr_1 * 1 + lineitem.l_tax) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount * Int64(1) + lineitem.l_tax), avg(lineitem.l_quantity), avg(lineitem.l_extendedprice), avg(lineitem.l_discount), count(Int64(1))] │ [Stage 1] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([l_returnflag@0, l_linestatus@1], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[l_returnflag@5 as l_returnflag, l_linestatus@6 as l_linestatus], aggr=[sum(lineitem.l_quantity), sum(lineitem.l_extendedprice), sum(__common_expr_1) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount), sum(__common_expr_1 * Some(1),20,0 + lineitem.l_tax) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount * Int64(1) + lineitem.l_tax), avg(lineitem.l_quantity), avg(lineitem.l_extendedprice), avg(lineitem.l_discount), count(Int64(1))] - │ ProjectionExec: expr=[l_extendedprice@0 * (Some(1),20,0 - l_discount@1) as __common_expr_1, l_quantity@2 as l_quantity, l_extendedprice@0 as l_extendedprice, l_discount@1 as l_discount, l_tax@3 as l_tax, l_returnflag@4 as l_returnflag, l_linestatus@5 as l_linestatus] + │ AggregateExec: mode=Partial, gby=[l_returnflag@5 as l_returnflag, l_linestatus@6 as l_linestatus], aggr=[sum(lineitem.l_quantity), sum(lineitem.l_extendedprice), sum(__common_expr_1) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount), sum(__common_expr_1 * 1 + lineitem.l_tax) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount * Int64(1) + lineitem.l_tax), avg(lineitem.l_quantity), avg(lineitem.l_extendedprice), avg(lineitem.l_discount), count(Int64(1))] + │ ProjectionExec: expr=[l_extendedprice@0 * (1 - l_discount@1) as __common_expr_1, l_quantity@2 as l_quantity, l_extendedprice@0 as l_extendedprice, l_discount@1 as l_discount, l_tax@3 as l_tax, l_returnflag@4 as l_returnflag, l_linestatus@5 as l_linestatus] │ FilterExec: l_shipdate@6 <= 1998-09-02, projection=[l_extendedprice@1, l_discount@2, l_quantity@0, l_tax@3, l_returnflag@4, l_linestatus@5] │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_quantity, l_extendedprice, l_discount, l_tax, l_returnflag, l_linestatus, l_shipdate], file_type=parquet, predicate=l_shipdate@10 <= 1998-09-02, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@0 <= 1998-09-02, required_guarantees=[] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_quantity, l_extendedprice, l_discount, l_tax, l_returnflag, l_linestatus, l_shipdate], file_type=parquet, predicate=l_shipdate@10 <= 1998-09-02, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@0 <= 1998-09-02, required_guarantees=[] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_quantity, l_extendedprice, l_discount, l_tax, l_returnflag, l_linestatus, l_shipdate], file_type=parquet, predicate=l_shipdate@10 <= 1998-09-02, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@0 <= 1998-09-02, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_quantity, l_extendedprice, l_discount, l_tax, l_returnflag, l_linestatus, l_shipdate], file_type=parquet, predicate=l_shipdate@10 <= 1998-09-02, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@0 <= 1998-09-02, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_quantity, l_extendedprice, l_discount, l_tax, l_returnflag, l_linestatus, l_shipdate], file_type=parquet, predicate=l_shipdate@10 <= 1998-09-02, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@0 <= 1998-09-02, required_guarantees=[] └────────────────────────────────────────────────── "); Ok(()) @@ -49,14 +49,14 @@ mod tests { #[tokio::test] async fn test_tpch_2() -> Result<(), Box> { let plan = test_tpch_query("q2").await?; - assert_snapshot!(plan, @r" + assert_snapshot!(plan, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [s_acctbal@0 DESC, n_name@2 ASC NULLS LAST, s_name@1 ASC NULLS LAST, p_partkey@3 ASC NULLS LAST] │ [Stage 11] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 11 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ SortExec: expr=[s_acctbal@0 DESC, n_name@2 ASC NULLS LAST, s_name@1 ASC NULLS LAST, p_partkey@3 ASC NULLS LAST], preserve_partitioning=[true] - │ HashJoinExec: mode=Partitioned, join_type=Inner, on=[(p_partkey@0, ps_partkey@1), (ps_supplycost@7, min(partsupp.ps_supplycost)@0)], projection=[s_acctbal@5, s_name@2, n_name@8, p_partkey@0, p_mfgr@1, s_address@3, s_phone@4, s_comment@6] + │ HashJoinExec: mode=Partitioned, join_type=LeftSemi, on=[(p_partkey@0, ps_partkey@1), (ps_supplycost@7, min(partsupp.ps_supplycost)@0)], projection=[s_acctbal@5, s_name@2, n_name@8, p_partkey@0, p_mfgr@1, s_address@3, s_phone@4, s_comment@6] │ [Stage 5] => NetworkShuffleExec: output_partitions=3, input_tasks=4 │ [Stage 10] => NetworkShuffleExec: output_partitions=3, input_tasks=3 └────────────────────────────────────────────────── @@ -78,7 +78,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/1.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/10.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/15.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/5.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/10.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/11.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/15.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/16.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/5.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/6.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/7.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/11.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/12.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/16.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/2.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/3.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/7.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/8.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/12.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/13.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/3.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/8.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/9.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/12.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/13.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/3.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/8.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/9.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -136,7 +136,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/1.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/10.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/15.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/5.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/10.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/11.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/15.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/16.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/5.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/6.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/7.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/11.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/12.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/16.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/2.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/3.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/7.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/8.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/12.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/13.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/3.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/8.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/9.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/12.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/13.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/3.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/8.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/9.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -170,7 +170,7 @@ mod tests { #[tokio::test] async fn test_tpch_3() -> Result<(), Box> { let plan = test_tpch_query("q3").await?; - assert_snapshot!(plan, @r" + assert_snapshot!(plan, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [revenue@1 DESC, o_orderdate@2 ASC NULLS LAST] │ [Stage 4] => NetworkCoalesceExec: output_partitions=9, input_tasks=3 @@ -178,12 +178,12 @@ mod tests { ┌───── Stage 4 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] │ SortExec: expr=[revenue@1 DESC, o_orderdate@2 ASC NULLS LAST], preserve_partitioning=[true] │ ProjectionExec: expr=[l_orderkey@0 as l_orderkey, sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)@3 as revenue, o_orderdate@1 as o_orderdate, o_shippriority@2 as o_shippriority] - │ AggregateExec: mode=FinalPartitioned, gby=[l_orderkey@0 as l_orderkey, o_orderdate@1 as o_orderdate, o_shippriority@2 as o_shippriority], aggr=[sum(lineitem.l_extendedprice * Some(1),20,0 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] + │ AggregateExec: mode=FinalPartitioned, gby=[l_orderkey@0 as l_orderkey, o_orderdate@1 as o_orderdate, o_shippriority@2 as o_shippriority], aggr=[sum(lineitem.l_extendedprice * 1 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] │ [Stage 3] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p8] t1:[p0..p8] t2:[p0..p8] t3:[p0..p8] │ RepartitionExec: partitioning=Hash([l_orderkey@0, o_orderdate@1, o_shippriority@2], 9), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[l_orderkey@2 as l_orderkey, o_orderdate@0 as o_orderdate, o_shippriority@1 as o_shippriority], aggr=[sum(lineitem.l_extendedprice * Some(1),20,0 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] + │ AggregateExec: mode=Partial, gby=[l_orderkey@2 as l_orderkey, o_orderdate@0 as o_orderdate, o_shippriority@1 as o_shippriority], aggr=[sum(lineitem.l_extendedprice * 1 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(o_orderkey@0, l_orderkey@0)], projection=[o_orderdate@1, o_shippriority@2, l_orderkey@3, l_extendedprice@4, l_discount@5] │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -192,7 +192,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_orderkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 > 1995-03-15 AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 > 1995-03-15, required_guarantees=[] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_orderkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 > 1995-03-15 AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 > 1995-03-15, required_guarantees=[] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_orderkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 > 1995-03-15 AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 > 1995-03-15, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 > 1995-03-15 AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 > 1995-03-15, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 > 1995-03-15 AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 > 1995-03-15, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -204,7 +204,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:..], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:..], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate, o_shippriority], file_type=parquet, predicate=o_orderdate@4 < 1995-03-15 AND DynamicFilter [ empty ], pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@0 < 1995-03-15, required_guarantees=[] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:..], [/testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:..], [/testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate, o_shippriority], file_type=parquet, predicate=o_orderdate@4 < 1995-03-15 AND DynamicFilter [ empty ], pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@0 < 1995-03-15, required_guarantees=[] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:..], [/testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:..], [/testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate, o_shippriority], file_type=parquet, predicate=o_orderdate@4 < 1995-03-15 AND DynamicFilter [ empty ], pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@0 < 1995-03-15, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate, o_shippriority], file_type=parquet, predicate=o_orderdate@4 < 1995-03-15 AND DynamicFilter [ empty ], pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@0 < 1995-03-15, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate, o_shippriority], file_type=parquet, predicate=o_orderdate@4 < 1995-03-15 AND DynamicFilter [ empty ], pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@0 < 1995-03-15, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -222,7 +222,7 @@ mod tests { #[tokio::test] async fn test_tpch_4() -> Result<(), Box> { let plan = test_tpch_query("q4").await?; - assert_snapshot!(plan, @r" + assert_snapshot!(plan, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [o_orderpriority@0 ASC NULLS LAST] │ SortExec: expr=[o_orderpriority@0 ASC NULLS LAST], preserve_partitioning=[true] @@ -243,7 +243,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:..], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:..], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:..]]}, projection=[o_orderkey, o_orderdate, o_orderpriority], file_type=parquet, predicate=o_orderdate@4 >= 1993-07-01 AND o_orderdate@4 < 1993-10-01, pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1993-07-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 < 1993-10-01, required_guarantees=[] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:..], [/testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:..], [/testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:..]]}, projection=[o_orderkey, o_orderdate, o_orderpriority], file_type=parquet, predicate=o_orderdate@4 >= 1993-07-01 AND o_orderdate@4 < 1993-10-01, pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1993-07-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 < 1993-10-01, required_guarantees=[] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:..], [/testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:..], [/testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:..]]}, projection=[o_orderkey, o_orderdate, o_orderpriority], file_type=parquet, predicate=o_orderdate@4 >= 1993-07-01 AND o_orderdate@4 < 1993-10-01, pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1993-07-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 < 1993-10-01, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_orderdate, o_orderpriority], file_type=parquet, predicate=o_orderdate@4 >= 1993-07-01 AND o_orderdate@4 < 1993-10-01, pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1993-07-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 < 1993-10-01, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_orderdate, o_orderpriority], file_type=parquet, predicate=o_orderdate@4 >= 1993-07-01 AND o_orderdate@4 < 1993-10-01, pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1993-07-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 < 1993-10-01, required_guarantees=[] └────────────────────────────────────────────────── "); Ok(()) @@ -252,7 +252,7 @@ mod tests { #[tokio::test] async fn test_tpch_5() -> Result<(), Box> { let plan = test_tpch_query("q5").await?; - assert_snapshot!(plan, @r" + assert_snapshot!(plan, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [revenue@1 DESC] │ [Stage 7] => NetworkCoalesceExec: output_partitions=9, input_tasks=3 @@ -260,12 +260,12 @@ mod tests { ┌───── Stage 7 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] │ SortExec: expr=[revenue@1 DESC], preserve_partitioning=[true] │ ProjectionExec: expr=[n_name@0 as n_name, sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)@1 as revenue] - │ AggregateExec: mode=FinalPartitioned, gby=[n_name@0 as n_name], aggr=[sum(lineitem.l_extendedprice * Some(1),20,0 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] + │ AggregateExec: mode=FinalPartitioned, gby=[n_name@0 as n_name], aggr=[sum(lineitem.l_extendedprice * 1 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] │ [Stage 6] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p8] t1:[p0..p8] t2:[p0..p8] t3:[p0..p8] │ RepartitionExec: partitioning=Hash([n_name@0], 9), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[n_name@2 as n_name], aggr=[sum(lineitem.l_extendedprice * Some(1),20,0 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] + │ AggregateExec: mode=Partial, gby=[n_name@2 as n_name], aggr=[sum(lineitem.l_extendedprice * 1 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(r_regionkey@0, n_regionkey@3)], projection=[l_extendedprice@1, l_discount@2, n_name@3] │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -282,7 +282,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -319,7 +319,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:..], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:..], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1994-01-01 AND o_orderdate@4 < 1995-01-01 AND DynamicFilter [ empty ], pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1994-01-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 < 1995-01-01, required_guarantees=[] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:..], [/testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:..], [/testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1994-01-01 AND o_orderdate@4 < 1995-01-01 AND DynamicFilter [ empty ], pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1994-01-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 < 1995-01-01, required_guarantees=[] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:..], [/testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:..], [/testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1994-01-01 AND o_orderdate@4 < 1995-01-01 AND DynamicFilter [ empty ], pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1994-01-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 < 1995-01-01, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1994-01-01 AND o_orderdate@4 < 1995-01-01 AND DynamicFilter [ empty ], pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1994-01-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 < 1995-01-01, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1994-01-01 AND o_orderdate@4 < 1995-01-01 AND DynamicFilter [ empty ], pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1994-01-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 < 1995-01-01, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -336,7 +336,7 @@ mod tests { #[tokio::test] async fn test_tpch_6() -> Result<(), Box> { let plan = test_tpch_query("q6").await?; - assert_snapshot!(plan, @r" + assert_snapshot!(plan, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ ProjectionExec: expr=[sum(lineitem.l_extendedprice * lineitem.l_discount)@0 as revenue] │ AggregateExec: mode=Final, gby=[], aggr=[sum(lineitem.l_extendedprice * lineitem.l_discount)] @@ -345,12 +345,12 @@ mod tests { └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ AggregateExec: mode=Partial, gby=[], aggr=[sum(lineitem.l_extendedprice * lineitem.l_discount)] - │ FilterExec: l_shipdate@3 >= 1994-01-01 AND l_shipdate@3 < 1995-01-01 AND l_discount@2 >= Some(5),15,2 AND l_discount@2 <= Some(7),15,2 AND l_quantity@0 < Some(2400),15,2, projection=[l_extendedprice@1, l_discount@2] + │ FilterExec: l_shipdate@3 >= 1994-01-01 AND l_shipdate@3 < 1995-01-01 AND l_discount@2 >= 0.05 AND l_discount@2 <= 0.07 AND l_quantity@0 < 24.00, projection=[l_extendedprice@1, l_discount@2] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_quantity, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1994-01-01 AND l_shipdate@10 < 1995-01-01 AND l_discount@6 >= Some(5),15,2 AND l_discount@6 <= Some(7),15,2 AND l_quantity@4 < Some(2400),15,2, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1994-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1995-01-01 AND l_discount_null_count@5 != row_count@2 AND l_discount_max@4 >= Some(5),15,2 AND l_discount_null_count@5 != row_count@2 AND l_discount_min@6 <= Some(7),15,2 AND l_quantity_null_count@8 != row_count@2 AND l_quantity_min@7 < Some(2400),15,2, required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_quantity, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1994-01-01 AND l_shipdate@10 < 1995-01-01 AND l_discount@6 >= Some(5),15,2 AND l_discount@6 <= Some(7),15,2 AND l_quantity@4 < Some(2400),15,2, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1994-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1995-01-01 AND l_discount_null_count@5 != row_count@2 AND l_discount_max@4 >= Some(5),15,2 AND l_discount_null_count@5 != row_count@2 AND l_discount_min@6 <= Some(7),15,2 AND l_quantity_null_count@8 != row_count@2 AND l_quantity_min@7 < Some(2400),15,2, required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_quantity, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1994-01-01 AND l_shipdate@10 < 1995-01-01 AND l_discount@6 >= Some(5),15,2 AND l_discount@6 <= Some(7),15,2 AND l_quantity@4 < Some(2400),15,2, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1994-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1995-01-01 AND l_discount_null_count@5 != row_count@2 AND l_discount_max@4 >= Some(5),15,2 AND l_discount_null_count@5 != row_count@2 AND l_discount_min@6 <= Some(7),15,2 AND l_quantity_null_count@8 != row_count@2 AND l_quantity_min@7 < Some(2400),15,2, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_quantity, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1994-01-01 AND l_shipdate@10 < 1995-01-01 AND l_discount@6 >= Some(5),15,2 AND l_discount@6 <= Some(7),15,2 AND l_quantity@4 < Some(2400),15,2, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1994-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1995-01-01 AND l_discount_null_count@5 != row_count@2 AND l_discount_max@4 >= Some(5),15,2 AND l_discount_null_count@5 != row_count@2 AND l_discount_min@6 <= Some(7),15,2 AND l_quantity_null_count@8 != row_count@2 AND l_quantity_min@7 < Some(2400),15,2, required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_quantity, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1994-01-01 AND l_shipdate@10 < 1995-01-01 AND l_discount@6 >= 0.05 AND l_discount@6 <= 0.07 AND l_quantity@4 < 24.00, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1994-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1995-01-01 AND l_discount_null_count@5 != row_count@2 AND l_discount_max@4 >= 0.05 AND l_discount_null_count@5 != row_count@2 AND l_discount_min@6 <= 0.07 AND l_quantity_null_count@8 != row_count@2 AND l_quantity_min@7 < 24.00, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_quantity, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1994-01-01 AND l_shipdate@10 < 1995-01-01 AND l_discount@6 >= 0.05 AND l_discount@6 <= 0.07 AND l_quantity@4 < 24.00, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1994-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1995-01-01 AND l_discount_null_count@5 != row_count@2 AND l_discount_max@4 >= 0.05 AND l_discount_null_count@5 != row_count@2 AND l_discount_min@6 <= 0.07 AND l_quantity_null_count@8 != row_count@2 AND l_quantity_min@7 < 24.00, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_quantity, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1994-01-01 AND l_shipdate@10 < 1995-01-01 AND l_discount@6 >= 0.05 AND l_discount@6 <= 0.07 AND l_quantity@4 < 24.00, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1994-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1995-01-01 AND l_discount_null_count@5 != row_count@2 AND l_discount_max@4 >= 0.05 AND l_discount_null_count@5 != row_count@2 AND l_discount_min@6 <= 0.07 AND l_quantity_null_count@8 != row_count@2 AND l_quantity_min@7 < 24.00, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_quantity, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1994-01-01 AND l_shipdate@10 < 1995-01-01 AND l_discount@6 >= 0.05 AND l_discount@6 <= 0.07 AND l_quantity@4 < 24.00, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1994-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1995-01-01 AND l_discount_null_count@5 != row_count@2 AND l_discount_max@4 >= 0.05 AND l_discount_null_count@5 != row_count@2 AND l_discount_min@6 <= 0.07 AND l_quantity_null_count@8 != row_count@2 AND l_quantity_min@7 < 24.00, required_guarantees=[] └────────────────────────────────────────────────── "); Ok(()) @@ -359,7 +359,7 @@ mod tests { #[tokio::test] async fn test_tpch_7() -> Result<(), Box> { let plan = test_tpch_query("q7").await?; - assert_snapshot!(plan, @r" + assert_snapshot!(plan, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [supp_nation@0 ASC NULLS LAST, cust_nation@1 ASC NULLS LAST, l_year@2 ASC NULLS LAST] │ [Stage 7] => NetworkCoalesceExec: output_partitions=9, input_tasks=3 @@ -373,7 +373,7 @@ mod tests { ┌───── Stage 6 ── Tasks: t0:[p0..p8] t1:[p0..p8] t2:[p0..p8] t3:[p0..p8] │ RepartitionExec: partitioning=Hash([supp_nation@0, cust_nation@1, l_year@2], 9), input_partitions=3 │ AggregateExec: mode=Partial, gby=[supp_nation@0 as supp_nation, cust_nation@1 as cust_nation, l_year@2 as l_year], aggr=[sum(shipping.volume)] - │ ProjectionExec: expr=[n_name@0 as supp_nation, n_name@1 as cust_nation, date_part(YEAR, l_shipdate@2) as l_year, l_extendedprice@3 * (Some(1),20,0 - l_discount@4) as volume] + │ ProjectionExec: expr=[n_name@0 as supp_nation, n_name@1 as cust_nation, date_part(YEAR, l_shipdate@2) as l_year, l_extendedprice@3 * (1 - l_discount@4) as volume] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(n_nationkey@0, c_nationkey@3)], filter=n_name@0 = FRANCE AND n_name@1 = GERMANY OR n_name@0 = GERMANY AND n_name@1 = FRANCE, projection=[n_name@6, n_name@1, l_shipdate@4, l_extendedprice@2, l_discount@3] │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -394,7 +394,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1995-01-01 AND l_shipdate@10 <= 1996-12-31 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1995-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 <= 1996-12-31, required_guarantees=[] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1995-01-01 AND l_shipdate@10 <= 1996-12-31 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1995-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 <= 1996-12-31, required_guarantees=[] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1995-01-01 AND l_shipdate@10 <= 1996-12-31 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1995-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 <= 1996-12-31, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1995-01-01 AND l_shipdate@10 <= 1996-12-31 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1995-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 <= 1996-12-31, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1995-01-01 AND l_shipdate@10 <= 1996-12-31 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1995-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 <= 1996-12-31, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -428,7 +428,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:..], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:..], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:..]]}, projection=[o_orderkey, o_custkey], file_type=parquet, predicate=DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:..], [/testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:..], [/testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:..]]}, projection=[o_orderkey, o_custkey], file_type=parquet, predicate=DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:..], [/testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:..], [/testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:..]]}, projection=[o_orderkey, o_custkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_custkey], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_custkey], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -453,13 +453,13 @@ mod tests { ┌───── Stage 9 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] │ SortExec: expr=[o_year@0 ASC NULLS LAST], preserve_partitioning=[true] │ ProjectionExec: expr=[o_year@0 as o_year, sum(CASE WHEN all_nations.nation = Utf8("BRAZIL") THEN all_nations.volume ELSE Int64(0) END)@1 / sum(all_nations.volume)@2 as mkt_share] - │ AggregateExec: mode=FinalPartitioned, gby=[o_year@0 as o_year], aggr=[sum(CASE WHEN all_nations.nation = BRAZIL THEN all_nations.volume ELSE Some(0),38,4 END) as sum(CASE WHEN all_nations.nation = Utf8("BRAZIL") THEN all_nations.volume ELSE Int64(0) END), sum(all_nations.volume)] + │ AggregateExec: mode=FinalPartitioned, gby=[o_year@0 as o_year], aggr=[sum(CASE WHEN all_nations.nation = BRAZIL THEN all_nations.volume ELSE 0.0000 END) as sum(CASE WHEN all_nations.nation = Utf8("BRAZIL") THEN all_nations.volume ELSE Int64(0) END), sum(all_nations.volume)] │ [Stage 8] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p8] t1:[p0..p8] t2:[p0..p8] t3:[p0..p8] │ RepartitionExec: partitioning=Hash([o_year@0], 9), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[o_year@0 as o_year], aggr=[sum(CASE WHEN all_nations.nation = BRAZIL THEN all_nations.volume ELSE Some(0),38,4 END) as sum(CASE WHEN all_nations.nation = Utf8("BRAZIL") THEN all_nations.volume ELSE Int64(0) END), sum(all_nations.volume)] - │ ProjectionExec: expr=[date_part(YEAR, o_orderdate@0) as o_year, l_extendedprice@1 * (Some(1),20,0 - l_discount@2) as volume, n_name@3 as nation] + │ AggregateExec: mode=Partial, gby=[o_year@0 as o_year], aggr=[sum(CASE WHEN all_nations.nation = BRAZIL THEN all_nations.volume ELSE 0.0000 END) as sum(CASE WHEN all_nations.nation = Utf8("BRAZIL") THEN all_nations.volume ELSE Int64(0) END), sum(all_nations.volume)] + │ ProjectionExec: expr=[date_part(YEAR, o_orderdate@0) as o_year, l_extendedprice@1 * (1 - l_discount@2) as volume, n_name@3 as nation] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(r_regionkey@0, n_regionkey@3)], projection=[o_orderdate@3, l_extendedprice@1, l_discount@2, n_name@5] │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -485,7 +485,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_orderkey, l_partkey, l_suppkey, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_orderkey, l_partkey, l_suppkey, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_orderkey, l_partkey, l_suppkey, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_partkey, l_suppkey, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_partkey, l_suppkey, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -527,7 +527,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:..], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:..], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1995-01-01 AND o_orderdate@4 <= 1996-12-31 AND DynamicFilter [ empty ], pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1995-01-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 <= 1996-12-31, required_guarantees=[] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:..], [/testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:..], [/testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1995-01-01 AND o_orderdate@4 <= 1996-12-31 AND DynamicFilter [ empty ], pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1995-01-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 <= 1996-12-31, required_guarantees=[] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:..], [/testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:..], [/testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1995-01-01 AND o_orderdate@4 <= 1996-12-31 AND DynamicFilter [ empty ], pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1995-01-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 <= 1996-12-31, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1995-01-01 AND o_orderdate@4 <= 1996-12-31 AND DynamicFilter [ empty ], pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1995-01-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 <= 1996-12-31, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1995-01-01 AND o_orderdate@4 <= 1996-12-31 AND DynamicFilter [ empty ], pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1995-01-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 <= 1996-12-31, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -553,7 +553,7 @@ mod tests { #[tokio::test] async fn test_tpch_9() -> Result<(), Box> { let plan = test_tpch_query("q9").await?; - assert_snapshot!(plan, @r" + assert_snapshot!(plan, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [nation@0 ASC NULLS LAST, o_year@1 DESC] │ [Stage 7] => NetworkCoalesceExec: output_partitions=9, input_tasks=3 @@ -567,7 +567,7 @@ mod tests { ┌───── Stage 6 ── Tasks: t0:[p0..p8] t1:[p0..p8] t2:[p0..p8] t3:[p0..p8] │ RepartitionExec: partitioning=Hash([nation@0, o_year@1], 9), input_partitions=3 │ AggregateExec: mode=Partial, gby=[nation@0 as nation, o_year@1 as o_year], aggr=[sum(profit.amount)] - │ ProjectionExec: expr=[n_name@0 as nation, date_part(YEAR, o_orderdate@1) as o_year, l_extendedprice@2 * (Some(1),20,0 - l_discount@3) - ps_supplycost@4 * l_quantity@5 as amount] + │ ProjectionExec: expr=[n_name@0 as nation, date_part(YEAR, o_orderdate@1) as o_year, l_extendedprice@2 * (1 - l_discount@3) - ps_supplycost@4 * l_quantity@5 as amount] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(n_nationkey@0, s_nationkey@3)], projection=[n_name@1, o_orderdate@7, l_extendedprice@3, l_discount@4, ps_supplycost@6, l_quantity@2] │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -587,7 +587,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_orderkey, l_partkey, l_suppkey, l_quantity, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_orderkey, l_partkey, l_suppkey, l_quantity, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_orderkey, l_partkey, l_suppkey, l_quantity, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_partkey, l_suppkey, l_quantity, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_partkey, l_suppkey, l_quantity, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -603,7 +603,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:..], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:..], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:..]]}, projection=[o_orderkey, o_orderdate], file_type=parquet │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:..], [/testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:..], [/testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:..]]}, projection=[o_orderkey, o_orderdate], file_type=parquet │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:..], [/testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:..], [/testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:..]]}, projection=[o_orderkey, o_orderdate], file_type=parquet - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_orderdate], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_orderdate], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -611,7 +611,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/1.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/10.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/15.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/5.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/10.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/11.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/15.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/16.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/5.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/6.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/7.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/11.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/12.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/16.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/2.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/3.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/7.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/8.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/12.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/13.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/3.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/8.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/9.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/12.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/13.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/3.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/8.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/9.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -637,7 +637,7 @@ mod tests { #[tokio::test] async fn test_tpch_10() -> Result<(), Box> { let plan = test_tpch_query("q10").await?; - assert_snapshot!(plan, @r" + assert_snapshot!(plan, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [revenue@2 DESC] │ [Stage 5] => NetworkCoalesceExec: output_partitions=9, input_tasks=3 @@ -645,12 +645,12 @@ mod tests { ┌───── Stage 5 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] │ SortExec: expr=[revenue@2 DESC], preserve_partitioning=[true] │ ProjectionExec: expr=[c_custkey@0 as c_custkey, c_name@1 as c_name, sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)@7 as revenue, c_acctbal@2 as c_acctbal, n_name@4 as n_name, c_address@5 as c_address, c_phone@3 as c_phone, c_comment@6 as c_comment] - │ AggregateExec: mode=FinalPartitioned, gby=[c_custkey@0 as c_custkey, c_name@1 as c_name, c_acctbal@2 as c_acctbal, c_phone@3 as c_phone, n_name@4 as n_name, c_address@5 as c_address, c_comment@6 as c_comment], aggr=[sum(lineitem.l_extendedprice * Some(1),20,0 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] + │ AggregateExec: mode=FinalPartitioned, gby=[c_custkey@0 as c_custkey, c_name@1 as c_name, c_acctbal@2 as c_acctbal, c_phone@3 as c_phone, n_name@4 as n_name, c_address@5 as c_address, c_comment@6 as c_comment], aggr=[sum(lineitem.l_extendedprice * 1 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] │ [Stage 4] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p8] t1:[p0..p8] t2:[p0..p8] t3:[p0..p8] │ RepartitionExec: partitioning=Hash([c_custkey@0, c_name@1, c_acctbal@2, c_phone@3, n_name@4, c_address@5, c_comment@6], 9), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[c_custkey@0 as c_custkey, c_name@1 as c_name, c_acctbal@4 as c_acctbal, c_phone@3 as c_phone, n_name@8 as n_name, c_address@2 as c_address, c_comment@5 as c_comment], aggr=[sum(lineitem.l_extendedprice * Some(1),20,0 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] + │ AggregateExec: mode=Partial, gby=[c_custkey@0 as c_custkey, c_name@1 as c_name, c_acctbal@4 as c_acctbal, c_phone@3 as c_phone, n_name@8 as n_name, c_address@2 as c_address, c_comment@5 as c_comment], aggr=[sum(lineitem.l_extendedprice * 1 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(n_nationkey@0, c_nationkey@3)], projection=[c_custkey@2, c_name@3, c_address@4, c_phone@6, c_acctbal@7, c_comment@8, l_extendedprice@9, l_discount@10, n_name@1] │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -662,7 +662,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_orderkey, l_extendedprice, l_discount, l_returnflag], file_type=parquet, predicate=l_returnflag@8 = R AND DynamicFilter [ empty ], pruning_predicate=l_returnflag_null_count@2 != row_count@3 AND l_returnflag_min@0 <= R AND R <= l_returnflag_max@1, required_guarantees=[l_returnflag in (R)] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_orderkey, l_extendedprice, l_discount, l_returnflag], file_type=parquet, predicate=l_returnflag@8 = R AND DynamicFilter [ empty ], pruning_predicate=l_returnflag_null_count@2 != row_count@3 AND l_returnflag_min@0 <= R AND R <= l_returnflag_max@1, required_guarantees=[l_returnflag in (R)] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_orderkey, l_extendedprice, l_discount, l_returnflag], file_type=parquet, predicate=l_returnflag@8 = R AND DynamicFilter [ empty ], pruning_predicate=l_returnflag_null_count@2 != row_count@3 AND l_returnflag_min@0 <= R AND R <= l_returnflag_max@1, required_guarantees=[l_returnflag in (R)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_extendedprice, l_discount, l_returnflag], file_type=parquet, predicate=l_returnflag@8 = R AND DynamicFilter [ empty ], pruning_predicate=l_returnflag_null_count@2 != row_count@3 AND l_returnflag_min@0 <= R AND R <= l_returnflag_max@1, required_guarantees=[l_returnflag in (R)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_extendedprice, l_discount, l_returnflag], file_type=parquet, predicate=l_returnflag@8 = R AND DynamicFilter [ empty ], pruning_predicate=l_returnflag_null_count@2 != row_count@3 AND l_returnflag_min@0 <= R AND R <= l_returnflag_max@1, required_guarantees=[l_returnflag in (R)] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -690,7 +690,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:..], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:..], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1993-10-01 AND o_orderdate@4 < 1994-01-01, pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1993-10-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 < 1994-01-01, required_guarantees=[] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:..], [/testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:..], [/testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1993-10-01 AND o_orderdate@4 < 1994-01-01, pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1993-10-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 < 1994-01-01, required_guarantees=[] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:..], [/testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:..], [/testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1993-10-01 AND o_orderdate@4 < 1994-01-01, pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1993-10-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 < 1994-01-01, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1993-10-01 AND o_orderdate@4 < 1994-01-01, pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1993-10-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 < 1994-01-01, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1993-10-01 AND o_orderdate@4 < 1994-01-01, pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1993-10-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 < 1994-01-01, required_guarantees=[] └────────────────────────────────────────────────── "); Ok(()) @@ -699,7 +699,7 @@ mod tests { #[tokio::test] async fn test_tpch_11() -> Result<(), Box> { let plan = test_tpch_query("q11").await?; - assert_snapshot!(plan, @r" + assert_snapshot!(plan, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [value@1 DESC] │ [Stage 8] => NetworkCoalesceExec: output_partitions=9, input_tasks=3 @@ -733,7 +733,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/1.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/10.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/15.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/5.parquet:..]]}, projection=[ps_suppkey, ps_availqty, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/10.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/11.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/15.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/16.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/5.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/6.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/7.parquet:..]]}, projection=[ps_suppkey, ps_availqty, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/11.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/12.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/16.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/2.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/3.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/7.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/8.parquet:..]]}, projection=[ps_suppkey, ps_availqty, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/12.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/13.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/3.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/8.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/9.parquet:..]]}, projection=[ps_suppkey, ps_availqty, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/12.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/13.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/3.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/8.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/9.parquet:..]]}, projection=[ps_suppkey, ps_availqty, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -765,7 +765,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/1.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/10.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/15.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/5.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/10.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/11.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/15.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/16.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/5.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/6.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/7.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/11.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/12.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/16.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/2.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/3.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/7.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/8.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/12.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/13.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/3.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/8.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/9.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/12.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/13.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/3.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/8.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/9.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -812,7 +812,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:..], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:..], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:..]]}, projection=[o_orderkey, o_orderpriority], file_type=parquet, predicate=DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:..], [/testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:..], [/testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:..]]}, projection=[o_orderkey, o_orderpriority], file_type=parquet, predicate=DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:..], [/testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:..], [/testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:..]]}, projection=[o_orderkey, o_orderpriority], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_orderpriority], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_orderpriority], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -821,7 +821,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_orderkey, l_shipdate, l_commitdate, l_receiptdate, l_shipmode], file_type=parquet, predicate=(l_shipmode@14 = MAIL OR l_shipmode@14 = SHIP) AND l_receiptdate@12 > l_commitdate@11 AND l_shipdate@10 < l_commitdate@11 AND l_receiptdate@12 >= 1994-01-01 AND l_receiptdate@12 < 1995-01-01, pruning_predicate=(l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= MAIL AND MAIL <= l_shipmode_max@1 OR l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= SHIP AND SHIP <= l_shipmode_max@1) AND l_receiptdate_null_count@5 != row_count@3 AND l_receiptdate_max@4 >= 1994-01-01 AND l_receiptdate_null_count@5 != row_count@3 AND l_receiptdate_min@6 < 1995-01-01, required_guarantees=[l_shipmode in (MAIL, SHIP)] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_orderkey, l_shipdate, l_commitdate, l_receiptdate, l_shipmode], file_type=parquet, predicate=(l_shipmode@14 = MAIL OR l_shipmode@14 = SHIP) AND l_receiptdate@12 > l_commitdate@11 AND l_shipdate@10 < l_commitdate@11 AND l_receiptdate@12 >= 1994-01-01 AND l_receiptdate@12 < 1995-01-01, pruning_predicate=(l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= MAIL AND MAIL <= l_shipmode_max@1 OR l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= SHIP AND SHIP <= l_shipmode_max@1) AND l_receiptdate_null_count@5 != row_count@3 AND l_receiptdate_max@4 >= 1994-01-01 AND l_receiptdate_null_count@5 != row_count@3 AND l_receiptdate_min@6 < 1995-01-01, required_guarantees=[l_shipmode in (MAIL, SHIP)] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_orderkey, l_shipdate, l_commitdate, l_receiptdate, l_shipmode], file_type=parquet, predicate=(l_shipmode@14 = MAIL OR l_shipmode@14 = SHIP) AND l_receiptdate@12 > l_commitdate@11 AND l_shipdate@10 < l_commitdate@11 AND l_receiptdate@12 >= 1994-01-01 AND l_receiptdate@12 < 1995-01-01, pruning_predicate=(l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= MAIL AND MAIL <= l_shipmode_max@1 OR l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= SHIP AND SHIP <= l_shipmode_max@1) AND l_receiptdate_null_count@5 != row_count@3 AND l_receiptdate_max@4 >= 1994-01-01 AND l_receiptdate_null_count@5 != row_count@3 AND l_receiptdate_min@6 < 1995-01-01, required_guarantees=[l_shipmode in (MAIL, SHIP)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_shipdate, l_commitdate, l_receiptdate, l_shipmode], file_type=parquet, predicate=(l_shipmode@14 = MAIL OR l_shipmode@14 = SHIP) AND l_receiptdate@12 > l_commitdate@11 AND l_shipdate@10 < l_commitdate@11 AND l_receiptdate@12 >= 1994-01-01 AND l_receiptdate@12 < 1995-01-01, pruning_predicate=(l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= MAIL AND MAIL <= l_shipmode_max@1 OR l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= SHIP AND SHIP <= l_shipmode_max@1) AND l_receiptdate_null_count@5 != row_count@3 AND l_receiptdate_max@4 >= 1994-01-01 AND l_receiptdate_null_count@5 != row_count@3 AND l_receiptdate_min@6 < 1995-01-01, required_guarantees=[l_shipmode in (MAIL, SHIP)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_shipdate, l_commitdate, l_receiptdate, l_shipmode], file_type=parquet, predicate=(l_shipmode@14 = MAIL OR l_shipmode@14 = SHIP) AND l_receiptdate@12 > l_commitdate@11 AND l_shipdate@10 < l_commitdate@11 AND l_receiptdate@12 >= 1994-01-01 AND l_receiptdate@12 < 1995-01-01, pruning_predicate=(l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= MAIL AND MAIL <= l_shipmode_max@1 OR l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= SHIP AND SHIP <= l_shipmode_max@1) AND l_receiptdate_null_count@5 != row_count@3 AND l_receiptdate_max@4 >= 1994-01-01 AND l_receiptdate_null_count@5 != row_count@3 AND l_receiptdate_min@6 < 1995-01-01, required_guarantees=[l_shipmode in (MAIL, SHIP)] └────────────────────────────────────────────────── "#); Ok(()) @@ -830,41 +830,22 @@ mod tests { #[tokio::test] async fn test_tpch_13() -> Result<(), Box> { let plan = test_tpch_query("q13").await?; - assert_snapshot!(plan, @r" - ┌───── DistributedExec ── Tasks: t0:[p0] - │ SortPreservingMergeExec: [custdist@1 DESC, c_count@0 DESC] - │ [Stage 3] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 - └────────────────────────────────────────────────── - ┌───── Stage 3 ── Tasks: t0:[p0..p2] t1:[p0..p2] - │ SortExec: expr=[custdist@1 DESC, c_count@0 DESC], preserve_partitioning=[true] - │ ProjectionExec: expr=[c_count@0 as c_count, count(Int64(1))@1 as custdist] - │ AggregateExec: mode=FinalPartitioned, gby=[c_count@0 as c_count], aggr=[count(Int64(1))] - │ [Stage 2] => NetworkShuffleExec: output_partitions=3, input_tasks=3 - └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] - │ RepartitionExec: partitioning=Hash([c_count@0], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[c_count@0 as c_count], aggr=[count(Int64(1))] - │ ProjectionExec: expr=[count(orders.o_orderkey)@1 as c_count] - │ AggregateExec: mode=FinalPartitioned, gby=[c_custkey@0 as c_custkey], aggr=[count(orders.o_orderkey)] - │ [Stage 1] => NetworkShuffleExec: output_partitions=3, input_tasks=4 - └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p8] t1:[p0..p8] t2:[p0..p8] t3:[p0..p8] - │ RepartitionExec: partitioning=Hash([c_custkey@0], 9), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[c_custkey@0 as c_custkey], aggr=[count(orders.o_orderkey)] - │ HashJoinExec: mode=CollectLeft, join_type=Left, on=[(c_custkey@0, o_custkey@1)], projection=[c_custkey@0, o_orderkey@1] - │ CoalescePartitionsExec - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/1.parquet:.., /testdata/tpch/plan_sf0.02/customer/10.parquet:..], [/testdata/tpch/plan_sf0.02/customer/14.parquet:.., /testdata/tpch/plan_sf0.02/customer/15.parquet:..], [/testdata/tpch/plan_sf0.02/customer/4.parquet:.., /testdata/tpch/plan_sf0.02/customer/5.parquet:.., /testdata/tpch/plan_sf0.02/customer/6.parquet:..]]}, projection=[c_custkey], file_type=parquet - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/10.parquet:.., /testdata/tpch/plan_sf0.02/customer/11.parquet:..], [/testdata/tpch/plan_sf0.02/customer/15.parquet:.., /testdata/tpch/plan_sf0.02/customer/16.parquet:..], [/testdata/tpch/plan_sf0.02/customer/6.parquet:.., /testdata/tpch/plan_sf0.02/customer/7.parquet:..]]}, projection=[c_custkey], file_type=parquet - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/11.parquet:.., /testdata/tpch/plan_sf0.02/customer/12.parquet:.., /testdata/tpch/plan_sf0.02/customer/13.parquet:..], [/testdata/tpch/plan_sf0.02/customer/16.parquet:.., /testdata/tpch/plan_sf0.02/customer/2.parquet:.., /testdata/tpch/plan_sf0.02/customer/3.parquet:..], [/testdata/tpch/plan_sf0.02/customer/7.parquet:.., /testdata/tpch/plan_sf0.02/customer/8.parquet:..]]}, projection=[c_custkey], file_type=parquet - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/13.parquet:.., /testdata/tpch/plan_sf0.02/customer/14.parquet:..], [/testdata/tpch/plan_sf0.02/customer/3.parquet:.., /testdata/tpch/plan_sf0.02/customer/4.parquet:..], [/testdata/tpch/plan_sf0.02/customer/8.parquet:.., /testdata/tpch/plan_sf0.02/customer/9.parquet:..]]}, projection=[c_custkey], file_type=parquet - │ FilterExec: o_comment@2 NOT LIKE %special%requests%, projection=[o_orderkey@0, o_custkey@1] - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:..], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:..], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:..]]}, projection=[o_orderkey, o_custkey, o_comment], file_type=parquet, predicate=o_comment@8 NOT LIKE %special%requests% AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:..], [/testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:..], [/testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:..]]}, projection=[o_orderkey, o_custkey, o_comment], file_type=parquet, predicate=o_comment@8 NOT LIKE %special%requests% AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:..], [/testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:..], [/testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:..]]}, projection=[o_orderkey, o_custkey, o_comment], file_type=parquet, predicate=o_comment@8 NOT LIKE %special%requests% AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_custkey, o_comment], file_type=parquet, predicate=o_comment@8 NOT LIKE %special%requests% AND DynamicFilter [ empty ] - └────────────────────────────────────────────────── + assert_snapshot!(plan, @" + SortPreservingMergeExec: [custdist@1 DESC, c_count@0 DESC] + SortExec: expr=[custdist@1 DESC, c_count@0 DESC], preserve_partitioning=[true] + ProjectionExec: expr=[c_count@0 as c_count, count(Int64(1))@1 as custdist] + AggregateExec: mode=FinalPartitioned, gby=[c_count@0 as c_count], aggr=[count(Int64(1))] + RepartitionExec: partitioning=Hash([c_count@0], 3), input_partitions=3 + AggregateExec: mode=Partial, gby=[c_count@0 as c_count], aggr=[count(Int64(1))] + ProjectionExec: expr=[count(orders.o_orderkey)@1 as c_count] + AggregateExec: mode=FinalPartitioned, gby=[c_custkey@0 as c_custkey], aggr=[count(orders.o_orderkey)] + RepartitionExec: partitioning=Hash([c_custkey@0], 3), input_partitions=3 + AggregateExec: mode=Partial, gby=[c_custkey@0 as c_custkey], aggr=[count(orders.o_orderkey)] + HashJoinExec: mode=CollectLeft, join_type=Left, on=[(c_custkey@0, o_custkey@1)], projection=[c_custkey@0, o_orderkey@1] + CoalescePartitionsExec + DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/1.parquet, /testdata/tpch/plan_sf0.02/customer/10.parquet, /testdata/tpch/plan_sf0.02/customer/11.parquet, /testdata/tpch/plan_sf0.02/customer/12.parquet, /testdata/tpch/plan_sf0.02/customer/13.parquet, /testdata/tpch/plan_sf0.02/customer/14.parquet], [/testdata/tpch/plan_sf0.02/customer/15.parquet, /testdata/tpch/plan_sf0.02/customer/16.parquet, /testdata/tpch/plan_sf0.02/customer/2.parquet, /testdata/tpch/plan_sf0.02/customer/3.parquet, /testdata/tpch/plan_sf0.02/customer/4.parquet, /testdata/tpch/plan_sf0.02/customer/5.parquet], [/testdata/tpch/plan_sf0.02/customer/6.parquet, /testdata/tpch/plan_sf0.02/customer/7.parquet, /testdata/tpch/plan_sf0.02/customer/8.parquet, /testdata/tpch/plan_sf0.02/customer/9.parquet]]}, projection=[c_custkey], file_type=parquet + FilterExec: o_comment@2 NOT LIKE %special%requests%, projection=[o_orderkey@0, o_custkey@1] + DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_custkey, o_comment], file_type=parquet, predicate=o_comment@8 NOT LIKE %special%requests% AND DynamicFilter [ empty ] "); Ok(()) } @@ -875,13 +856,13 @@ mod tests { assert_snapshot!(plan, @r#" ┌───── DistributedExec ── Tasks: t0:[p0] │ ProjectionExec: expr=[100 * CAST(sum(CASE WHEN part.p_type LIKE Utf8("PROMO%") THEN lineitem.l_extendedprice * Int64(1) - lineitem.l_discount ELSE Int64(0) END)@0 AS Float64) / CAST(sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)@1 AS Float64) as promo_revenue] - │ AggregateExec: mode=Final, gby=[], aggr=[sum(CASE WHEN part.p_type LIKE PROMO% THEN __common_expr_1 ELSE Some(0),38,4 END) as sum(CASE WHEN part.p_type LIKE Utf8("PROMO%") THEN lineitem.l_extendedprice * Int64(1) - lineitem.l_discount ELSE Int64(0) END), sum(__common_expr_1) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] + │ AggregateExec: mode=Final, gby=[], aggr=[sum(CASE WHEN part.p_type LIKE PROMO% THEN __common_expr_1 ELSE 0.0000 END) as sum(CASE WHEN part.p_type LIKE Utf8("PROMO%") THEN lineitem.l_extendedprice * Int64(1) - lineitem.l_discount ELSE Int64(0) END), sum(__common_expr_1) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] │ CoalescePartitionsExec │ [Stage 2] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] - │ AggregateExec: mode=Partial, gby=[], aggr=[sum(CASE WHEN part.p_type LIKE PROMO% THEN __common_expr_1 ELSE Some(0),38,4 END) as sum(CASE WHEN part.p_type LIKE Utf8("PROMO%") THEN lineitem.l_extendedprice * Int64(1) - lineitem.l_discount ELSE Int64(0) END), sum(__common_expr_1) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] - │ ProjectionExec: expr=[l_extendedprice@0 * (Some(1),20,0 - l_discount@1) as __common_expr_1, p_type@2 as p_type] + │ AggregateExec: mode=Partial, gby=[], aggr=[sum(CASE WHEN part.p_type LIKE PROMO% THEN __common_expr_1 ELSE 0.0000 END) as sum(CASE WHEN part.p_type LIKE Utf8("PROMO%") THEN lineitem.l_extendedprice * Int64(1) - lineitem.l_discount ELSE Int64(0) END), sum(__common_expr_1) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] + │ ProjectionExec: expr=[l_extendedprice@0 * (1 - l_discount@1) as __common_expr_1, p_type@2 as p_type] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(l_partkey@0, p_partkey@0)], projection=[l_extendedprice@1, l_discount@2, p_type@4] │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 @@ -898,7 +879,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_partkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1995-09-01 AND l_shipdate@10 < 1995-10-01, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1995-09-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1995-10-01, required_guarantees=[] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_partkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1995-09-01 AND l_shipdate@10 < 1995-10-01, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1995-09-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1995-10-01, required_guarantees=[] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_partkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1995-09-01 AND l_shipdate@10 < 1995-10-01, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1995-09-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1995-10-01, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_partkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1995-09-01 AND l_shipdate@10 < 1995-10-01, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1995-09-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1995-10-01, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_partkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1995-09-01 AND l_shipdate@10 < 1995-10-01, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1995-09-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1995-10-01, required_guarantees=[] └────────────────────────────────────────────────── "#); Ok(()) @@ -907,7 +888,7 @@ mod tests { #[tokio::test] async fn test_tpch_15() -> Result<(), Box> { let plan = test_tpch_query("q15").await?; - assert_snapshot!(plan, @r" + assert_snapshot!(plan, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [s_suppkey@0 ASC NULLS LAST] │ [Stage 6] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 @@ -921,7 +902,7 @@ mod tests { │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ ProjectionExec: expr=[l_suppkey@0 as supplier_no, sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)@1 as total_revenue] - │ AggregateExec: mode=FinalPartitioned, gby=[l_suppkey@0 as l_suppkey], aggr=[sum(lineitem.l_extendedprice * Some(1),20,0 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] + │ AggregateExec: mode=FinalPartitioned, gby=[l_suppkey@0 as l_suppkey], aggr=[sum(lineitem.l_extendedprice * 1 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] │ [Stage 5] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p3] @@ -933,18 +914,18 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p2] t1:[p0..p2] │ AggregateExec: mode=Partial, gby=[], aggr=[max(revenue0.total_revenue)] │ ProjectionExec: expr=[sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)@1 as total_revenue] - │ AggregateExec: mode=FinalPartitioned, gby=[l_suppkey@0 as l_suppkey], aggr=[sum(lineitem.l_extendedprice * Some(1),20,0 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] + │ AggregateExec: mode=FinalPartitioned, gby=[l_suppkey@0 as l_suppkey], aggr=[sum(lineitem.l_extendedprice * 1 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] │ [Stage 1] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([l_suppkey@0], 6), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[l_suppkey@0 as l_suppkey], aggr=[sum(lineitem.l_extendedprice * Some(1),20,0 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] + │ AggregateExec: mode=Partial, gby=[l_suppkey@0 as l_suppkey], aggr=[sum(lineitem.l_extendedprice * 1 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] │ FilterExec: l_shipdate@3 >= 1996-01-01 AND l_shipdate@3 < 1996-04-01, projection=[l_suppkey@0, l_extendedprice@1, l_discount@2] │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1996-01-01 AND l_shipdate@10 < 1996-04-01, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1996-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1996-04-01, required_guarantees=[] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1996-01-01 AND l_shipdate@10 < 1996-04-01, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1996-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1996-04-01, required_guarantees=[] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1996-01-01 AND l_shipdate@10 < 1996-04-01, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1996-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1996-04-01, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1996-01-01 AND l_shipdate@10 < 1996-04-01, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1996-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1996-04-01, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1996-01-01 AND l_shipdate@10 < 1996-04-01, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1996-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1996-04-01, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -956,13 +937,13 @@ mod tests { └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([l_suppkey@0], 12), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[l_suppkey@0 as l_suppkey], aggr=[sum(lineitem.l_extendedprice * Some(1),20,0 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] + │ AggregateExec: mode=Partial, gby=[l_suppkey@0 as l_suppkey], aggr=[sum(lineitem.l_extendedprice * 1 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] │ FilterExec: l_shipdate@3 >= 1996-01-01 AND l_shipdate@3 < 1996-04-01, projection=[l_suppkey@0, l_extendedprice@1, l_discount@2] │ DistributedLeafExec: │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1996-01-01 AND l_shipdate@10 < 1996-04-01 AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1996-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1996-04-01, required_guarantees=[] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1996-01-01 AND l_shipdate@10 < 1996-04-01 AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1996-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1996-04-01, required_guarantees=[] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1996-01-01 AND l_shipdate@10 < 1996-04-01 AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1996-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1996-04-01, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1996-01-01 AND l_shipdate@10 < 1996-04-01 AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1996-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1996-04-01, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1996-01-01 AND l_shipdate@10 < 1996-04-01 AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1996-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1996-04-01, required_guarantees=[] └────────────────────────────────────────────────── "); Ok(()) @@ -971,7 +952,7 @@ mod tests { #[tokio::test] async fn test_tpch_16() -> Result<(), Box> { let plan = test_tpch_query("q16").await?; - assert_snapshot!(plan, @r" + assert_snapshot!(plan, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [supplier_cnt@3 DESC, p_brand@0 ASC NULLS LAST, p_type@1 ASC NULLS LAST, p_size@2 ASC NULLS LAST] │ [Stage 5] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 @@ -1001,7 +982,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/1.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/10.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/15.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/5.parquet:..]]}, projection=[ps_partkey, ps_suppkey], file_type=parquet, predicate=DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/10.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/11.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/15.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/16.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/5.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/6.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/7.parquet:..]]}, projection=[ps_partkey, ps_suppkey], file_type=parquet, predicate=DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/11.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/12.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/16.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/2.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/3.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/7.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/8.parquet:..]]}, projection=[ps_partkey, ps_suppkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/12.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/13.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/3.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/8.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/9.parquet:..]]}, projection=[ps_partkey, ps_suppkey], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/12.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/13.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/3.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/8.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/9.parquet:..]]}, projection=[ps_partkey, ps_suppkey], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1014,12 +995,12 @@ mod tests { └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: p_brand@1 != Brand#45 AND p_type@2 NOT LIKE MEDIUM POLISHED% AND p_size@3 IN (SET) ([49, 14, 23, 45, 19, 3, 36, 9]) + │ FilterExec: p_brand@1 != Brand#45 AND p_size@3 IN (SET) ([49, 14, 23, 45, 19, 3, 36, 9]) AND p_type@2 NOT LIKE MEDIUM POLISHED% │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/part/1.parquet:.., /testdata/tpch/plan_sf0.02/part/10.parquet:..], [/testdata/tpch/plan_sf0.02/part/14.parquet:.., /testdata/tpch/plan_sf0.02/part/15.parquet:..], [/testdata/tpch/plan_sf0.02/part/4.parquet:.., /testdata/tpch/plan_sf0.02/part/5.parquet:..]]}, projection=[p_partkey, p_brand, p_type, p_size], file_type=parquet, predicate=p_brand@3 != Brand#45 AND p_type@4 NOT LIKE MEDIUM POLISHED% AND p_size@5 IN (SET) ([49, 14, 23, 45, 19, 3, 36, 9]), pruning_predicate=p_brand_null_count@2 != row_count@3 AND (p_brand_min@0 != Brand#45 OR Brand#45 != p_brand_max@1) AND p_type_null_count@6 != row_count@3 AND (p_type_min@4 NOT LIKE MEDIUM POLISHED% OR p_type_max@5 NOT LIKE MEDIUM POLISHED%) AND (p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 49 AND 49 <= p_size_max@8 OR p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 14 AND 14 <= p_size_max@8 OR p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 23 AND 23 <= p_size_max@8 OR p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 45 AND 45 <= p_size_max@8 OR p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 19 AND 19 <= p_size_max@8 OR p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 3 AND 3 <= p_size_max@8 OR p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 36 AND 36 <= p_size_max@8 OR p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 9 AND 9 <= p_size_max@8), required_guarantees=[p_brand not in (Brand#45), p_size in (14, 19, 23, 3, 36, 45, 49, 9)] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/part/10.parquet:.., /testdata/tpch/plan_sf0.02/part/11.parquet:..], [/testdata/tpch/plan_sf0.02/part/15.parquet:.., /testdata/tpch/plan_sf0.02/part/16.parquet:.., /testdata/tpch/plan_sf0.02/part/2.parquet:..], [/testdata/tpch/plan_sf0.02/part/5.parquet:.., /testdata/tpch/plan_sf0.02/part/6.parquet:.., /testdata/tpch/plan_sf0.02/part/7.parquet:..]]}, projection=[p_partkey, p_brand, p_type, p_size], file_type=parquet, predicate=p_brand@3 != Brand#45 AND p_type@4 NOT LIKE MEDIUM POLISHED% AND p_size@5 IN (SET) ([49, 14, 23, 45, 19, 3, 36, 9]), pruning_predicate=p_brand_null_count@2 != row_count@3 AND (p_brand_min@0 != Brand#45 OR Brand#45 != p_brand_max@1) AND p_type_null_count@6 != row_count@3 AND (p_type_min@4 NOT LIKE MEDIUM POLISHED% OR p_type_max@5 NOT LIKE MEDIUM POLISHED%) AND (p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 49 AND 49 <= p_size_max@8 OR p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 14 AND 14 <= p_size_max@8 OR p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 23 AND 23 <= p_size_max@8 OR p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 45 AND 45 <= p_size_max@8 OR p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 19 AND 19 <= p_size_max@8 OR p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 3 AND 3 <= p_size_max@8 OR p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 36 AND 36 <= p_size_max@8 OR p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 9 AND 9 <= p_size_max@8), required_guarantees=[p_brand not in (Brand#45), p_size in (14, 19, 23, 3, 36, 45, 49, 9)] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/part/11.parquet:.., /testdata/tpch/plan_sf0.02/part/12.parquet:..], [/testdata/tpch/plan_sf0.02/part/2.parquet:.., /testdata/tpch/plan_sf0.02/part/3.parquet:..], [/testdata/tpch/plan_sf0.02/part/7.parquet:.., /testdata/tpch/plan_sf0.02/part/8.parquet:..]]}, projection=[p_partkey, p_brand, p_type, p_size], file_type=parquet, predicate=p_brand@3 != Brand#45 AND p_type@4 NOT LIKE MEDIUM POLISHED% AND p_size@5 IN (SET) ([49, 14, 23, 45, 19, 3, 36, 9]), pruning_predicate=p_brand_null_count@2 != row_count@3 AND (p_brand_min@0 != Brand#45 OR Brand#45 != p_brand_max@1) AND p_type_null_count@6 != row_count@3 AND (p_type_min@4 NOT LIKE MEDIUM POLISHED% OR p_type_max@5 NOT LIKE MEDIUM POLISHED%) AND (p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 49 AND 49 <= p_size_max@8 OR p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 14 AND 14 <= p_size_max@8 OR p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 23 AND 23 <= p_size_max@8 OR p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 45 AND 45 <= p_size_max@8 OR p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 19 AND 19 <= p_size_max@8 OR p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 3 AND 3 <= p_size_max@8 OR p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 36 AND 36 <= p_size_max@8 OR p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 9 AND 9 <= p_size_max@8), required_guarantees=[p_brand not in (Brand#45), p_size in (14, 19, 23, 3, 36, 45, 49, 9)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/part/12.parquet:.., /testdata/tpch/plan_sf0.02/part/13.parquet:.., /testdata/tpch/plan_sf0.02/part/14.parquet:..], [/testdata/tpch/plan_sf0.02/part/3.parquet:.., /testdata/tpch/plan_sf0.02/part/4.parquet:..], [/testdata/tpch/plan_sf0.02/part/8.parquet:.., /testdata/tpch/plan_sf0.02/part/9.parquet:..]]}, projection=[p_partkey, p_brand, p_type, p_size], file_type=parquet, predicate=p_brand@3 != Brand#45 AND p_type@4 NOT LIKE MEDIUM POLISHED% AND p_size@5 IN (SET) ([49, 14, 23, 45, 19, 3, 36, 9]), pruning_predicate=p_brand_null_count@2 != row_count@3 AND (p_brand_min@0 != Brand#45 OR Brand#45 != p_brand_max@1) AND p_type_null_count@6 != row_count@3 AND (p_type_min@4 NOT LIKE MEDIUM POLISHED% OR p_type_max@5 NOT LIKE MEDIUM POLISHED%) AND (p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 49 AND 49 <= p_size_max@8 OR p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 14 AND 14 <= p_size_max@8 OR p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 23 AND 23 <= p_size_max@8 OR p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 45 AND 45 <= p_size_max@8 OR p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 19 AND 19 <= p_size_max@8 OR p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 3 AND 3 <= p_size_max@8 OR p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 36 AND 36 <= p_size_max@8 OR p_size_null_count@9 != row_count@3 AND p_size_min@7 <= 9 AND 9 <= p_size_max@8), required_guarantees=[p_brand not in (Brand#45), p_size in (14, 19, 23, 3, 36, 45, 49, 9)] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/part/1.parquet:.., /testdata/tpch/plan_sf0.02/part/10.parquet:..], [/testdata/tpch/plan_sf0.02/part/14.parquet:.., /testdata/tpch/plan_sf0.02/part/15.parquet:..], [/testdata/tpch/plan_sf0.02/part/4.parquet:.., /testdata/tpch/plan_sf0.02/part/5.parquet:..]]}, projection=[p_partkey, p_brand, p_type, p_size], file_type=parquet, predicate=p_brand@3 != Brand#45 AND p_size@5 IN (SET) ([49, 14, 23, 45, 19, 3, 36, 9]) AND p_type@4 NOT LIKE MEDIUM POLISHED%, pruning_predicate=p_brand_null_count@2 != row_count@3 AND (p_brand_min@0 != Brand#45 OR Brand#45 != p_brand_max@1) AND (p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 49 AND 49 <= p_size_max@5 OR p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 14 AND 14 <= p_size_max@5 OR p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 23 AND 23 <= p_size_max@5 OR p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 45 AND 45 <= p_size_max@5 OR p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 19 AND 19 <= p_size_max@5 OR p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 3 AND 3 <= p_size_max@5 OR p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 36 AND 36 <= p_size_max@5 OR p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 9 AND 9 <= p_size_max@5) AND p_type_null_count@9 != row_count@3 AND (p_type_min@7 NOT LIKE MEDIUM POLISHED% OR p_type_max@8 NOT LIKE MEDIUM POLISHED%), required_guarantees=[p_brand not in (Brand#45), p_size in (14, 19, 23, 3, 36, 45, 49, 9)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/part/10.parquet:.., /testdata/tpch/plan_sf0.02/part/11.parquet:..], [/testdata/tpch/plan_sf0.02/part/15.parquet:.., /testdata/tpch/plan_sf0.02/part/16.parquet:.., /testdata/tpch/plan_sf0.02/part/2.parquet:..], [/testdata/tpch/plan_sf0.02/part/5.parquet:.., /testdata/tpch/plan_sf0.02/part/6.parquet:.., /testdata/tpch/plan_sf0.02/part/7.parquet:..]]}, projection=[p_partkey, p_brand, p_type, p_size], file_type=parquet, predicate=p_brand@3 != Brand#45 AND p_size@5 IN (SET) ([49, 14, 23, 45, 19, 3, 36, 9]) AND p_type@4 NOT LIKE MEDIUM POLISHED%, pruning_predicate=p_brand_null_count@2 != row_count@3 AND (p_brand_min@0 != Brand#45 OR Brand#45 != p_brand_max@1) AND (p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 49 AND 49 <= p_size_max@5 OR p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 14 AND 14 <= p_size_max@5 OR p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 23 AND 23 <= p_size_max@5 OR p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 45 AND 45 <= p_size_max@5 OR p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 19 AND 19 <= p_size_max@5 OR p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 3 AND 3 <= p_size_max@5 OR p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 36 AND 36 <= p_size_max@5 OR p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 9 AND 9 <= p_size_max@5) AND p_type_null_count@9 != row_count@3 AND (p_type_min@7 NOT LIKE MEDIUM POLISHED% OR p_type_max@8 NOT LIKE MEDIUM POLISHED%), required_guarantees=[p_brand not in (Brand#45), p_size in (14, 19, 23, 3, 36, 45, 49, 9)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/part/11.parquet:.., /testdata/tpch/plan_sf0.02/part/12.parquet:..], [/testdata/tpch/plan_sf0.02/part/2.parquet:.., /testdata/tpch/plan_sf0.02/part/3.parquet:..], [/testdata/tpch/plan_sf0.02/part/7.parquet:.., /testdata/tpch/plan_sf0.02/part/8.parquet:..]]}, projection=[p_partkey, p_brand, p_type, p_size], file_type=parquet, predicate=p_brand@3 != Brand#45 AND p_size@5 IN (SET) ([49, 14, 23, 45, 19, 3, 36, 9]) AND p_type@4 NOT LIKE MEDIUM POLISHED%, pruning_predicate=p_brand_null_count@2 != row_count@3 AND (p_brand_min@0 != Brand#45 OR Brand#45 != p_brand_max@1) AND (p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 49 AND 49 <= p_size_max@5 OR p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 14 AND 14 <= p_size_max@5 OR p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 23 AND 23 <= p_size_max@5 OR p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 45 AND 45 <= p_size_max@5 OR p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 19 AND 19 <= p_size_max@5 OR p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 3 AND 3 <= p_size_max@5 OR p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 36 AND 36 <= p_size_max@5 OR p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 9 AND 9 <= p_size_max@5) AND p_type_null_count@9 != row_count@3 AND (p_type_min@7 NOT LIKE MEDIUM POLISHED% OR p_type_max@8 NOT LIKE MEDIUM POLISHED%), required_guarantees=[p_brand not in (Brand#45), p_size in (14, 19, 23, 3, 36, 45, 49, 9)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/part/12.parquet:.., /testdata/tpch/plan_sf0.02/part/13.parquet:.., /testdata/tpch/plan_sf0.02/part/14.parquet:..], [/testdata/tpch/plan_sf0.02/part/3.parquet:.., /testdata/tpch/plan_sf0.02/part/4.parquet:..], [/testdata/tpch/plan_sf0.02/part/8.parquet:.., /testdata/tpch/plan_sf0.02/part/9.parquet:..]]}, projection=[p_partkey, p_brand, p_type, p_size], file_type=parquet, predicate=p_brand@3 != Brand#45 AND p_size@5 IN (SET) ([49, 14, 23, 45, 19, 3, 36, 9]) AND p_type@4 NOT LIKE MEDIUM POLISHED%, pruning_predicate=p_brand_null_count@2 != row_count@3 AND (p_brand_min@0 != Brand#45 OR Brand#45 != p_brand_max@1) AND (p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 49 AND 49 <= p_size_max@5 OR p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 14 AND 14 <= p_size_max@5 OR p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 23 AND 23 <= p_size_max@5 OR p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 45 AND 45 <= p_size_max@5 OR p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 19 AND 19 <= p_size_max@5 OR p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 3 AND 3 <= p_size_max@5 OR p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 36 AND 36 <= p_size_max@5 OR p_size_null_count@6 != row_count@3 AND p_size_min@4 <= 9 AND 9 <= p_size_max@5) AND p_type_null_count@9 != row_count@3 AND (p_type_min@7 NOT LIKE MEDIUM POLISHED% OR p_type_max@8 NOT LIKE MEDIUM POLISHED%), required_guarantees=[p_brand not in (Brand#45), p_size in (14, 19, 23, 3, 36, 45, 49, 9)] └────────────────────────────────────────────────── "); Ok(()) @@ -1028,51 +1009,47 @@ mod tests { #[tokio::test] async fn test_tpch_17() -> Result<(), Box> { let plan = test_tpch_query("q17").await?; - assert_snapshot!(plan, @r" + assert_snapshot!(plan, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ ProjectionExec: expr=[CAST(sum(lineitem.l_extendedprice)@0 AS Float64) / 7 as avg_yearly] │ AggregateExec: mode=Final, gby=[], aggr=[sum(lineitem.l_extendedprice)] │ CoalescePartitionsExec - │ [Stage 4] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 + │ AggregateExec: mode=Partial, gby=[], aggr=[sum(lineitem.l_extendedprice)] + │ HashJoinExec: mode=CollectLeft, join_type=LeftSemi, on=[(p_partkey@2, l_partkey@1)], filter=CAST(l_quantity@0 AS Decimal128(30, 15)) < Float64(0.2) * avg(lineitem.l_quantity)@1, projection=[l_extendedprice@1] + │ CoalescePartitionsExec + │ [Stage 2] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 + │ ProjectionExec: expr=[CAST(0.2 * CAST(avg(lineitem.l_quantity)@1 AS Float64) AS Decimal128(30, 15)) as Float64(0.2) * avg(lineitem.l_quantity), l_partkey@0 as l_partkey] + │ AggregateExec: mode=FinalPartitioned, gby=[l_partkey@0 as l_partkey], aggr=[avg(lineitem.l_quantity)] + │ [Stage 3] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── - ┌───── Stage 4 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] - │ AggregateExec: mode=Partial, gby=[], aggr=[sum(lineitem.l_extendedprice)] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(p_partkey@2, l_partkey@1)], filter=CAST(l_quantity@0 AS Decimal128(30, 15)) < Float64(0.2) * avg(lineitem.l_quantity)@1, projection=[l_extendedprice@1] - │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ ProjectionExec: expr=[CAST(0.2 * CAST(avg(lineitem.l_quantity)@1 AS Float64) AS Decimal128(30, 15)) as Float64(0.2) * avg(lineitem.l_quantity), l_partkey@0 as l_partkey] - │ AggregateExec: mode=FinalPartitioned, gby=[l_partkey@0 as l_partkey], aggr=[avg(lineitem.l_quantity)] - │ [Stage 3] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + ┌───── Stage 2 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(p_partkey@0, l_partkey@0)], projection=[l_quantity@2, l_extendedprice@3, p_partkey@0] + │ CoalescePartitionsExec + │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(p_partkey@0, l_partkey@0)], projection=[l_quantity@2, l_extendedprice@3, p_partkey@0] - │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice], file_type=parquet, predicate=DynamicFilter [ empty ] - └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: p_brand@1 = Brand#23 AND p_container@2 = MED BOX, projection=[p_partkey@0] - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/part/1.parquet:.., /testdata/tpch/plan_sf0.02/part/10.parquet:..], [/testdata/tpch/plan_sf0.02/part/14.parquet:.., /testdata/tpch/plan_sf0.02/part/15.parquet:..], [/testdata/tpch/plan_sf0.02/part/4.parquet:.., /testdata/tpch/plan_sf0.02/part/5.parquet:..]]}, projection=[p_partkey, p_brand, p_container], file_type=parquet, predicate=p_brand@3 = Brand#23 AND p_container@6 = MED BOX, pruning_predicate=p_brand_null_count@2 != row_count@3 AND p_brand_min@0 <= Brand#23 AND Brand#23 <= p_brand_max@1 AND p_container_null_count@6 != row_count@3 AND p_container_min@4 <= MED BOX AND MED BOX <= p_container_max@5, required_guarantees=[p_brand in (Brand#23), p_container in (MED BOX)] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/part/10.parquet:.., /testdata/tpch/plan_sf0.02/part/11.parquet:..], [/testdata/tpch/plan_sf0.02/part/15.parquet:.., /testdata/tpch/plan_sf0.02/part/16.parquet:.., /testdata/tpch/plan_sf0.02/part/2.parquet:..], [/testdata/tpch/plan_sf0.02/part/5.parquet:.., /testdata/tpch/plan_sf0.02/part/6.parquet:.., /testdata/tpch/plan_sf0.02/part/7.parquet:..]]}, projection=[p_partkey, p_brand, p_container], file_type=parquet, predicate=p_brand@3 = Brand#23 AND p_container@6 = MED BOX, pruning_predicate=p_brand_null_count@2 != row_count@3 AND p_brand_min@0 <= Brand#23 AND Brand#23 <= p_brand_max@1 AND p_container_null_count@6 != row_count@3 AND p_container_min@4 <= MED BOX AND MED BOX <= p_container_max@5, required_guarantees=[p_brand in (Brand#23), p_container in (MED BOX)] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/part/11.parquet:.., /testdata/tpch/plan_sf0.02/part/12.parquet:..], [/testdata/tpch/plan_sf0.02/part/2.parquet:.., /testdata/tpch/plan_sf0.02/part/3.parquet:..], [/testdata/tpch/plan_sf0.02/part/7.parquet:.., /testdata/tpch/plan_sf0.02/part/8.parquet:..]]}, projection=[p_partkey, p_brand, p_container], file_type=parquet, predicate=p_brand@3 = Brand#23 AND p_container@6 = MED BOX, pruning_predicate=p_brand_null_count@2 != row_count@3 AND p_brand_min@0 <= Brand#23 AND Brand#23 <= p_brand_max@1 AND p_container_null_count@6 != row_count@3 AND p_container_min@4 <= MED BOX AND MED BOX <= p_container_max@5, required_guarantees=[p_brand in (Brand#23), p_container in (MED BOX)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/part/12.parquet:.., /testdata/tpch/plan_sf0.02/part/13.parquet:.., /testdata/tpch/plan_sf0.02/part/14.parquet:..], [/testdata/tpch/plan_sf0.02/part/3.parquet:.., /testdata/tpch/plan_sf0.02/part/4.parquet:..], [/testdata/tpch/plan_sf0.02/part/8.parquet:.., /testdata/tpch/plan_sf0.02/part/9.parquet:..]]}, projection=[p_partkey, p_brand, p_container], file_type=parquet, predicate=p_brand@3 = Brand#23 AND p_container@6 = MED BOX, pruning_predicate=p_brand_null_count@2 != row_count@3 AND p_brand_min@0 <= Brand#23 AND Brand#23 <= p_brand_max@1 AND p_container_null_count@6 != row_count@3 AND p_container_min@4 <= MED BOX AND MED BOX <= p_container_max@5, required_guarantees=[p_brand in (Brand#23), p_container in (MED BOX)] - └────────────────────────────────────────────────── - ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] - │ RepartitionExec: partitioning=Hash([l_partkey@0], 12), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[l_partkey@0 as l_partkey], aggr=[avg(lineitem.l_quantity)] + │ FilterExec: p_brand@1 = Brand#23 AND p_container@2 = MED BOX, projection=[p_partkey@0] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_partkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_partkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_partkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_partkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/part/1.parquet:.., /testdata/tpch/plan_sf0.02/part/10.parquet:..], [/testdata/tpch/plan_sf0.02/part/14.parquet:.., /testdata/tpch/plan_sf0.02/part/15.parquet:..], [/testdata/tpch/plan_sf0.02/part/4.parquet:.., /testdata/tpch/plan_sf0.02/part/5.parquet:..]]}, projection=[p_partkey, p_brand, p_container], file_type=parquet, predicate=p_brand@3 = Brand#23 AND p_container@6 = MED BOX, pruning_predicate=p_brand_null_count@2 != row_count@3 AND p_brand_min@0 <= Brand#23 AND Brand#23 <= p_brand_max@1 AND p_container_null_count@6 != row_count@3 AND p_container_min@4 <= MED BOX AND MED BOX <= p_container_max@5, required_guarantees=[p_brand in (Brand#23), p_container in (MED BOX)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/part/10.parquet:.., /testdata/tpch/plan_sf0.02/part/11.parquet:..], [/testdata/tpch/plan_sf0.02/part/15.parquet:.., /testdata/tpch/plan_sf0.02/part/16.parquet:.., /testdata/tpch/plan_sf0.02/part/2.parquet:..], [/testdata/tpch/plan_sf0.02/part/5.parquet:.., /testdata/tpch/plan_sf0.02/part/6.parquet:.., /testdata/tpch/plan_sf0.02/part/7.parquet:..]]}, projection=[p_partkey, p_brand, p_container], file_type=parquet, predicate=p_brand@3 = Brand#23 AND p_container@6 = MED BOX, pruning_predicate=p_brand_null_count@2 != row_count@3 AND p_brand_min@0 <= Brand#23 AND Brand#23 <= p_brand_max@1 AND p_container_null_count@6 != row_count@3 AND p_container_min@4 <= MED BOX AND MED BOX <= p_container_max@5, required_guarantees=[p_brand in (Brand#23), p_container in (MED BOX)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/part/11.parquet:.., /testdata/tpch/plan_sf0.02/part/12.parquet:..], [/testdata/tpch/plan_sf0.02/part/2.parquet:.., /testdata/tpch/plan_sf0.02/part/3.parquet:..], [/testdata/tpch/plan_sf0.02/part/7.parquet:.., /testdata/tpch/plan_sf0.02/part/8.parquet:..]]}, projection=[p_partkey, p_brand, p_container], file_type=parquet, predicate=p_brand@3 = Brand#23 AND p_container@6 = MED BOX, pruning_predicate=p_brand_null_count@2 != row_count@3 AND p_brand_min@0 <= Brand#23 AND Brand#23 <= p_brand_max@1 AND p_container_null_count@6 != row_count@3 AND p_container_min@4 <= MED BOX AND MED BOX <= p_container_max@5, required_guarantees=[p_brand in (Brand#23), p_container in (MED BOX)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/part/12.parquet:.., /testdata/tpch/plan_sf0.02/part/13.parquet:.., /testdata/tpch/plan_sf0.02/part/14.parquet:..], [/testdata/tpch/plan_sf0.02/part/3.parquet:.., /testdata/tpch/plan_sf0.02/part/4.parquet:..], [/testdata/tpch/plan_sf0.02/part/8.parquet:.., /testdata/tpch/plan_sf0.02/part/9.parquet:..]]}, projection=[p_partkey, p_brand, p_container], file_type=parquet, predicate=p_brand@3 = Brand#23 AND p_container@6 = MED BOX, pruning_predicate=p_brand_null_count@2 != row_count@3 AND p_brand_min@0 <= Brand#23 AND Brand#23 <= p_brand_max@1 AND p_container_null_count@6 != row_count@3 AND p_container_min@4 <= MED BOX AND MED BOX <= p_container_max@5, required_guarantees=[p_brand in (Brand#23), p_container in (MED BOX)] └────────────────────────────────────────────────── + ┌───── Stage 3 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] + │ RepartitionExec: partitioning=Hash([l_partkey@0], 3), input_partitions=3 + │ AggregateExec: mode=Partial, gby=[l_partkey@0 as l_partkey], aggr=[avg(lineitem.l_quantity)] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_partkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_partkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_partkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_partkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] + └────────────────────────────────────────────────── "); Ok(()) } @@ -1080,7 +1057,7 @@ mod tests { #[tokio::test] async fn test_tpch_18() -> Result<(), Box> { let plan = test_tpch_query("q18").await?; - assert_snapshot!(plan, @r" + assert_snapshot!(plan, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [o_totalprice@4 DESC, o_orderdate@3 ASC NULLS LAST] │ [Stage 6] => NetworkCoalesceExec: output_partitions=9, input_tasks=3 @@ -1103,11 +1080,11 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_orderkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_orderkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_orderkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: sum(lineitem.l_quantity)@1 > Some(30000),25,2, projection=[l_orderkey@0] + │ FilterExec: sum(lineitem.l_quantity)@1 > 300.00, projection=[l_orderkey@0] │ AggregateExec: mode=FinalPartitioned, gby=[l_orderkey@0 as l_orderkey], aggr=[sum(lineitem.l_quantity)] │ [Stage 1] => NetworkShuffleExec: output_partitions=3, input_tasks=4 └────────────────────────────────────────────────── @@ -1118,7 +1095,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_orderkey, l_quantity], file_type=parquet │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_orderkey, l_quantity], file_type=parquet │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_orderkey, l_quantity], file_type=parquet - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_quantity], file_type=parquet + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_quantity], file_type=parquet └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1129,7 +1106,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:..], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:..], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:..]]}, projection=[o_orderkey, o_custkey, o_totalprice, o_orderdate], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:..], [/testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:..], [/testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:..]]}, projection=[o_orderkey, o_custkey, o_totalprice, o_orderdate], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:..], [/testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:..], [/testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:..]]}, projection=[o_orderkey, o_custkey, o_totalprice, o_orderdate], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_custkey, o_totalprice, o_orderdate], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_custkey, o_totalprice, o_orderdate], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1146,24 +1123,24 @@ mod tests { #[tokio::test] async fn test_tpch_19() -> Result<(), Box> { let plan = test_tpch_query("q19").await?; - assert_snapshot!(plan, @r" + assert_snapshot!(plan, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ ProjectionExec: expr=[sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)@0 as revenue] - │ AggregateExec: mode=Final, gby=[], aggr=[sum(lineitem.l_extendedprice * Some(1),20,0 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] + │ AggregateExec: mode=Final, gby=[], aggr=[sum(lineitem.l_extendedprice * 1 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] │ CoalescePartitionsExec │ [Stage 2] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] - │ AggregateExec: mode=Partial, gby=[], aggr=[sum(lineitem.l_extendedprice * Some(1),20,0 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(p_partkey@0, l_partkey@0)], filter=p_brand@1 = Brand#12 AND p_container@3 IN (SET) ([SM CASE, SM BOX, SM PACK, SM PKG]) AND l_quantity@0 >= Some(100),15,2 AND l_quantity@0 <= Some(1100),15,2 AND p_size@2 <= 5 OR p_brand@1 = Brand#23 AND p_container@3 IN (SET) ([MED BAG, MED BOX, MED PKG, MED PACK]) AND l_quantity@0 >= Some(1000),15,2 AND l_quantity@0 <= Some(2000),15,2 AND p_size@2 <= 10 OR p_brand@1 = Brand#34 AND p_container@3 IN (SET) ([LG CASE, LG BOX, LG PACK, LG PKG]) AND l_quantity@0 >= Some(2000),15,2 AND l_quantity@0 <= Some(3000),15,2 AND p_size@2 <= 15, projection=[l_extendedprice@6, l_discount@7] + │ AggregateExec: mode=Partial, gby=[], aggr=[sum(lineitem.l_extendedprice * 1 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(p_partkey@0, l_partkey@0)], filter=p_brand@1 = Brand#12 AND p_container@3 IN (SET) ([SM CASE, SM BOX, SM PACK, SM PKG]) AND l_quantity@0 >= 1.00 AND l_quantity@0 <= 11.00 AND p_size@2 <= 5 OR p_brand@1 = Brand#23 AND p_container@3 IN (SET) ([MED BAG, MED BOX, MED PKG, MED PACK]) AND l_quantity@0 >= 10.00 AND l_quantity@0 <= 20.00 AND p_size@2 <= 10 OR p_brand@1 = Brand#34 AND p_container@3 IN (SET) ([LG CASE, LG BOX, LG PACK, LG PKG]) AND l_quantity@0 >= 20.00 AND l_quantity@0 <= 30.00 AND p_size@2 <= 15, projection=[l_extendedprice@6, l_discount@7] │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ FilterExec: (l_shipmode@5 = AIR OR l_shipmode@5 = AIR REG) AND l_shipinstruct@4 = DELIVER IN PERSON AND (l_quantity@1 >= Some(100),15,2 AND l_quantity@1 <= Some(1100),15,2 OR l_quantity@1 >= Some(1000),15,2 AND l_quantity@1 <= Some(2000),15,2 OR l_quantity@1 >= Some(2000),15,2 AND l_quantity@1 <= Some(3000),15,2), projection=[l_partkey@0, l_quantity@1, l_extendedprice@2, l_discount@3] + │ FilterExec: (l_shipmode@5 = AIR OR l_shipmode@5 = AIR REG) AND l_shipinstruct@4 = DELIVER IN PERSON AND (l_quantity@1 >= 1.00 AND l_quantity@1 <= 11.00 OR l_quantity@1 >= 10.00 AND l_quantity@1 <= 20.00 OR l_quantity@1 >= 20.00 AND l_quantity@1 <= 30.00), projection=[l_partkey@0, l_quantity@1, l_extendedprice@2, l_discount@3] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice, l_discount, l_shipinstruct, l_shipmode], file_type=parquet, predicate=(l_shipmode@14 = AIR OR l_shipmode@14 = AIR REG) AND l_shipinstruct@13 = DELIVER IN PERSON AND (l_quantity@4 >= Some(100),15,2 AND l_quantity@4 <= Some(1100),15,2 OR l_quantity@4 >= Some(1000),15,2 AND l_quantity@4 <= Some(2000),15,2 OR l_quantity@4 >= Some(2000),15,2 AND l_quantity@4 <= Some(3000),15,2) AND DynamicFilter [ empty ], pruning_predicate=(l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR AND AIR <= l_shipmode_max@1 OR l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR REG AND AIR REG <= l_shipmode_max@1) AND l_shipinstruct_null_count@6 != row_count@3 AND l_shipinstruct_min@4 <= DELIVER IN PERSON AND DELIVER IN PERSON <= l_shipinstruct_max@5 AND (l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= Some(100),15,2 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= Some(1100),15,2 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= Some(1000),15,2 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= Some(2000),15,2 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= Some(2000),15,2 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= Some(3000),15,2), required_guarantees=[l_shipinstruct in (DELIVER IN PERSON), l_shipmode in (AIR, AIR REG)] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice, l_discount, l_shipinstruct, l_shipmode], file_type=parquet, predicate=(l_shipmode@14 = AIR OR l_shipmode@14 = AIR REG) AND l_shipinstruct@13 = DELIVER IN PERSON AND (l_quantity@4 >= Some(100),15,2 AND l_quantity@4 <= Some(1100),15,2 OR l_quantity@4 >= Some(1000),15,2 AND l_quantity@4 <= Some(2000),15,2 OR l_quantity@4 >= Some(2000),15,2 AND l_quantity@4 <= Some(3000),15,2) AND DynamicFilter [ empty ], pruning_predicate=(l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR AND AIR <= l_shipmode_max@1 OR l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR REG AND AIR REG <= l_shipmode_max@1) AND l_shipinstruct_null_count@6 != row_count@3 AND l_shipinstruct_min@4 <= DELIVER IN PERSON AND DELIVER IN PERSON <= l_shipinstruct_max@5 AND (l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= Some(100),15,2 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= Some(1100),15,2 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= Some(1000),15,2 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= Some(2000),15,2 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= Some(2000),15,2 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= Some(3000),15,2), required_guarantees=[l_shipinstruct in (DELIVER IN PERSON), l_shipmode in (AIR, AIR REG)] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice, l_discount, l_shipinstruct, l_shipmode], file_type=parquet, predicate=(l_shipmode@14 = AIR OR l_shipmode@14 = AIR REG) AND l_shipinstruct@13 = DELIVER IN PERSON AND (l_quantity@4 >= Some(100),15,2 AND l_quantity@4 <= Some(1100),15,2 OR l_quantity@4 >= Some(1000),15,2 AND l_quantity@4 <= Some(2000),15,2 OR l_quantity@4 >= Some(2000),15,2 AND l_quantity@4 <= Some(3000),15,2) AND DynamicFilter [ empty ], pruning_predicate=(l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR AND AIR <= l_shipmode_max@1 OR l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR REG AND AIR REG <= l_shipmode_max@1) AND l_shipinstruct_null_count@6 != row_count@3 AND l_shipinstruct_min@4 <= DELIVER IN PERSON AND DELIVER IN PERSON <= l_shipinstruct_max@5 AND (l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= Some(100),15,2 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= Some(1100),15,2 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= Some(1000),15,2 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= Some(2000),15,2 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= Some(2000),15,2 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= Some(3000),15,2), required_guarantees=[l_shipinstruct in (DELIVER IN PERSON), l_shipmode in (AIR, AIR REG)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice, l_discount, l_shipinstruct, l_shipmode], file_type=parquet, predicate=(l_shipmode@14 = AIR OR l_shipmode@14 = AIR REG) AND l_shipinstruct@13 = DELIVER IN PERSON AND (l_quantity@4 >= Some(100),15,2 AND l_quantity@4 <= Some(1100),15,2 OR l_quantity@4 >= Some(1000),15,2 AND l_quantity@4 <= Some(2000),15,2 OR l_quantity@4 >= Some(2000),15,2 AND l_quantity@4 <= Some(3000),15,2) AND DynamicFilter [ empty ], pruning_predicate=(l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR AND AIR <= l_shipmode_max@1 OR l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR REG AND AIR REG <= l_shipmode_max@1) AND l_shipinstruct_null_count@6 != row_count@3 AND l_shipinstruct_min@4 <= DELIVER IN PERSON AND DELIVER IN PERSON <= l_shipinstruct_max@5 AND (l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= Some(100),15,2 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= Some(1100),15,2 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= Some(1000),15,2 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= Some(2000),15,2 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= Some(2000),15,2 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= Some(3000),15,2), required_guarantees=[l_shipinstruct in (DELIVER IN PERSON), l_shipmode in (AIR, AIR REG)] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice, l_discount, l_shipinstruct, l_shipmode], file_type=parquet, predicate=(l_shipmode@14 = AIR OR l_shipmode@14 = AIR REG) AND l_shipinstruct@13 = DELIVER IN PERSON AND (l_quantity@4 >= 1.00 AND l_quantity@4 <= 11.00 OR l_quantity@4 >= 10.00 AND l_quantity@4 <= 20.00 OR l_quantity@4 >= 20.00 AND l_quantity@4 <= 30.00) AND DynamicFilter [ empty ], pruning_predicate=(l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR AND AIR <= l_shipmode_max@1 OR l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR REG AND AIR REG <= l_shipmode_max@1) AND l_shipinstruct_null_count@6 != row_count@3 AND l_shipinstruct_min@4 <= DELIVER IN PERSON AND DELIVER IN PERSON <= l_shipinstruct_max@5 AND (l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 1.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 11.00 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 10.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 20.00 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 20.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 30.00), required_guarantees=[l_shipinstruct in (DELIVER IN PERSON), l_shipmode in (AIR, AIR REG)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice, l_discount, l_shipinstruct, l_shipmode], file_type=parquet, predicate=(l_shipmode@14 = AIR OR l_shipmode@14 = AIR REG) AND l_shipinstruct@13 = DELIVER IN PERSON AND (l_quantity@4 >= 1.00 AND l_quantity@4 <= 11.00 OR l_quantity@4 >= 10.00 AND l_quantity@4 <= 20.00 OR l_quantity@4 >= 20.00 AND l_quantity@4 <= 30.00) AND DynamicFilter [ empty ], pruning_predicate=(l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR AND AIR <= l_shipmode_max@1 OR l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR REG AND AIR REG <= l_shipmode_max@1) AND l_shipinstruct_null_count@6 != row_count@3 AND l_shipinstruct_min@4 <= DELIVER IN PERSON AND DELIVER IN PERSON <= l_shipinstruct_max@5 AND (l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 1.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 11.00 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 10.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 20.00 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 20.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 30.00), required_guarantees=[l_shipinstruct in (DELIVER IN PERSON), l_shipmode in (AIR, AIR REG)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice, l_discount, l_shipinstruct, l_shipmode], file_type=parquet, predicate=(l_shipmode@14 = AIR OR l_shipmode@14 = AIR REG) AND l_shipinstruct@13 = DELIVER IN PERSON AND (l_quantity@4 >= 1.00 AND l_quantity@4 <= 11.00 OR l_quantity@4 >= 10.00 AND l_quantity@4 <= 20.00 OR l_quantity@4 >= 20.00 AND l_quantity@4 <= 30.00) AND DynamicFilter [ empty ], pruning_predicate=(l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR AND AIR <= l_shipmode_max@1 OR l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR REG AND AIR REG <= l_shipmode_max@1) AND l_shipinstruct_null_count@6 != row_count@3 AND l_shipinstruct_min@4 <= DELIVER IN PERSON AND DELIVER IN PERSON <= l_shipinstruct_max@5 AND (l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 1.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 11.00 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 10.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 20.00 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 20.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 30.00), required_guarantees=[l_shipinstruct in (DELIVER IN PERSON), l_shipmode in (AIR, AIR REG)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice, l_discount, l_shipinstruct, l_shipmode], file_type=parquet, predicate=(l_shipmode@14 = AIR OR l_shipmode@14 = AIR REG) AND l_shipinstruct@13 = DELIVER IN PERSON AND (l_quantity@4 >= 1.00 AND l_quantity@4 <= 11.00 OR l_quantity@4 >= 10.00 AND l_quantity@4 <= 20.00 OR l_quantity@4 >= 20.00 AND l_quantity@4 <= 30.00) AND DynamicFilter [ empty ], pruning_predicate=(l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR AND AIR <= l_shipmode_max@1 OR l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR REG AND AIR REG <= l_shipmode_max@1) AND l_shipinstruct_null_count@6 != row_count@3 AND l_shipinstruct_min@4 <= DELIVER IN PERSON AND DELIVER IN PERSON <= l_shipinstruct_max@5 AND (l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 1.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 11.00 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 10.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 20.00 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 20.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 30.00), required_guarantees=[l_shipinstruct in (DELIVER IN PERSON), l_shipmode in (AIR, AIR REG)] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1181,16 +1158,16 @@ mod tests { #[tokio::test] async fn test_tpch_20() -> Result<(), Box> { let plan = test_tpch_query("q20").await?; - assert_snapshot!(plan, @r" + assert_snapshot!(plan, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [s_name@0 ASC NULLS LAST] │ SortExec: expr=[s_name@0 ASC NULLS LAST], preserve_partitioning=[true] │ HashJoinExec: mode=CollectLeft, join_type=LeftSemi, on=[(s_suppkey@0, ps_suppkey@0)], projection=[s_name@1, s_address@2] │ CoalescePartitionsExec │ [Stage 2] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(ps_partkey@0, l_partkey@1), (ps_suppkey@1, l_suppkey@2)], filter=CAST(ps_availqty@0 AS Float64) > Float64(0.5) * sum(lineitem.l_quantity)@1, projection=[ps_suppkey@1] + │ HashJoinExec: mode=CollectLeft, join_type=LeftSemi, on=[(ps_partkey@0, l_partkey@1), (ps_suppkey@1, l_suppkey@2)], filter=CAST(ps_availqty@0 AS Float64) > Float64(0.5) * sum(lineitem.l_quantity)@1, projection=[ps_suppkey@1] │ CoalescePartitionsExec - │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 + │ [Stage 4] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 │ ProjectionExec: expr=[0.5 * CAST(sum(lineitem.l_quantity)@2 AS Float64) as Float64(0.5) * sum(lineitem.l_quantity), l_partkey@0 as l_partkey, l_suppkey@1 as l_suppkey] │ AggregateExec: mode=FinalPartitioned, gby=[l_partkey@0 as l_partkey, l_suppkey@1 as l_suppkey], aggr=[sum(lineitem.l_quantity)] │ [Stage 5] => NetworkShuffleExec: output_partitions=3, input_tasks=4 @@ -1215,15 +1192,14 @@ mod tests { │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/13.parquet:.., /testdata/tpch/plan_sf0.02/nation/14.parquet:..], [/testdata/tpch/plan_sf0.02/nation/3.parquet:.., /testdata/tpch/plan_sf0.02/nation/4.parquet:..], [/testdata/tpch/plan_sf0.02/nation/8.parquet:.., /testdata/tpch/plan_sf0.02/nation/9.parquet:..]]}, projection=[n_nationkey, n_name], file_type=parquet, predicate=n_name@1 = CANADA, pruning_predicate=n_name_null_count@2 != row_count@3 AND n_name_min@0 <= CANADA AND CANADA <= n_name_max@1, required_guarantees=[n_name in (CANADA)] └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] - │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 - │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(p_partkey@0, ps_partkey@0)] - │ CoalescePartitionsExec - │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/1.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/10.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/15.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/5.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/10.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/11.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/15.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/16.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/5.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/6.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/7.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/11.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/12.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/16.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/2.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/3.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/7.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/8.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/12.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/13.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/3.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/8.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/9.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(p_partkey@0, ps_partkey@0)] + │ CoalescePartitionsExec + │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/1.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/10.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/15.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/5.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/10.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/11.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/15.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/16.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/5.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/6.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/7.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/11.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/12.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/16.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/2.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/3.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/7.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/8.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/12.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/13.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/3.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/8.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/9.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1242,7 +1218,7 @@ mod tests { │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_partkey, l_suppkey, l_quantity, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1994-01-01 AND l_shipdate@10 < 1995-01-01 AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1994-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1995-01-01, required_guarantees=[] │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_partkey, l_suppkey, l_quantity, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1994-01-01 AND l_shipdate@10 < 1995-01-01 AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1994-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1995-01-01, required_guarantees=[] │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_partkey, l_suppkey, l_quantity, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1994-01-01 AND l_shipdate@10 < 1995-01-01 AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1994-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1995-01-01, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_partkey, l_suppkey, l_quantity, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1994-01-01 AND l_shipdate@10 < 1995-01-01 AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1994-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1995-01-01, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_partkey, l_suppkey, l_quantity, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1994-01-01 AND l_shipdate@10 < 1995-01-01 AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1994-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1995-01-01, required_guarantees=[] └────────────────────────────────────────────────── "); Ok(()) @@ -1251,68 +1227,84 @@ mod tests { #[tokio::test] async fn test_tpch_21() -> Result<(), Box> { let plan = test_tpch_query("q21").await?; - assert_snapshot!(plan, @r" + assert_snapshot!(plan, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [numwait@1 DESC, s_name@0 ASC NULLS LAST] - │ SortExec: expr=[numwait@1 DESC, s_name@0 ASC NULLS LAST], preserve_partitioning=[true] - │ ProjectionExec: expr=[s_name@0 as s_name, count(Int64(1))@1 as numwait] - │ AggregateExec: mode=FinalPartitioned, gby=[s_name@0 as s_name], aggr=[count(Int64(1))] - │ RepartitionExec: partitioning=Hash([s_name@0], 3), input_partitions=3 - │ AggregateExec: mode=Partial, gby=[s_name@0 as s_name], aggr=[count(Int64(1))] - │ HashJoinExec: mode=CollectLeft, join_type=LeftAnti, on=[(l_orderkey@1, l_orderkey@0)], filter=l_suppkey@1 != l_suppkey@0, projection=[s_name@0] - │ CoalescePartitionsExec - │ HashJoinExec: mode=CollectLeft, join_type=LeftSemi, on=[(l_orderkey@1, l_orderkey@0)], filter=l_suppkey@1 != l_suppkey@0 - │ CoalescePartitionsExec - │ [Stage 4] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., ...], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., ...], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., ...]]}, projection=[l_orderkey, l_suppkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ FilterExec: l_receiptdate@3 > l_commitdate@2, projection=[l_orderkey@0, l_suppkey@1] - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., ...], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., ...], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., ...]]}, projection=[l_orderkey, l_suppkey, l_commitdate, l_receiptdate], file_type=parquet, predicate=l_receiptdate@12 > l_commitdate@11 AND DynamicFilter [ empty ] + │ [Stage 8] => NetworkCoalesceExec: output_partitions=6, input_tasks=2 └────────────────────────────────────────────────── - ┌───── Stage 4 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(n_nationkey@0, s_nationkey@1)], projection=[s_name@1, l_orderkey@3, l_suppkey@4] - │ CoalescePartitionsExec - │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(o_orderkey@0, l_orderkey@2)], projection=[s_name@1, s_nationkey@2, l_orderkey@3, l_suppkey@4] - │ CoalescePartitionsExec - │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(s_suppkey@0, l_suppkey@1)], projection=[s_name@1, s_nationkey@2, l_orderkey@3, l_suppkey@4] - │ CoalescePartitionsExec - │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 - │ FilterExec: l_receiptdate@3 > l_commitdate@2, projection=[l_orderkey@0, l_suppkey@1] - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_commitdate, l_receiptdate], file_type=parquet, predicate=l_receiptdate@12 > l_commitdate@11 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_commitdate, l_receiptdate], file_type=parquet, predicate=l_receiptdate@12 > l_commitdate@11 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_commitdate, l_receiptdate], file_type=parquet, predicate=l_receiptdate@12 > l_commitdate@11 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_commitdate, l_receiptdate], file_type=parquet, predicate=l_receiptdate@12 > l_commitdate@11 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + ┌───── Stage 8 ── Tasks: t0:[p0..p2] t1:[p0..p2] + │ SortExec: expr=[numwait@1 DESC, s_name@0 ASC NULLS LAST], preserve_partitioning=[true] + │ ProjectionExec: expr=[s_name@0 as s_name, count(Int64(1))@1 as numwait] + │ AggregateExec: mode=FinalPartitioned, gby=[s_name@0 as s_name], aggr=[count(Int64(1))] + │ [Stage 7] => NetworkShuffleExec: output_partitions=3, input_tasks=3 └────────────────────────────────────────────────── - ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: n_name@1 = SAUDI ARABIA, projection=[n_nationkey@0] - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/1.parquet:.., /testdata/tpch/plan_sf0.02/nation/10.parquet:..], [/testdata/tpch/plan_sf0.02/nation/14.parquet:.., /testdata/tpch/plan_sf0.02/nation/15.parquet:..], [/testdata/tpch/plan_sf0.02/nation/4.parquet:.., /testdata/tpch/plan_sf0.02/nation/5.parquet:.., /testdata/tpch/plan_sf0.02/nation/6.parquet:..]]}, projection=[n_nationkey, n_name], file_type=parquet, predicate=n_name@1 = SAUDI ARABIA, pruning_predicate=n_name_null_count@2 != row_count@3 AND n_name_min@0 <= SAUDI ARABIA AND SAUDI ARABIA <= n_name_max@1, required_guarantees=[n_name in (SAUDI ARABIA)] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/10.parquet:.., /testdata/tpch/plan_sf0.02/nation/11.parquet:..], [/testdata/tpch/plan_sf0.02/nation/15.parquet:.., /testdata/tpch/plan_sf0.02/nation/16.parquet:.., /testdata/tpch/plan_sf0.02/nation/2.parquet:..], [/testdata/tpch/plan_sf0.02/nation/6.parquet:.., /testdata/tpch/plan_sf0.02/nation/7.parquet:..]]}, projection=[n_nationkey, n_name], file_type=parquet, predicate=n_name@1 = SAUDI ARABIA, pruning_predicate=n_name_null_count@2 != row_count@3 AND n_name_min@0 <= SAUDI ARABIA AND SAUDI ARABIA <= n_name_max@1, required_guarantees=[n_name in (SAUDI ARABIA)] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/11.parquet:.., /testdata/tpch/plan_sf0.02/nation/12.parquet:.., /testdata/tpch/plan_sf0.02/nation/13.parquet:..], [/testdata/tpch/plan_sf0.02/nation/2.parquet:.., /testdata/tpch/plan_sf0.02/nation/3.parquet:..], [/testdata/tpch/plan_sf0.02/nation/7.parquet:.., /testdata/tpch/plan_sf0.02/nation/8.parquet:..]]}, projection=[n_nationkey, n_name], file_type=parquet, predicate=n_name@1 = SAUDI ARABIA, pruning_predicate=n_name_null_count@2 != row_count@3 AND n_name_min@0 <= SAUDI ARABIA AND SAUDI ARABIA <= n_name_max@1, required_guarantees=[n_name in (SAUDI ARABIA)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/13.parquet:.., /testdata/tpch/plan_sf0.02/nation/14.parquet:..], [/testdata/tpch/plan_sf0.02/nation/3.parquet:.., /testdata/tpch/plan_sf0.02/nation/4.parquet:..], [/testdata/tpch/plan_sf0.02/nation/8.parquet:.., /testdata/tpch/plan_sf0.02/nation/9.parquet:..]]}, projection=[n_nationkey, n_name], file_type=parquet, predicate=n_name@1 = SAUDI ARABIA, pruning_predicate=n_name_null_count@2 != row_count@3 AND n_name_min@0 <= SAUDI ARABIA AND SAUDI ARABIA <= n_name_max@1, required_guarantees=[n_name in (SAUDI ARABIA)] - └────────────────────────────────────────────────── - ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ FilterExec: o_orderstatus@1 = F, projection=[o_orderkey@0] - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:..], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:..], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:..]]}, projection=[o_orderkey, o_orderstatus], file_type=parquet, predicate=o_orderstatus@2 = F, pruning_predicate=o_orderstatus_null_count@2 != row_count@3 AND o_orderstatus_min@0 <= F AND F <= o_orderstatus_max@1, required_guarantees=[o_orderstatus in (F)] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:..], [/testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:..], [/testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:..]]}, projection=[o_orderkey, o_orderstatus], file_type=parquet, predicate=o_orderstatus@2 = F, pruning_predicate=o_orderstatus_null_count@2 != row_count@3 AND o_orderstatus_min@0 <= F AND F <= o_orderstatus_max@1, required_guarantees=[o_orderstatus in (F)] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:..], [/testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:..], [/testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:..]]}, projection=[o_orderkey, o_orderstatus], file_type=parquet, predicate=o_orderstatus@2 = F, pruning_predicate=o_orderstatus_null_count@2 != row_count@3 AND o_orderstatus_min@0 <= F AND F <= o_orderstatus_max@1, required_guarantees=[o_orderstatus in (F)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_orderstatus], file_type=parquet, predicate=o_orderstatus@2 = F, pruning_predicate=o_orderstatus_null_count@2 != row_count@3 AND o_orderstatus_min@0 <= F AND F <= o_orderstatus_max@1, required_guarantees=[o_orderstatus in (F)] - └────────────────────────────────────────────────── - ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] - │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 - │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/1.parquet:.., /testdata/tpch/plan_sf0.02/supplier/10.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/14.parquet:.., /testdata/tpch/plan_sf0.02/supplier/15.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/4.parquet:.., /testdata/tpch/plan_sf0.02/supplier/5.parquet:..]]}, projection=[s_suppkey, s_name, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/10.parquet:.., /testdata/tpch/plan_sf0.02/supplier/11.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/15.parquet:.., /testdata/tpch/plan_sf0.02/supplier/16.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/5.parquet:.., /testdata/tpch/plan_sf0.02/supplier/6.parquet:.., /testdata/tpch/plan_sf0.02/supplier/7.parquet:..]]}, projection=[s_suppkey, s_name, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/11.parquet:.., /testdata/tpch/plan_sf0.02/supplier/12.parquet:.., /testdata/tpch/plan_sf0.02/supplier/13.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/16.parquet:.., /testdata/tpch/plan_sf0.02/supplier/2.parquet:.., /testdata/tpch/plan_sf0.02/supplier/3.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/7.parquet:.., /testdata/tpch/plan_sf0.02/supplier/8.parquet:..]]}, projection=[s_suppkey, s_name, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/13.parquet:.., /testdata/tpch/plan_sf0.02/supplier/14.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/3.parquet:.., /testdata/tpch/plan_sf0.02/supplier/4.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/8.parquet:.., /testdata/tpch/plan_sf0.02/supplier/9.parquet:..]]}, projection=[s_suppkey, s_name, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] + ┌───── Stage 7 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] + │ RepartitionExec: partitioning=Hash([s_name@0], 6), input_partitions=3 + │ AggregateExec: mode=Partial, gby=[s_name@0 as s_name], aggr=[count(Int64(1))] + │ HashJoinExec: mode=Partitioned, join_type=RightAnti, on=[(l_orderkey@0, l_orderkey@1)], filter=l_suppkey@1 != l_suppkey@0, projection=[s_name@0] + │ [Stage 1] => NetworkShuffleExec: output_partitions=3, input_tasks=4 + │ [Stage 6] => NetworkShuffleExec: output_partitions=3, input_tasks=1 └────────────────────────────────────────────────── + ┌───── Stage 1 ── Tasks: t0:[p0..p8] t1:[p0..p8] t2:[p0..p8] t3:[p0..p8] + │ RepartitionExec: partitioning=Hash([l_orderkey@0], 9), input_partitions=3 + │ FilterExec: l_receiptdate@3 > l_commitdate@2, projection=[l_orderkey@0, l_suppkey@1] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_commitdate, l_receiptdate], file_type=parquet, predicate=l_receiptdate@12 > l_commitdate@11 + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_commitdate, l_receiptdate], file_type=parquet, predicate=l_receiptdate@12 > l_commitdate@11 + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_commitdate, l_receiptdate], file_type=parquet, predicate=l_receiptdate@12 > l_commitdate@11 + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_commitdate, l_receiptdate], file_type=parquet, predicate=l_receiptdate@12 > l_commitdate@11 + └────────────────────────────────────────────────── + ┌───── Stage 6 ── Tasks: t0:[p0..p8] + │ RepartitionExec: partitioning=Hash([l_orderkey@1], 9), input_partitions=3 + │ HashJoinExec: mode=CollectLeft, join_type=LeftSemi, on=[(l_orderkey@1, l_orderkey@0)], filter=l_suppkey@1 != l_suppkey@0 + │ CoalescePartitionsExec + │ [Stage 5] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., ...], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., ...], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., ...]]}, projection=[l_orderkey, l_suppkey], file_type=parquet, predicate=DynamicFilter [ empty ] + └────────────────────────────────────────────────── + ┌───── Stage 5 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(n_nationkey@0, s_nationkey@1)], projection=[s_name@1, l_orderkey@3, l_suppkey@4] + │ CoalescePartitionsExec + │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(o_orderkey@0, l_orderkey@2)], projection=[s_name@1, s_nationkey@2, l_orderkey@3, l_suppkey@4] + │ CoalescePartitionsExec + │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(s_suppkey@0, l_suppkey@1)], projection=[s_name@1, s_nationkey@2, l_orderkey@3, l_suppkey@4] + │ CoalescePartitionsExec + │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 + │ FilterExec: l_receiptdate@3 > l_commitdate@2, projection=[l_orderkey@0, l_suppkey@1] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_commitdate, l_receiptdate], file_type=parquet, predicate=l_receiptdate@12 > l_commitdate@11 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_commitdate, l_receiptdate], file_type=parquet, predicate=l_receiptdate@12 > l_commitdate@11 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_commitdate, l_receiptdate], file_type=parquet, predicate=l_receiptdate@12 > l_commitdate@11 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_commitdate, l_receiptdate], file_type=parquet, predicate=l_receiptdate@12 > l_commitdate@11 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + └────────────────────────────────────────────────── + ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ FilterExec: n_name@1 = SAUDI ARABIA, projection=[n_nationkey@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/1.parquet:.., /testdata/tpch/plan_sf0.02/nation/10.parquet:..], [/testdata/tpch/plan_sf0.02/nation/14.parquet:.., /testdata/tpch/plan_sf0.02/nation/15.parquet:..], [/testdata/tpch/plan_sf0.02/nation/4.parquet:.., /testdata/tpch/plan_sf0.02/nation/5.parquet:.., /testdata/tpch/plan_sf0.02/nation/6.parquet:..]]}, projection=[n_nationkey, n_name], file_type=parquet, predicate=n_name@1 = SAUDI ARABIA, pruning_predicate=n_name_null_count@2 != row_count@3 AND n_name_min@0 <= SAUDI ARABIA AND SAUDI ARABIA <= n_name_max@1, required_guarantees=[n_name in (SAUDI ARABIA)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/10.parquet:.., /testdata/tpch/plan_sf0.02/nation/11.parquet:..], [/testdata/tpch/plan_sf0.02/nation/15.parquet:.., /testdata/tpch/plan_sf0.02/nation/16.parquet:.., /testdata/tpch/plan_sf0.02/nation/2.parquet:..], [/testdata/tpch/plan_sf0.02/nation/6.parquet:.., /testdata/tpch/plan_sf0.02/nation/7.parquet:..]]}, projection=[n_nationkey, n_name], file_type=parquet, predicate=n_name@1 = SAUDI ARABIA, pruning_predicate=n_name_null_count@2 != row_count@3 AND n_name_min@0 <= SAUDI ARABIA AND SAUDI ARABIA <= n_name_max@1, required_guarantees=[n_name in (SAUDI ARABIA)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/11.parquet:.., /testdata/tpch/plan_sf0.02/nation/12.parquet:.., /testdata/tpch/plan_sf0.02/nation/13.parquet:..], [/testdata/tpch/plan_sf0.02/nation/2.parquet:.., /testdata/tpch/plan_sf0.02/nation/3.parquet:..], [/testdata/tpch/plan_sf0.02/nation/7.parquet:.., /testdata/tpch/plan_sf0.02/nation/8.parquet:..]]}, projection=[n_nationkey, n_name], file_type=parquet, predicate=n_name@1 = SAUDI ARABIA, pruning_predicate=n_name_null_count@2 != row_count@3 AND n_name_min@0 <= SAUDI ARABIA AND SAUDI ARABIA <= n_name_max@1, required_guarantees=[n_name in (SAUDI ARABIA)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/13.parquet:.., /testdata/tpch/plan_sf0.02/nation/14.parquet:..], [/testdata/tpch/plan_sf0.02/nation/3.parquet:.., /testdata/tpch/plan_sf0.02/nation/4.parquet:..], [/testdata/tpch/plan_sf0.02/nation/8.parquet:.., /testdata/tpch/plan_sf0.02/nation/9.parquet:..]]}, projection=[n_nationkey, n_name], file_type=parquet, predicate=n_name@1 = SAUDI ARABIA, pruning_predicate=n_name_null_count@2 != row_count@3 AND n_name_min@0 <= SAUDI ARABIA AND SAUDI ARABIA <= n_name_max@1, required_guarantees=[n_name in (SAUDI ARABIA)] + └────────────────────────────────────────────────── + ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ FilterExec: o_orderstatus@1 = F, projection=[o_orderkey@0] + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:..], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:..], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:..]]}, projection=[o_orderkey, o_orderstatus], file_type=parquet, predicate=o_orderstatus@2 = F, pruning_predicate=o_orderstatus_null_count@2 != row_count@3 AND o_orderstatus_min@0 <= F AND F <= o_orderstatus_max@1, required_guarantees=[o_orderstatus in (F)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:..], [/testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:..], [/testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:..]]}, projection=[o_orderkey, o_orderstatus], file_type=parquet, predicate=o_orderstatus@2 = F, pruning_predicate=o_orderstatus_null_count@2 != row_count@3 AND o_orderstatus_min@0 <= F AND F <= o_orderstatus_max@1, required_guarantees=[o_orderstatus in (F)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:..], [/testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:..], [/testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:..]]}, projection=[o_orderkey, o_orderstatus], file_type=parquet, predicate=o_orderstatus@2 = F, pruning_predicate=o_orderstatus_null_count@2 != row_count@3 AND o_orderstatus_min@0 <= F AND F <= o_orderstatus_max@1, required_guarantees=[o_orderstatus in (F)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_orderstatus], file_type=parquet, predicate=o_orderstatus@2 = F, pruning_predicate=o_orderstatus_null_count@2 != row_count@3 AND o_orderstatus_min@0 <= F AND F <= o_orderstatus_max@1, required_guarantees=[o_orderstatus in (F)] + └────────────────────────────────────────────────── + ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] + │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 + │ DistributedLeafExec: + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/1.parquet:.., /testdata/tpch/plan_sf0.02/supplier/10.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/14.parquet:.., /testdata/tpch/plan_sf0.02/supplier/15.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/4.parquet:.., /testdata/tpch/plan_sf0.02/supplier/5.parquet:..]]}, projection=[s_suppkey, s_name, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/10.parquet:.., /testdata/tpch/plan_sf0.02/supplier/11.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/15.parquet:.., /testdata/tpch/plan_sf0.02/supplier/16.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/5.parquet:.., /testdata/tpch/plan_sf0.02/supplier/6.parquet:.., /testdata/tpch/plan_sf0.02/supplier/7.parquet:..]]}, projection=[s_suppkey, s_name, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/11.parquet:.., /testdata/tpch/plan_sf0.02/supplier/12.parquet:.., /testdata/tpch/plan_sf0.02/supplier/13.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/16.parquet:.., /testdata/tpch/plan_sf0.02/supplier/2.parquet:.., /testdata/tpch/plan_sf0.02/supplier/3.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/7.parquet:.., /testdata/tpch/plan_sf0.02/supplier/8.parquet:..]]}, projection=[s_suppkey, s_name, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/13.parquet:.., /testdata/tpch/plan_sf0.02/supplier/14.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/3.parquet:.., /testdata/tpch/plan_sf0.02/supplier/4.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/8.parquet:.., /testdata/tpch/plan_sf0.02/supplier/9.parquet:..]]}, projection=[s_suppkey, s_name, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] + └────────────────────────────────────────────────── "); Ok(()) } @@ -1320,7 +1312,7 @@ mod tests { #[tokio::test] async fn test_tpch_22() -> Result<(), Box> { let plan = test_tpch_query("q22").await?; - assert_snapshot!(plan, @r" + assert_snapshot!(plan, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [cntrycode@0 ASC NULLS LAST] │ SortExec: expr=[cntrycode@0 ASC NULLS LAST], preserve_partitioning=[true] @@ -1354,12 +1346,12 @@ mod tests { └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ AggregateExec: mode=Partial, gby=[], aggr=[avg(customer.c_acctbal)] - │ FilterExec: c_acctbal@1 > Some(0),15,2 AND substr(c_phone@0, 1, 2) IN (SET) ([13, 31, 23, 29, 30, 18, 17]), projection=[c_acctbal@1] + │ FilterExec: c_acctbal@1 > 0.00 AND substr(c_phone@0, 1, 2) IN (SET) ([13, 31, 23, 29, 30, 18, 17]), projection=[c_acctbal@1] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/1.parquet:.., /testdata/tpch/plan_sf0.02/customer/10.parquet:..], [/testdata/tpch/plan_sf0.02/customer/14.parquet:.., /testdata/tpch/plan_sf0.02/customer/15.parquet:..], [/testdata/tpch/plan_sf0.02/customer/4.parquet:.., /testdata/tpch/plan_sf0.02/customer/5.parquet:.., /testdata/tpch/plan_sf0.02/customer/6.parquet:..]]}, projection=[c_phone, c_acctbal], file_type=parquet, predicate=c_acctbal@5 > Some(0),15,2 AND substr(c_phone@4, 1, 2) IN (SET) ([13, 31, 23, 29, 30, 18, 17]), pruning_predicate=c_acctbal_null_count@1 != row_count@2 AND c_acctbal_max@0 > Some(0),15,2, required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/10.parquet:.., /testdata/tpch/plan_sf0.02/customer/11.parquet:..], [/testdata/tpch/plan_sf0.02/customer/15.parquet:.., /testdata/tpch/plan_sf0.02/customer/16.parquet:..], [/testdata/tpch/plan_sf0.02/customer/6.parquet:.., /testdata/tpch/plan_sf0.02/customer/7.parquet:..]]}, projection=[c_phone, c_acctbal], file_type=parquet, predicate=c_acctbal@5 > Some(0),15,2 AND substr(c_phone@4, 1, 2) IN (SET) ([13, 31, 23, 29, 30, 18, 17]), pruning_predicate=c_acctbal_null_count@1 != row_count@2 AND c_acctbal_max@0 > Some(0),15,2, required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/11.parquet:.., /testdata/tpch/plan_sf0.02/customer/12.parquet:.., /testdata/tpch/plan_sf0.02/customer/13.parquet:..], [/testdata/tpch/plan_sf0.02/customer/16.parquet:.., /testdata/tpch/plan_sf0.02/customer/2.parquet:.., /testdata/tpch/plan_sf0.02/customer/3.parquet:..], [/testdata/tpch/plan_sf0.02/customer/7.parquet:.., /testdata/tpch/plan_sf0.02/customer/8.parquet:..]]}, projection=[c_phone, c_acctbal], file_type=parquet, predicate=c_acctbal@5 > Some(0),15,2 AND substr(c_phone@4, 1, 2) IN (SET) ([13, 31, 23, 29, 30, 18, 17]), pruning_predicate=c_acctbal_null_count@1 != row_count@2 AND c_acctbal_max@0 > Some(0),15,2, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/13.parquet:.., /testdata/tpch/plan_sf0.02/customer/14.parquet:..], [/testdata/tpch/plan_sf0.02/customer/3.parquet:.., /testdata/tpch/plan_sf0.02/customer/4.parquet:..], [/testdata/tpch/plan_sf0.02/customer/8.parquet:.., /testdata/tpch/plan_sf0.02/customer/9.parquet:..]]}, projection=[c_phone, c_acctbal], file_type=parquet, predicate=c_acctbal@5 > Some(0),15,2 AND substr(c_phone@4, 1, 2) IN (SET) ([13, 31, 23, 29, 30, 18, 17]), pruning_predicate=c_acctbal_null_count@1 != row_count@2 AND c_acctbal_max@0 > Some(0),15,2, required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/1.parquet:.., /testdata/tpch/plan_sf0.02/customer/10.parquet:..], [/testdata/tpch/plan_sf0.02/customer/14.parquet:.., /testdata/tpch/plan_sf0.02/customer/15.parquet:..], [/testdata/tpch/plan_sf0.02/customer/4.parquet:.., /testdata/tpch/plan_sf0.02/customer/5.parquet:.., /testdata/tpch/plan_sf0.02/customer/6.parquet:..]]}, projection=[c_phone, c_acctbal], file_type=parquet, predicate=c_acctbal@5 > 0.00 AND substr(c_phone@4, 1, 2) IN (SET) ([13, 31, 23, 29, 30, 18, 17]), pruning_predicate=c_acctbal_null_count@1 != row_count@2 AND c_acctbal_max@0 > 0.00, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/10.parquet:.., /testdata/tpch/plan_sf0.02/customer/11.parquet:..], [/testdata/tpch/plan_sf0.02/customer/15.parquet:.., /testdata/tpch/plan_sf0.02/customer/16.parquet:..], [/testdata/tpch/plan_sf0.02/customer/6.parquet:.., /testdata/tpch/plan_sf0.02/customer/7.parquet:..]]}, projection=[c_phone, c_acctbal], file_type=parquet, predicate=c_acctbal@5 > 0.00 AND substr(c_phone@4, 1, 2) IN (SET) ([13, 31, 23, 29, 30, 18, 17]), pruning_predicate=c_acctbal_null_count@1 != row_count@2 AND c_acctbal_max@0 > 0.00, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/11.parquet:.., /testdata/tpch/plan_sf0.02/customer/12.parquet:.., /testdata/tpch/plan_sf0.02/customer/13.parquet:..], [/testdata/tpch/plan_sf0.02/customer/16.parquet:.., /testdata/tpch/plan_sf0.02/customer/2.parquet:.., /testdata/tpch/plan_sf0.02/customer/3.parquet:..], [/testdata/tpch/plan_sf0.02/customer/7.parquet:.., /testdata/tpch/plan_sf0.02/customer/8.parquet:..]]}, projection=[c_phone, c_acctbal], file_type=parquet, predicate=c_acctbal@5 > 0.00 AND substr(c_phone@4, 1, 2) IN (SET) ([13, 31, 23, 29, 30, 18, 17]), pruning_predicate=c_acctbal_null_count@1 != row_count@2 AND c_acctbal_max@0 > 0.00, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/13.parquet:.., /testdata/tpch/plan_sf0.02/customer/14.parquet:..], [/testdata/tpch/plan_sf0.02/customer/3.parquet:.., /testdata/tpch/plan_sf0.02/customer/4.parquet:..], [/testdata/tpch/plan_sf0.02/customer/8.parquet:.., /testdata/tpch/plan_sf0.02/customer/9.parquet:..]]}, projection=[c_phone, c_acctbal], file_type=parquet, predicate=c_acctbal@5 > 0.00 AND substr(c_phone@4, 1, 2) IN (SET) ([13, 31, 23, 29, 30, 18, 17]), pruning_predicate=c_acctbal_null_count@1 != row_count@2 AND c_acctbal_max@0 > 0.00, required_guarantees=[] └────────────────────────────────────────────────── "); Ok(()) @@ -1406,7 +1398,14 @@ mod tests { df.create_physical_plan().await? }; - Ok(display_plan_ascii(plan.as_ref(), false)) + Ok(normalize_plan_display(display_plan_ascii( + plan.as_ref(), + false, + ))) + } + + fn normalize_plan_display(display: String) -> String { + display.replace(", dynamic_rg_pruning=eligible", "") } // OnceCell to ensure TPCH tables are generated only once for tests From bfbc0393c294ed73dc973199ba178a1a239c15cf Mon Sep 17 00:00:00 2001 From: Jayant Shrivastava Date: Thu, 2 Jul 2026 18:04:29 +0000 Subject: [PATCH 10/12] dynamic_rg_pruning=eligible --- tests/clickbench_plans_test.rs | 39 +- tests/tpcds_plans_test.rs | 2671 ++++++++++++++++---------------- tests/tpch_plans_test.rs | 361 +++-- 3 files changed, 1525 insertions(+), 1546 deletions(-) diff --git a/tests/clickbench_plans_test.rs b/tests/clickbench_plans_test.rs index 88051240..13b9fdba 100644 --- a/tests/clickbench_plans_test.rs +++ b/tests/clickbench_plans_test.rs @@ -561,7 +561,7 @@ mod tests { #[tokio::test] async fn test_clickbench_23() -> Result<()> { let display = test_clickbench_query("q23").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [EventTime@4 ASC NULLS LAST], fetch=10 │ [Stage 1] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 @@ -570,10 +570,10 @@ mod tests { │ SortExec: TopK(fetch=10), expr=[EventTime@4 ASC NULLS LAST], preserve_partitioning=[true] │ FilterExec: CAST(URL@13 AS Utf8View) LIKE %google% │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/clickbench/plans_range0-3/hits/0.parquet:..], [/testdata/clickbench/plans_range0-3/hits/1.parquet:..], [/testdata/clickbench/plans_range0-3/hits/2.parquet:..]]}, projection=[WatchID, JavaEnable, Title, GoodEvent, EventTime, EventDate, CounterID, ClientIP, RegionID, UserID, CounterClass, OS, UserAgent, URL, Referer, IsRefresh, RefererCategoryID, RefererRegionID, URLCategoryID, URLRegionID, ResolutionWidth, ResolutionHeight, ResolutionDepth, FlashMajor, FlashMinor, FlashMinor2, NetMajor, NetMinor, UserAgentMajor, UserAgentMinor, CookieEnable, JavascriptEnable, IsMobile, MobilePhone, MobilePhoneModel, Params, IPNetworkID, TraficSourceID, SearchEngineID, SearchPhrase, AdvEngineID, IsArtifical, WindowClientWidth, WindowClientHeight, ClientTimeZone, ClientEventTime, SilverlightVersion1, SilverlightVersion2, SilverlightVersion3, SilverlightVersion4, PageCharset, CodeVersion, IsLink, IsDownload, IsNotBounce, FUniqID, OriginalURL, HID, IsOldCounter, IsEvent, IsParameter, DontCountHits, WithHash, HitColor, LocalEventTime, Age, Sex, Income, Interests, Robotness, RemoteIP, WindowName, OpenerName, HistoryLength, BrowserLanguage, BrowserCountry, SocialNetwork, SocialAction, HTTPError, SendTiming, DNSTiming, ConnectTiming, ResponseStartTiming, ResponseEndTiming, FetchTiming, SocialSourceNetworkID, SocialSourcePage, ParamPrice, ParamOrderID, ParamCurrency, ParamCurrencyID, OpenstatServiceName, OpenstatCampaignID, OpenstatAdID, OpenstatSourceID, UTMSource, UTMMedium, UTMCampaign, UTMContent, UTMTerm, FromTag, HasGCLID, RefererHash, URLHash, CLID], file_type=parquet, predicate=CAST(URL@13 AS Utf8View) LIKE %google% AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/clickbench/plans_range0-3/hits/0.parquet:..], [/testdata/clickbench/plans_range0-3/hits/1.parquet:..], [/testdata/clickbench/plans_range0-3/hits/2.parquet:..]]}, projection=[WatchID, JavaEnable, Title, GoodEvent, EventTime, EventDate, CounterID, ClientIP, RegionID, UserID, CounterClass, OS, UserAgent, URL, Referer, IsRefresh, RefererCategoryID, RefererRegionID, URLCategoryID, URLRegionID, ResolutionWidth, ResolutionHeight, ResolutionDepth, FlashMajor, FlashMinor, FlashMinor2, NetMajor, NetMinor, UserAgentMajor, UserAgentMinor, CookieEnable, JavascriptEnable, IsMobile, MobilePhone, MobilePhoneModel, Params, IPNetworkID, TraficSourceID, SearchEngineID, SearchPhrase, AdvEngineID, IsArtifical, WindowClientWidth, WindowClientHeight, ClientTimeZone, ClientEventTime, SilverlightVersion1, SilverlightVersion2, SilverlightVersion3, SilverlightVersion4, PageCharset, CodeVersion, IsLink, IsDownload, IsNotBounce, FUniqID, OriginalURL, HID, IsOldCounter, IsEvent, IsParameter, DontCountHits, WithHash, HitColor, LocalEventTime, Age, Sex, Income, Interests, Robotness, RemoteIP, WindowName, OpenerName, HistoryLength, BrowserLanguage, BrowserCountry, SocialNetwork, SocialAction, HTTPError, SendTiming, DNSTiming, ConnectTiming, ResponseStartTiming, ResponseEndTiming, FetchTiming, SocialSourceNetworkID, SocialSourcePage, ParamPrice, ParamOrderID, ParamCurrency, ParamCurrencyID, OpenstatServiceName, OpenstatCampaignID, OpenstatAdID, OpenstatSourceID, UTMSource, UTMMedium, UTMCampaign, UTMContent, UTMTerm, FromTag, HasGCLID, RefererHash, URLHash, CLID], file_type=parquet, predicate=CAST(URL@13 AS Utf8View) LIKE %google% AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/clickbench/plans_range0-3/hits/0.parquet:..], [/testdata/clickbench/plans_range0-3/hits/1.parquet:..], [/testdata/clickbench/plans_range0-3/hits/2.parquet:..]]}, projection=[WatchID, JavaEnable, Title, GoodEvent, EventTime, EventDate, CounterID, ClientIP, RegionID, UserID, CounterClass, OS, UserAgent, URL, Referer, IsRefresh, RefererCategoryID, RefererRegionID, URLCategoryID, URLRegionID, ResolutionWidth, ResolutionHeight, ResolutionDepth, FlashMajor, FlashMinor, FlashMinor2, NetMajor, NetMinor, UserAgentMajor, UserAgentMinor, CookieEnable, JavascriptEnable, IsMobile, MobilePhone, MobilePhoneModel, Params, IPNetworkID, TraficSourceID, SearchEngineID, SearchPhrase, AdvEngineID, IsArtifical, WindowClientWidth, WindowClientHeight, ClientTimeZone, ClientEventTime, SilverlightVersion1, SilverlightVersion2, SilverlightVersion3, SilverlightVersion4, PageCharset, CodeVersion, IsLink, IsDownload, IsNotBounce, FUniqID, OriginalURL, HID, IsOldCounter, IsEvent, IsParameter, DontCountHits, WithHash, HitColor, LocalEventTime, Age, Sex, Income, Interests, Robotness, RemoteIP, WindowName, OpenerName, HistoryLength, BrowserLanguage, BrowserCountry, SocialNetwork, SocialAction, HTTPError, SendTiming, DNSTiming, ConnectTiming, ResponseStartTiming, ResponseEndTiming, FetchTiming, SocialSourceNetworkID, SocialSourcePage, ParamPrice, ParamOrderID, ParamCurrency, ParamCurrencyID, OpenstatServiceName, OpenstatCampaignID, OpenstatAdID, OpenstatSourceID, UTMSource, UTMMedium, UTMCampaign, UTMContent, UTMTerm, FromTag, HasGCLID, RefererHash, URLHash, CLID], file_type=parquet, predicate=CAST(URL@13 AS Utf8View) LIKE %google% AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/clickbench/plans_range0-3/hits/0.parquet:.., /testdata/clickbench/plans_range0-3/hits/1.parquet:.., /testdata/clickbench/plans_range0-3/hits/1.parquet:..], [/testdata/clickbench/plans_range0-3/hits/1.parquet:.., /testdata/clickbench/plans_range0-3/hits/2.parquet:.., /testdata/clickbench/plans_range0-3/hits/2.parquet:..], [/testdata/clickbench/plans_range0-3/hits/2.parquet:..]]}, projection=[WatchID, JavaEnable, Title, GoodEvent, EventTime, EventDate, CounterID, ClientIP, RegionID, UserID, CounterClass, OS, UserAgent, URL, Referer, IsRefresh, RefererCategoryID, RefererRegionID, URLCategoryID, URLRegionID, ResolutionWidth, ResolutionHeight, ResolutionDepth, FlashMajor, FlashMinor, FlashMinor2, NetMajor, NetMinor, UserAgentMajor, UserAgentMinor, CookieEnable, JavascriptEnable, IsMobile, MobilePhone, MobilePhoneModel, Params, IPNetworkID, TraficSourceID, SearchEngineID, SearchPhrase, AdvEngineID, IsArtifical, WindowClientWidth, WindowClientHeight, ClientTimeZone, ClientEventTime, SilverlightVersion1, SilverlightVersion2, SilverlightVersion3, SilverlightVersion4, PageCharset, CodeVersion, IsLink, IsDownload, IsNotBounce, FUniqID, OriginalURL, HID, IsOldCounter, IsEvent, IsParameter, DontCountHits, WithHash, HitColor, LocalEventTime, Age, Sex, Income, Interests, Robotness, RemoteIP, WindowName, OpenerName, HistoryLength, BrowserLanguage, BrowserCountry, SocialNetwork, SocialAction, HTTPError, SendTiming, DNSTiming, ConnectTiming, ResponseStartTiming, ResponseEndTiming, FetchTiming, SocialSourceNetworkID, SocialSourcePage, ParamPrice, ParamOrderID, ParamCurrency, ParamCurrencyID, OpenstatServiceName, OpenstatCampaignID, OpenstatAdID, OpenstatSourceID, UTMSource, UTMMedium, UTMCampaign, UTMContent, UTMTerm, FromTag, HasGCLID, RefererHash, URLHash, CLID], file_type=parquet, predicate=CAST(URL@13 AS Utf8View) LIKE %google% AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/clickbench/plans_range0-3/hits/0.parquet:..], [/testdata/clickbench/plans_range0-3/hits/1.parquet:..], [/testdata/clickbench/plans_range0-3/hits/2.parquet:..]]}, projection=[WatchID, JavaEnable, Title, GoodEvent, EventTime, EventDate, CounterID, ClientIP, RegionID, UserID, CounterClass, OS, UserAgent, URL, Referer, IsRefresh, RefererCategoryID, RefererRegionID, URLCategoryID, URLRegionID, ResolutionWidth, ResolutionHeight, ResolutionDepth, FlashMajor, FlashMinor, FlashMinor2, NetMajor, NetMinor, UserAgentMajor, UserAgentMinor, CookieEnable, JavascriptEnable, IsMobile, MobilePhone, MobilePhoneModel, Params, IPNetworkID, TraficSourceID, SearchEngineID, SearchPhrase, AdvEngineID, IsArtifical, WindowClientWidth, WindowClientHeight, ClientTimeZone, ClientEventTime, SilverlightVersion1, SilverlightVersion2, SilverlightVersion3, SilverlightVersion4, PageCharset, CodeVersion, IsLink, IsDownload, IsNotBounce, FUniqID, OriginalURL, HID, IsOldCounter, IsEvent, IsParameter, DontCountHits, WithHash, HitColor, LocalEventTime, Age, Sex, Income, Interests, Robotness, RemoteIP, WindowName, OpenerName, HistoryLength, BrowserLanguage, BrowserCountry, SocialNetwork, SocialAction, HTTPError, SendTiming, DNSTiming, ConnectTiming, ResponseStartTiming, ResponseEndTiming, FetchTiming, SocialSourceNetworkID, SocialSourcePage, ParamPrice, ParamOrderID, ParamCurrency, ParamCurrencyID, OpenstatServiceName, OpenstatCampaignID, OpenstatAdID, OpenstatSourceID, UTMSource, UTMMedium, UTMCampaign, UTMContent, UTMTerm, FromTag, HasGCLID, RefererHash, URLHash, CLID], file_type=parquet, predicate=CAST(URL@13 AS Utf8View) LIKE %google% AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/clickbench/plans_range0-3/hits/0.parquet:..], [/testdata/clickbench/plans_range0-3/hits/1.parquet:..], [/testdata/clickbench/plans_range0-3/hits/2.parquet:..]]}, projection=[WatchID, JavaEnable, Title, GoodEvent, EventTime, EventDate, CounterID, ClientIP, RegionID, UserID, CounterClass, OS, UserAgent, URL, Referer, IsRefresh, RefererCategoryID, RefererRegionID, URLCategoryID, URLRegionID, ResolutionWidth, ResolutionHeight, ResolutionDepth, FlashMajor, FlashMinor, FlashMinor2, NetMajor, NetMinor, UserAgentMajor, UserAgentMinor, CookieEnable, JavascriptEnable, IsMobile, MobilePhone, MobilePhoneModel, Params, IPNetworkID, TraficSourceID, SearchEngineID, SearchPhrase, AdvEngineID, IsArtifical, WindowClientWidth, WindowClientHeight, ClientTimeZone, ClientEventTime, SilverlightVersion1, SilverlightVersion2, SilverlightVersion3, SilverlightVersion4, PageCharset, CodeVersion, IsLink, IsDownload, IsNotBounce, FUniqID, OriginalURL, HID, IsOldCounter, IsEvent, IsParameter, DontCountHits, WithHash, HitColor, LocalEventTime, Age, Sex, Income, Interests, Robotness, RemoteIP, WindowName, OpenerName, HistoryLength, BrowserLanguage, BrowserCountry, SocialNetwork, SocialAction, HTTPError, SendTiming, DNSTiming, ConnectTiming, ResponseStartTiming, ResponseEndTiming, FetchTiming, SocialSourceNetworkID, SocialSourcePage, ParamPrice, ParamOrderID, ParamCurrency, ParamCurrencyID, OpenstatServiceName, OpenstatCampaignID, OpenstatAdID, OpenstatSourceID, UTMSource, UTMMedium, UTMCampaign, UTMContent, UTMTerm, FromTag, HasGCLID, RefererHash, URLHash, CLID], file_type=parquet, predicate=CAST(URL@13 AS Utf8View) LIKE %google% AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/clickbench/plans_range0-3/hits/0.parquet:..], [/testdata/clickbench/plans_range0-3/hits/1.parquet:..], [/testdata/clickbench/plans_range0-3/hits/2.parquet:..]]}, projection=[WatchID, JavaEnable, Title, GoodEvent, EventTime, EventDate, CounterID, ClientIP, RegionID, UserID, CounterClass, OS, UserAgent, URL, Referer, IsRefresh, RefererCategoryID, RefererRegionID, URLCategoryID, URLRegionID, ResolutionWidth, ResolutionHeight, ResolutionDepth, FlashMajor, FlashMinor, FlashMinor2, NetMajor, NetMinor, UserAgentMajor, UserAgentMinor, CookieEnable, JavascriptEnable, IsMobile, MobilePhone, MobilePhoneModel, Params, IPNetworkID, TraficSourceID, SearchEngineID, SearchPhrase, AdvEngineID, IsArtifical, WindowClientWidth, WindowClientHeight, ClientTimeZone, ClientEventTime, SilverlightVersion1, SilverlightVersion2, SilverlightVersion3, SilverlightVersion4, PageCharset, CodeVersion, IsLink, IsDownload, IsNotBounce, FUniqID, OriginalURL, HID, IsOldCounter, IsEvent, IsParameter, DontCountHits, WithHash, HitColor, LocalEventTime, Age, Sex, Income, Interests, Robotness, RemoteIP, WindowName, OpenerName, HistoryLength, BrowserLanguage, BrowserCountry, SocialNetwork, SocialAction, HTTPError, SendTiming, DNSTiming, ConnectTiming, ResponseStartTiming, ResponseEndTiming, FetchTiming, SocialSourceNetworkID, SocialSourcePage, ParamPrice, ParamOrderID, ParamCurrency, ParamCurrencyID, OpenstatServiceName, OpenstatCampaignID, OpenstatAdID, OpenstatSourceID, UTMSource, UTMMedium, UTMCampaign, UTMContent, UTMTerm, FromTag, HasGCLID, RefererHash, URLHash, CLID], file_type=parquet, predicate=CAST(URL@13 AS Utf8View) LIKE %google% AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/clickbench/plans_range0-3/hits/0.parquet:.., /testdata/clickbench/plans_range0-3/hits/1.parquet:.., /testdata/clickbench/plans_range0-3/hits/1.parquet:..], [/testdata/clickbench/plans_range0-3/hits/1.parquet:.., /testdata/clickbench/plans_range0-3/hits/2.parquet:.., /testdata/clickbench/plans_range0-3/hits/2.parquet:..], [/testdata/clickbench/plans_range0-3/hits/2.parquet:..]]}, projection=[WatchID, JavaEnable, Title, GoodEvent, EventTime, EventDate, CounterID, ClientIP, RegionID, UserID, CounterClass, OS, UserAgent, URL, Referer, IsRefresh, RefererCategoryID, RefererRegionID, URLCategoryID, URLRegionID, ResolutionWidth, ResolutionHeight, ResolutionDepth, FlashMajor, FlashMinor, FlashMinor2, NetMajor, NetMinor, UserAgentMajor, UserAgentMinor, CookieEnable, JavascriptEnable, IsMobile, MobilePhone, MobilePhoneModel, Params, IPNetworkID, TraficSourceID, SearchEngineID, SearchPhrase, AdvEngineID, IsArtifical, WindowClientWidth, WindowClientHeight, ClientTimeZone, ClientEventTime, SilverlightVersion1, SilverlightVersion2, SilverlightVersion3, SilverlightVersion4, PageCharset, CodeVersion, IsLink, IsDownload, IsNotBounce, FUniqID, OriginalURL, HID, IsOldCounter, IsEvent, IsParameter, DontCountHits, WithHash, HitColor, LocalEventTime, Age, Sex, Income, Interests, Robotness, RemoteIP, WindowName, OpenerName, HistoryLength, BrowserLanguage, BrowserCountry, SocialNetwork, SocialAction, HTTPError, SendTiming, DNSTiming, ConnectTiming, ResponseStartTiming, ResponseEndTiming, FetchTiming, SocialSourceNetworkID, SocialSourcePage, ParamPrice, ParamOrderID, ParamCurrency, ParamCurrencyID, OpenstatServiceName, OpenstatCampaignID, OpenstatAdID, OpenstatSourceID, UTMSource, UTMMedium, UTMCampaign, UTMContent, UTMTerm, FromTag, HasGCLID, RefererHash, URLHash, CLID], file_type=parquet, predicate=CAST(URL@13 AS Utf8View) LIKE %google% AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -605,7 +605,7 @@ mod tests { #[tokio::test] async fn test_clickbench_25() -> Result<()> { let display = test_clickbench_query("q25").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ SortPreservingMergeExec: [SearchPhrase@0 ASC NULLS LAST], fetch=10 │ [Stage 1] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 @@ -614,10 +614,10 @@ mod tests { │ SortExec: TopK(fetch=10), expr=[SearchPhrase@0 ASC NULLS LAST], preserve_partitioning=[true] │ FilterExec: SearchPhrase@0 != │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/clickbench/plans_range0-3/hits/0.parquet:..], [/testdata/clickbench/plans_range0-3/hits/1.parquet:..], [/testdata/clickbench/plans_range0-3/hits/2.parquet:..]]}, projection=[SearchPhrase], file_type=parquet, predicate=SearchPhrase@39 != AND DynamicFilter [ empty ], pruning_predicate=SearchPhrase_null_count@2 != row_count@3 AND (SearchPhrase_min@0 != OR != SearchPhrase_max@1), required_guarantees=[SearchPhrase not in ()] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/clickbench/plans_range0-3/hits/0.parquet:..], [/testdata/clickbench/plans_range0-3/hits/1.parquet:..], [/testdata/clickbench/plans_range0-3/hits/2.parquet:..]]}, projection=[SearchPhrase], file_type=parquet, predicate=SearchPhrase@39 != AND DynamicFilter [ empty ], pruning_predicate=SearchPhrase_null_count@2 != row_count@3 AND (SearchPhrase_min@0 != OR != SearchPhrase_max@1), required_guarantees=[SearchPhrase not in ()] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/clickbench/plans_range0-3/hits/0.parquet:..], [/testdata/clickbench/plans_range0-3/hits/1.parquet:..], [/testdata/clickbench/plans_range0-3/hits/2.parquet:..]]}, projection=[SearchPhrase], file_type=parquet, predicate=SearchPhrase@39 != AND DynamicFilter [ empty ], pruning_predicate=SearchPhrase_null_count@2 != row_count@3 AND (SearchPhrase_min@0 != OR != SearchPhrase_max@1), required_guarantees=[SearchPhrase not in ()] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/clickbench/plans_range0-3/hits/0.parquet:.., /testdata/clickbench/plans_range0-3/hits/1.parquet:.., /testdata/clickbench/plans_range0-3/hits/1.parquet:..], [/testdata/clickbench/plans_range0-3/hits/1.parquet:.., /testdata/clickbench/plans_range0-3/hits/2.parquet:.., /testdata/clickbench/plans_range0-3/hits/2.parquet:..], [/testdata/clickbench/plans_range0-3/hits/2.parquet:..]]}, projection=[SearchPhrase], file_type=parquet, predicate=SearchPhrase@39 != AND DynamicFilter [ empty ], pruning_predicate=SearchPhrase_null_count@2 != row_count@3 AND (SearchPhrase_min@0 != OR != SearchPhrase_max@1), required_guarantees=[SearchPhrase not in ()] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/clickbench/plans_range0-3/hits/0.parquet:..], [/testdata/clickbench/plans_range0-3/hits/1.parquet:..], [/testdata/clickbench/plans_range0-3/hits/2.parquet:..]]}, projection=[SearchPhrase], file_type=parquet, predicate=SearchPhrase@39 != AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=SearchPhrase_null_count@2 != row_count@3 AND (SearchPhrase_min@0 != OR != SearchPhrase_max@1), required_guarantees=[SearchPhrase not in ()] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/clickbench/plans_range0-3/hits/0.parquet:..], [/testdata/clickbench/plans_range0-3/hits/1.parquet:..], [/testdata/clickbench/plans_range0-3/hits/2.parquet:..]]}, projection=[SearchPhrase], file_type=parquet, predicate=SearchPhrase@39 != AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=SearchPhrase_null_count@2 != row_count@3 AND (SearchPhrase_min@0 != OR != SearchPhrase_max@1), required_guarantees=[SearchPhrase not in ()] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/clickbench/plans_range0-3/hits/0.parquet:..], [/testdata/clickbench/plans_range0-3/hits/1.parquet:..], [/testdata/clickbench/plans_range0-3/hits/2.parquet:..]]}, projection=[SearchPhrase], file_type=parquet, predicate=SearchPhrase@39 != AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=SearchPhrase_null_count@2 != row_count@3 AND (SearchPhrase_min@0 != OR != SearchPhrase_max@1), required_guarantees=[SearchPhrase not in ()] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/clickbench/plans_range0-3/hits/0.parquet:.., /testdata/clickbench/plans_range0-3/hits/1.parquet:.., /testdata/clickbench/plans_range0-3/hits/1.parquet:..], [/testdata/clickbench/plans_range0-3/hits/1.parquet:.., /testdata/clickbench/plans_range0-3/hits/2.parquet:.., /testdata/clickbench/plans_range0-3/hits/2.parquet:..], [/testdata/clickbench/plans_range0-3/hits/2.parquet:..]]}, projection=[SearchPhrase], file_type=parquet, predicate=SearchPhrase@39 != AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=SearchPhrase_null_count@2 != row_count@3 AND (SearchPhrase_min@0 != OR != SearchPhrase_max@1), required_guarantees=[SearchPhrase not in ()] └────────────────────────────────────────────────── "); Ok(()) @@ -626,7 +626,7 @@ mod tests { #[tokio::test] async fn test_clickbench_26() -> Result<()> { let display = test_clickbench_query("q26").await?; - assert_snapshot!(display, @r" + assert_snapshot!(display, @" ┌───── DistributedExec ── Tasks: t0:[p0] │ ProjectionExec: expr=[SearchPhrase@0 as SearchPhrase] │ SortPreservingMergeExec: [EventTime@1 ASC NULLS LAST, SearchPhrase@0 ASC NULLS LAST], fetch=10 @@ -636,10 +636,10 @@ mod tests { │ SortExec: TopK(fetch=10), expr=[EventTime@1 ASC NULLS LAST, SearchPhrase@0 ASC NULLS LAST], preserve_partitioning=[true] │ FilterExec: SearchPhrase@1 != , projection=[SearchPhrase@1, EventTime@0] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/clickbench/plans_range0-3/hits/0.parquet:..], [/testdata/clickbench/plans_range0-3/hits/1.parquet:..], [/testdata/clickbench/plans_range0-3/hits/2.parquet:..]]}, projection=[EventTime, SearchPhrase], file_type=parquet, predicate=SearchPhrase@39 != AND DynamicFilter [ empty ], pruning_predicate=SearchPhrase_null_count@2 != row_count@3 AND (SearchPhrase_min@0 != OR != SearchPhrase_max@1), required_guarantees=[SearchPhrase not in ()] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/clickbench/plans_range0-3/hits/0.parquet:..], [/testdata/clickbench/plans_range0-3/hits/1.parquet:..], [/testdata/clickbench/plans_range0-3/hits/2.parquet:..]]}, projection=[EventTime, SearchPhrase], file_type=parquet, predicate=SearchPhrase@39 != AND DynamicFilter [ empty ], pruning_predicate=SearchPhrase_null_count@2 != row_count@3 AND (SearchPhrase_min@0 != OR != SearchPhrase_max@1), required_guarantees=[SearchPhrase not in ()] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/clickbench/plans_range0-3/hits/0.parquet:..], [/testdata/clickbench/plans_range0-3/hits/1.parquet:..], [/testdata/clickbench/plans_range0-3/hits/2.parquet:..]]}, projection=[EventTime, SearchPhrase], file_type=parquet, predicate=SearchPhrase@39 != AND DynamicFilter [ empty ], pruning_predicate=SearchPhrase_null_count@2 != row_count@3 AND (SearchPhrase_min@0 != OR != SearchPhrase_max@1), required_guarantees=[SearchPhrase not in ()] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/clickbench/plans_range0-3/hits/0.parquet:.., /testdata/clickbench/plans_range0-3/hits/1.parquet:.., /testdata/clickbench/plans_range0-3/hits/1.parquet:..], [/testdata/clickbench/plans_range0-3/hits/1.parquet:.., /testdata/clickbench/plans_range0-3/hits/2.parquet:.., /testdata/clickbench/plans_range0-3/hits/2.parquet:..], [/testdata/clickbench/plans_range0-3/hits/2.parquet:..]]}, projection=[EventTime, SearchPhrase], file_type=parquet, predicate=SearchPhrase@39 != AND DynamicFilter [ empty ], pruning_predicate=SearchPhrase_null_count@2 != row_count@3 AND (SearchPhrase_min@0 != OR != SearchPhrase_max@1), required_guarantees=[SearchPhrase not in ()] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/clickbench/plans_range0-3/hits/0.parquet:..], [/testdata/clickbench/plans_range0-3/hits/1.parquet:..], [/testdata/clickbench/plans_range0-3/hits/2.parquet:..]]}, projection=[EventTime, SearchPhrase], file_type=parquet, predicate=SearchPhrase@39 != AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=SearchPhrase_null_count@2 != row_count@3 AND (SearchPhrase_min@0 != OR != SearchPhrase_max@1), required_guarantees=[SearchPhrase not in ()] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/clickbench/plans_range0-3/hits/0.parquet:..], [/testdata/clickbench/plans_range0-3/hits/1.parquet:..], [/testdata/clickbench/plans_range0-3/hits/2.parquet:..]]}, projection=[EventTime, SearchPhrase], file_type=parquet, predicate=SearchPhrase@39 != AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=SearchPhrase_null_count@2 != row_count@3 AND (SearchPhrase_min@0 != OR != SearchPhrase_max@1), required_guarantees=[SearchPhrase not in ()] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/clickbench/plans_range0-3/hits/0.parquet:..], [/testdata/clickbench/plans_range0-3/hits/1.parquet:..], [/testdata/clickbench/plans_range0-3/hits/2.parquet:..]]}, projection=[EventTime, SearchPhrase], file_type=parquet, predicate=SearchPhrase@39 != AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=SearchPhrase_null_count@2 != row_count@3 AND (SearchPhrase_min@0 != OR != SearchPhrase_max@1), required_guarantees=[SearchPhrase not in ()] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/clickbench/plans_range0-3/hits/0.parquet:.., /testdata/clickbench/plans_range0-3/hits/1.parquet:.., /testdata/clickbench/plans_range0-3/hits/1.parquet:..], [/testdata/clickbench/plans_range0-3/hits/1.parquet:.., /testdata/clickbench/plans_range0-3/hits/2.parquet:.., /testdata/clickbench/plans_range0-3/hits/2.parquet:..], [/testdata/clickbench/plans_range0-3/hits/2.parquet:..]]}, projection=[EventTime, SearchPhrase], file_type=parquet, predicate=SearchPhrase@39 != AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=SearchPhrase_null_count@2 != row_count@3 AND (SearchPhrase_min@0 != OR != SearchPhrase_max@1), required_guarantees=[SearchPhrase not in ()] └────────────────────────────────────────────────── "); Ok(()) @@ -1131,14 +1131,7 @@ mod tests { if !plan.is::() { Ok("".to_string()) } else { - Ok(normalize_plan_display(display_plan_ascii( - plan.as_ref(), - false, - ))) + Ok(display_plan_ascii(plan.as_ref(), false)) } } - - fn normalize_plan_display(display: String) -> String { - display.replace(", dynamic_rg_pruning=eligible", "") - } } diff --git a/tests/tpcds_plans_test.rs b/tests/tpcds_plans_test.rs index 688211a5..05350e46 100644 --- a/tests/tpcds_plans_test.rs +++ b/tests/tpcds_plans_test.rs @@ -37,10 +37,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=2 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -68,10 +68,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_returned_date_sk, sr_customer_sk, sr_store_sk, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_customer_sk, sr_store_sk, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_customer_sk, sr_store_sk, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_customer_sk, sr_store_sk, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_returned_date_sk, sr_customer_sk, sr_store_sk, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_customer_sk, sr_store_sk, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_customer_sk, sr_store_sk, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_customer_sk, sr_store_sk, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -96,10 +96,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_returned_date_sk, sr_customer_sk, sr_store_sk, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_customer_sk, sr_store_sk, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_customer_sk, sr_store_sk, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_customer_sk, sr_store_sk, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_returned_date_sk, sr_customer_sk, sr_store_sk, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_customer_sk, sr_store_sk, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_customer_sk, sr_store_sk, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_customer_sk, sr_store_sk, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -156,19 +156,19 @@ mod tests { │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedUnionExec: t0:[c0(0/2)] t1:[c0(1/2)] t2:[c1(0/2)] t3:[c1(1/2)] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk@0 as sold_date_sk, ws_ext_sales_price@23 as sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk@0 as sold_date_sk, ws_ext_sales_price@23 as sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk@0 as sold_date_sk, ws_ext_sales_price@23 as sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk@0 as sold_date_sk, ws_ext_sales_price@23 as sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk@0 as sold_date_sk, cs_ext_sales_price@23 as sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk@0 as sold_date_sk, cs_ext_sales_price@23 as sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk@0 as sold_date_sk, cs_ext_sales_price@23 as sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk@0 as sold_date_sk, cs_ext_sales_price@23 as sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p5] t1:[p0..p5] │ RepartitionExec: partitioning=Hash([z.d_week_seq2 - Int64(53)@8], 6), input_partitions=3 @@ -197,19 +197,19 @@ mod tests { │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedUnionExec: t0:[c0(0/2)] t1:[c0(1/2)] t2:[c1(0/2)] t3:[c1(1/2)] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk@0 as sold_date_sk, ws_ext_sales_price@23 as sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk@0 as sold_date_sk, ws_ext_sales_price@23 as sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk@0 as sold_date_sk, ws_ext_sales_price@23 as sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk@0 as sold_date_sk, ws_ext_sales_price@23 as sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk@0 as sold_date_sk, cs_ext_sales_price@23 as sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk@0 as sold_date_sk, cs_ext_sales_price@23 as sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk@0 as sold_date_sk, cs_ext_sales_price@23 as sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk@0 as sold_date_sk, cs_ext_sales_price@23 as sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "#); Ok(()) @@ -238,10 +238,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -311,10 +311,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_sales_price, ws_ext_wholesale_cost, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_sales_price, ws_ext_wholesale_cost, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_sales_price, ws_ext_wholesale_cost, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_sales_price, ws_ext_wholesale_cost, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_sales_price, ws_ext_wholesale_cost, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_sales_price, ws_ext_wholesale_cost, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_sales_price, ws_ext_wholesale_cost, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_sales_price, ws_ext_wholesale_cost, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -363,10 +363,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_ext_discount_amt, cs_ext_sales_price, cs_ext_wholesale_cost, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_ext_discount_amt, cs_ext_sales_price, cs_ext_wholesale_cost, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_ext_discount_amt, cs_ext_sales_price, cs_ext_wholesale_cost, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_ext_discount_amt, cs_ext_sales_price, cs_ext_wholesale_cost, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_ext_discount_amt, cs_ext_sales_price, cs_ext_wholesale_cost, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_ext_discount_amt, cs_ext_sales_price, cs_ext_wholesale_cost, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_ext_discount_amt, cs_ext_sales_price, cs_ext_wholesale_cost, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_ext_discount_amt, cs_ext_sales_price, cs_ext_wholesale_cost, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -403,10 +403,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 10] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_sales_price, ss_ext_wholesale_cost, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_sales_price, ss_ext_wholesale_cost, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_sales_price, ss_ext_wholesale_cost, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_sales_price, ss_ext_wholesale_cost, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_sales_price, ss_ext_wholesale_cost, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_sales_price, ss_ext_wholesale_cost, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_sales_price, ss_ext_wholesale_cost, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_sales_price, ss_ext_wholesale_cost, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -420,10 +420,10 @@ mod tests { ┌───── Stage 10 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 15 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([c_customer_id@0, c_first_name@1, c_last_name@2, c_preferred_cust_flag@3, c_birth_country@4, c_login@5, c_email_address@6, d_year@7], 6), input_partitions=3 @@ -435,10 +435,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 14] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_sales_price, ss_ext_wholesale_cost, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_sales_price, ss_ext_wholesale_cost, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_sales_price, ss_ext_wholesale_cost, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_sales_price, ss_ext_wholesale_cost, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_sales_price, ss_ext_wholesale_cost, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_sales_price, ss_ext_wholesale_cost, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_sales_price, ss_ext_wholesale_cost, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_sales_price, ss_ext_wholesale_cost, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -452,10 +452,10 @@ mod tests { ┌───── Stage 14 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 19 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([c_customer_id@0, c_first_name@1, c_last_name@2, c_preferred_cust_flag@3, c_birth_country@4, c_login@5, c_email_address@6, d_year@7], 6), input_partitions=3 @@ -467,10 +467,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 18] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_ext_discount_amt, cs_ext_sales_price, cs_ext_wholesale_cost, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_ext_discount_amt, cs_ext_sales_price, cs_ext_wholesale_cost, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_ext_discount_amt, cs_ext_sales_price, cs_ext_wholesale_cost, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_ext_discount_amt, cs_ext_sales_price, cs_ext_wholesale_cost, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_ext_discount_amt, cs_ext_sales_price, cs_ext_wholesale_cost, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_ext_discount_amt, cs_ext_sales_price, cs_ext_wholesale_cost, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_ext_discount_amt, cs_ext_sales_price, cs_ext_wholesale_cost, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_ext_discount_amt, cs_ext_sales_price, cs_ext_wholesale_cost, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 17 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -484,10 +484,10 @@ mod tests { ┌───── Stage 18 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 23 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([c_customer_id@0, c_first_name@1, c_last_name@2, c_preferred_cust_flag@3, c_birth_country@4, c_login@5, c_email_address@6, d_year@7], 6), input_partitions=3 @@ -499,10 +499,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 22] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_sales_price, ws_ext_wholesale_cost, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_sales_price, ws_ext_wholesale_cost, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_sales_price, ws_ext_wholesale_cost, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_sales_price, ws_ext_wholesale_cost, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_sales_price, ws_ext_wholesale_cost, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_sales_price, ws_ext_wholesale_cost, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_sales_price, ws_ext_wholesale_cost, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_sales_price, ws_ext_wholesale_cost, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 21 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -516,10 +516,10 @@ mod tests { ┌───── Stage 22 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -560,11 +560,11 @@ mod tests { │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedUnionExec: t0:[c0(0/2)] t1:[c0(1/2)] t2:[c1(0/2)] t3:[c1(1/2)] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_store_sk@7 as store_sk, ss_sold_date_sk@0 as date_sk, ss_ext_sales_price@15 as sales_price, ss_net_profit@22 as profit, 0.00 as return_amt, 0.00 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_store_sk@7 as store_sk, ss_sold_date_sk@0 as date_sk, ss_ext_sales_price@15 as sales_price, ss_net_profit@22 as profit, 0.00 as return_amt, 0.00 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_store_sk@7 as store_sk, ss_sold_date_sk@0 as date_sk, ss_ext_sales_price@15 as sales_price, ss_net_profit@22 as profit, 0.00 as return_amt, 0.00 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_store_sk@7 as store_sk, ss_sold_date_sk@0 as date_sk, ss_ext_sales_price@15 as sales_price, ss_net_profit@22 as profit, 0.00 as return_amt, 0.00 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_store_sk@7 as store_sk, sr_returned_date_sk@0 as date_sk, 0.00 as sales_price, 0.00 as profit, sr_return_amt@11 as return_amt, sr_net_loss@19 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_store_sk@7 as store_sk, sr_returned_date_sk@0 as date_sk, 0.00 as sales_price, 0.00 as profit, sr_return_amt@11 as return_amt, sr_net_loss@19 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_store_sk@7 as store_sk, sr_returned_date_sk@0 as date_sk, 0.00 as sales_price, 0.00 as profit, sr_return_amt@11 as return_amt, sr_net_loss@19 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_store_sk@7 as store_sk, sr_returned_date_sk@0 as date_sk, 0.00 as sales_price, 0.00 as profit, sr_return_amt@11 as return_amt, sr_net_loss@19 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -590,10 +590,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_page/part-1.parquet:..]]}, projection=[cp_catalog_page_sk, cp_catalog_page_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-1.parquet:..]]}, projection=[cp_catalog_page_sk, cp_catalog_page_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-1.parquet:..]]}, projection=[cp_catalog_page_sk, cp_catalog_page_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_page/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_page/part-3.parquet:..]]}, projection=[cp_catalog_page_sk, cp_catalog_page_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_page/part-1.parquet:..]]}, projection=[cp_catalog_page_sk, cp_catalog_page_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-1.parquet:..]]}, projection=[cp_catalog_page_sk, cp_catalog_page_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-1.parquet:..]]}, projection=[cp_catalog_page_sk, cp_catalog_page_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_page/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_page/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_page/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_page/part-3.parquet:..]]}, projection=[cp_catalog_page_sk, cp_catalog_page_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -602,11 +602,11 @@ mod tests { │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedUnionExec: t0:[c0(0/2)] t1:[c0(1/2)] t2:[c1(0/2)] t3:[c1(1/2)] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_catalog_page_sk@12 as page_sk, cs_sold_date_sk@0 as date_sk, cs_ext_sales_price@23 as sales_price, cs_net_profit@33 as profit, 0.00 as return_amt, 0.00 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_catalog_page_sk@12 as page_sk, cs_sold_date_sk@0 as date_sk, cs_ext_sales_price@23 as sales_price, cs_net_profit@33 as profit, 0.00 as return_amt, 0.00 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_catalog_page_sk@12 as page_sk, cs_sold_date_sk@0 as date_sk, cs_ext_sales_price@23 as sales_price, cs_net_profit@33 as profit, 0.00 as return_amt, 0.00 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_catalog_page_sk@12 as page_sk, cs_sold_date_sk@0 as date_sk, cs_ext_sales_price@23 as sales_price, cs_net_profit@33 as profit, 0.00 as return_amt, 0.00 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_catalog_page_sk@12 as page_sk, cr_returned_date_sk@0 as date_sk, 0.00 as sales_price, 0.00 as profit, cr_return_amount@18 as return_amt, cr_net_loss@26 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_catalog_page_sk@12 as page_sk, cr_returned_date_sk@0 as date_sk, 0.00 as sales_price, 0.00 as profit, cr_return_amount@18 as return_amt, cr_net_loss@26 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_catalog_page_sk@12 as page_sk, cr_returned_date_sk@0 as date_sk, 0.00 as sales_price, 0.00 as profit, cr_return_amount@18 as return_amt, cr_net_loss@26 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_catalog_page_sk@12 as page_sk, cr_returned_date_sk@0 as date_sk, 0.00 as sales_price, 0.00 as profit, cr_return_amount@18 as return_amt, cr_net_loss@26 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -628,8 +628,8 @@ mod tests { │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedUnionExec: t0:[c0(0/2)] t1:[c0(1/2)] t2:[c1(0/2)] t3:[c1(1/2)] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_web_site_sk@13 as wsr_web_site_sk, ws_sold_date_sk@0 as date_sk, ws_ext_sales_price@23 as sales_price, ws_net_profit@33 as profit, 0.00 as return_amt, 0.00 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_web_site_sk@13 as wsr_web_site_sk, ws_sold_date_sk@0 as date_sk, ws_ext_sales_price@23 as sales_price, ws_net_profit@33 as profit, 0.00 as return_amt, 0.00 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_web_site_sk@13 as wsr_web_site_sk, ws_sold_date_sk@0 as date_sk, ws_ext_sales_price@23 as sales_price, ws_net_profit@33 as profit, 0.00 as return_amt, 0.00 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_web_site_sk@13 as wsr_web_site_sk, ws_sold_date_sk@0 as date_sk, ws_ext_sales_price@23 as sales_price, ws_net_profit@33 as profit, 0.00 as return_amt, 0.00 as net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible │ ProjectionExec: expr=[ws_web_site_sk@0 as wsr_web_site_sk, wr_returned_date_sk@1 as date_sk, 0.00 as sales_price, 0.00 as profit, wr_return_amt@2 as return_amt, wr_net_loss@3 as net_loss] │ HashJoinExec: mode=Partitioned, join_type=Left, on=[(wr_item_sk@1, ws_item_sk@0), (wr_order_number@2, ws_order_number@2)], projection=[ws_web_site_sk@6, wr_returned_date_sk@0, wr_return_amt@3, wr_net_loss@4] │ [Stage 9] => NetworkShuffleExec: output_partitions=3, input_tasks=4 @@ -655,18 +655,18 @@ mod tests { ┌───── Stage 9 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([wr_item_sk@1, wr_order_number@2], 6), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_order_number, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_order_number, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_order_number, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_order_number, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_order_number, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_order_number, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_order_number, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_order_number, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 10 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([ws_item_sk@0, ws_order_number@2], 6), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_item_sk, ws_web_site_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_item_sk, ws_web_site_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_item_sk, ws_web_site_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_item_sk, ws_web_site_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_item_sk, ws_web_site_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_item_sk, ws_web_site_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_item_sk, ws_web_site_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_item_sk, ws_web_site_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -705,10 +705,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -743,18 +743,18 @@ mod tests { ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_category], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_category], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_current_price, i_category], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_current_price, i_category], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_category], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_category], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_current_price, i_category], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_current_price, i_category], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -762,10 +762,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -821,10 +821,10 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -847,10 +847,10 @@ mod tests { ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_cdemo_sk@2], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_promo_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_promo_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_promo_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_promo_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_promo_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_promo_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_promo_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_promo_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -882,10 +882,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -917,10 +917,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -934,10 +934,10 @@ mod tests { ┌───── Stage 5 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:..]]}, projection=[s_store_sk, s_store_name, s_zip], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:..]]}, projection=[s_store_sk, s_store_name, s_zip], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_store_name, s_zip], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_store_name, s_zip], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:..]]}, projection=[s_store_sk, s_store_name, s_zip], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:..]]}, projection=[s_store_sk, s_store_name, s_zip], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_store_name, s_zip], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_store_name, s_zip], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1198,12 +1198,12 @@ mod tests { │ CoalescePartitionsExec │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_ship_customer_sk@1] │ CoalescePartitionsExec │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_ship_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_ship_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 @@ -1211,10 +1211,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1230,10 +1230,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1241,10 +1241,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1323,10 +1323,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1363,10 +1363,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1380,10 +1380,10 @@ mod tests { ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 11 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([c_customer_id@0, c_first_name@1, c_last_name@2, c_preferred_cust_flag@3, c_birth_country@4, c_login@5, c_email_address@6, d_year@7], 6), input_partitions=3 @@ -1395,10 +1395,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 10] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_discount_amt, ss_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1412,10 +1412,10 @@ mod tests { ┌───── Stage 10 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 15 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([c_customer_id@0, c_first_name@1, c_last_name@2, c_preferred_cust_flag@3, c_birth_country@4, c_login@5, c_email_address@6, d_year@7], 6), input_partitions=3 @@ -1427,10 +1427,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 14] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_ext_discount_amt, ws_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1444,10 +1444,10 @@ mod tests { ┌───── Stage 14 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name, c_preferred_cust_flag, c_birth_country, c_login, c_email_address], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -1479,10 +1479,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1575,10 +1575,10 @@ mod tests { │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 │ FilterExec: (ss_net_profit@9 >= 100.00 AND ss_net_profit@9 <= 200.00 OR ss_net_profit@9 >= 150.00 AND ss_net_profit@9 <= 300.00 OR ss_net_profit@9 >= 50.00 AND ss_net_profit@9 <= 250.00) AND (ss_sales_price@6 >= 100.00 AND ss_sales_price@6 <= 150.00 OR ss_sales_price@6 >= 50.00 AND ss_sales_price@6 <= 100.00 OR ss_sales_price@6 >= 150.00 AND ss_sales_price@6 <= 200.00) │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_ext_sales_price, ss_ext_wholesale_cost, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= 100.00 AND ss_net_profit@22 <= 200.00 OR ss_net_profit@22 >= 150.00 AND ss_net_profit@22 <= 300.00 OR ss_net_profit@22 >= 50.00 AND ss_net_profit@22 <= 250.00) AND (ss_sales_price@13 >= 100.00 AND ss_sales_price@13 <= 150.00 OR ss_sales_price@13 >= 50.00 AND ss_sales_price@13 <= 100.00 OR ss_sales_price@13 >= 150.00 AND ss_sales_price@13 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 100.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 200.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 150.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 300.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 50.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 250.00) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 100.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 150.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 50.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 100.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 150.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 200.00), required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_ext_sales_price, ss_ext_wholesale_cost, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= 100.00 AND ss_net_profit@22 <= 200.00 OR ss_net_profit@22 >= 150.00 AND ss_net_profit@22 <= 300.00 OR ss_net_profit@22 >= 50.00 AND ss_net_profit@22 <= 250.00) AND (ss_sales_price@13 >= 100.00 AND ss_sales_price@13 <= 150.00 OR ss_sales_price@13 >= 50.00 AND ss_sales_price@13 <= 100.00 OR ss_sales_price@13 >= 150.00 AND ss_sales_price@13 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 100.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 200.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 150.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 300.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 50.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 250.00) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 100.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 150.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 50.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 100.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 150.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 200.00), required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_ext_sales_price, ss_ext_wholesale_cost, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= 100.00 AND ss_net_profit@22 <= 200.00 OR ss_net_profit@22 >= 150.00 AND ss_net_profit@22 <= 300.00 OR ss_net_profit@22 >= 50.00 AND ss_net_profit@22 <= 250.00) AND (ss_sales_price@13 >= 100.00 AND ss_sales_price@13 <= 150.00 OR ss_sales_price@13 >= 50.00 AND ss_sales_price@13 <= 100.00 OR ss_sales_price@13 >= 150.00 AND ss_sales_price@13 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 100.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 200.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 150.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 300.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 50.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 250.00) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 100.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 150.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 50.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 100.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 150.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 200.00), required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_ext_sales_price, ss_ext_wholesale_cost, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= 100.00 AND ss_net_profit@22 <= 200.00 OR ss_net_profit@22 >= 150.00 AND ss_net_profit@22 <= 300.00 OR ss_net_profit@22 >= 50.00 AND ss_net_profit@22 <= 250.00) AND (ss_sales_price@13 >= 100.00 AND ss_sales_price@13 <= 150.00 OR ss_sales_price@13 >= 50.00 AND ss_sales_price@13 <= 100.00 OR ss_sales_price@13 >= 150.00 AND ss_sales_price@13 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 100.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 200.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 150.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 300.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 50.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 250.00) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 100.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 150.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 50.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 100.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 150.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 200.00), required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_ext_sales_price, ss_ext_wholesale_cost, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= 100.00 AND ss_net_profit@22 <= 200.00 OR ss_net_profit@22 >= 150.00 AND ss_net_profit@22 <= 300.00 OR ss_net_profit@22 >= 50.00 AND ss_net_profit@22 <= 250.00) AND (ss_sales_price@13 >= 100.00 AND ss_sales_price@13 <= 150.00 OR ss_sales_price@13 >= 50.00 AND ss_sales_price@13 <= 100.00 OR ss_sales_price@13 >= 150.00 AND ss_sales_price@13 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 100.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 200.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 150.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 300.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 50.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 250.00) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 100.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 150.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 50.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 100.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 150.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 200.00), required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_ext_sales_price, ss_ext_wholesale_cost, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= 100.00 AND ss_net_profit@22 <= 200.00 OR ss_net_profit@22 >= 150.00 AND ss_net_profit@22 <= 300.00 OR ss_net_profit@22 >= 50.00 AND ss_net_profit@22 <= 250.00) AND (ss_sales_price@13 >= 100.00 AND ss_sales_price@13 <= 150.00 OR ss_sales_price@13 >= 50.00 AND ss_sales_price@13 <= 100.00 OR ss_sales_price@13 >= 150.00 AND ss_sales_price@13 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 100.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 200.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 150.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 300.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 50.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 250.00) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 100.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 150.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 50.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 100.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 150.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 200.00), required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_ext_sales_price, ss_ext_wholesale_cost, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= 100.00 AND ss_net_profit@22 <= 200.00 OR ss_net_profit@22 >= 150.00 AND ss_net_profit@22 <= 300.00 OR ss_net_profit@22 >= 50.00 AND ss_net_profit@22 <= 250.00) AND (ss_sales_price@13 >= 100.00 AND ss_sales_price@13 <= 150.00 OR ss_sales_price@13 >= 50.00 AND ss_sales_price@13 <= 100.00 OR ss_sales_price@13 >= 150.00 AND ss_sales_price@13 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 100.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 200.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 150.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 300.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 50.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 250.00) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 100.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 150.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 50.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 100.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 150.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 200.00), required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_ext_sales_price, ss_ext_wholesale_cost, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= 100.00 AND ss_net_profit@22 <= 200.00 OR ss_net_profit@22 >= 150.00 AND ss_net_profit@22 <= 300.00 OR ss_net_profit@22 >= 50.00 AND ss_net_profit@22 <= 250.00) AND (ss_sales_price@13 >= 100.00 AND ss_sales_price@13 <= 150.00 OR ss_sales_price@13 >= 50.00 AND ss_sales_price@13 <= 100.00 OR ss_sales_price@13 >= 150.00 AND ss_sales_price@13 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 100.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 200.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 150.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 300.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 50.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 250.00) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 100.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 150.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 50.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 100.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 150.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 200.00), required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -1643,20 +1643,20 @@ mod tests { │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=6, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible │ ProjectionExec: expr=[cs_quantity@0 as quantity, cs_list_price@1 as list_price] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_quantity@2, cs_list_price@3] │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible │ ProjectionExec: expr=[ws_quantity@0 as quantity, ws_list_price@1 as list_price] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[ws_quantity@2, ws_list_price@3] │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p5] t1:[p6..p11] t2:[p12..p17] t3:[p18..p23] │ BroadcastExec: input_partitions=3, consumer_tasks=2, output_partitions=6 @@ -1698,10 +1698,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 17] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 15 ── Tasks: t0:[p0..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1727,10 +1727,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1758,10 +1758,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 10] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1791,10 +1791,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 12 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1808,10 +1808,10 @@ mod tests { ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 16 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1845,20 +1845,20 @@ mod tests { │ CoalescePartitionsExec │ [Stage 19] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=6, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible │ ProjectionExec: expr=[cs_quantity@0 as quantity, cs_list_price@1 as list_price] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_quantity@2, cs_list_price@3] │ CoalescePartitionsExec │ [Stage 20] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible │ ProjectionExec: expr=[ws_quantity@0 as quantity, ws_list_price@1 as list_price] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[ws_quantity@2, ws_list_price@3] │ CoalescePartitionsExec │ [Stage 21] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 19 ── Tasks: t0:[p0..p5] t1:[p6..p11] t2:[p12..p17] t3:[p18..p23] │ BroadcastExec: input_partitions=3, consumer_tasks=2, output_partitions=6 @@ -1900,10 +1900,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 35] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 33 ── Tasks: t0:[p0..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1929,10 +1929,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 25] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 24 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1960,10 +1960,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 28] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 27 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1993,10 +1993,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 31] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 30 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -2010,10 +2010,10 @@ mod tests { ┌───── Stage 31 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 34 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -2047,20 +2047,20 @@ mod tests { │ CoalescePartitionsExec │ [Stage 37] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=6, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_quantity, ss_list_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible │ ProjectionExec: expr=[cs_quantity@0 as quantity, cs_list_price@1 as list_price] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_quantity@2, cs_list_price@3] │ CoalescePartitionsExec │ [Stage 38] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible │ ProjectionExec: expr=[ws_quantity@0 as quantity, ws_list_price@1 as list_price] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[ws_quantity@2, ws_list_price@3] │ CoalescePartitionsExec │ [Stage 39] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 37 ── Tasks: t0:[p0..p5] t1:[p6..p11] t2:[p12..p17] t3:[p18..p23] │ BroadcastExec: input_partitions=3, consumer_tasks=2, output_partitions=6 @@ -2102,10 +2102,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 53] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 51 ── Tasks: t0:[p0..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -2131,10 +2131,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 43] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 42 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -2162,10 +2162,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 46] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 45 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -2195,10 +2195,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 49] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 48 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -2212,10 +2212,10 @@ mod tests { ┌───── Stage 49 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 52 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -2263,10 +2263,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -2280,18 +2280,18 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -2315,9 +2315,9 @@ mod tests { │ CoalescePartitionsExec │ [Stage 4] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_warehouse_sk, cs_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_warehouse_sk, cs_order_number], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_order_number], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(cc_call_center_sk@0, cs_call_center_sk@0)], projection=[cs_warehouse_sk@2, cs_order_number@3, cs_ext_ship_cost@4, cs_net_profit@5] @@ -2330,10 +2330,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_ship_date_sk, cs_ship_addr_sk, cs_call_center_sk, cs_warehouse_sk, cs_order_number, cs_ext_ship_cost, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_ship_date_sk, cs_ship_addr_sk, cs_call_center_sk, cs_warehouse_sk, cs_order_number, cs_ext_ship_cost, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_ship_date_sk, cs_ship_addr_sk, cs_call_center_sk, cs_warehouse_sk, cs_order_number, cs_ext_ship_cost, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_ship_date_sk, cs_ship_addr_sk, cs_call_center_sk, cs_warehouse_sk, cs_order_number, cs_ext_ship_cost, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_ship_date_sk, cs_ship_addr_sk, cs_call_center_sk, cs_warehouse_sk, cs_order_number, cs_ext_ship_cost, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_ship_date_sk, cs_ship_addr_sk, cs_call_center_sk, cs_warehouse_sk, cs_order_number, cs_ext_ship_cost, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_ship_date_sk, cs_ship_addr_sk, cs_call_center_sk, cs_warehouse_sk, cs_order_number, cs_ext_ship_cost, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_ship_date_sk, cs_ship_addr_sk, cs_call_center_sk, cs_warehouse_sk, cs_order_number, cs_ext_ship_cost, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -2449,10 +2449,10 @@ mod tests { ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cs_bill_customer_sk@1, cs_item_sk@2], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([sr_customer_sk@6, sr_item_sk@5], 12), input_partitions=3 @@ -2463,18 +2463,18 @@ mod tests { ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([sr_customer_sk@2, sr_item_sk@1, sr_ticket_number@3], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_customer_sk@2, ss_item_sk@1, ss_ticket_number@4], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -2500,10 +2500,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -2548,10 +2548,10 @@ mod tests { │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: c_birth_month@3 IN (SET) ([1, 6, 8, 9, 12, 2]), projection=[c_customer_sk@0, c_current_cdemo_sk@1, c_current_addr_sk@2, c_birth_year@4] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk, c_birth_month, c_birth_year], file_type=parquet, predicate=c_birth_month@12 IN (SET) ([1, 6, 8, 9, 12, 2]) AND DynamicFilter [ empty ], pruning_predicate=c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 1 AND 1 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 6 AND 6 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 8 AND 8 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 9 AND 9 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 12 AND 12 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 2 AND 2 <= c_birth_month_max@1, required_guarantees=[c_birth_month in (1, 12, 2, 6, 8, 9)] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk, c_birth_month, c_birth_year], file_type=parquet, predicate=c_birth_month@12 IN (SET) ([1, 6, 8, 9, 12, 2]) AND DynamicFilter [ empty ], pruning_predicate=c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 1 AND 1 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 6 AND 6 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 8 AND 8 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 9 AND 9 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 12 AND 12 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 2 AND 2 <= c_birth_month_max@1, required_guarantees=[c_birth_month in (1, 12, 2, 6, 8, 9)] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk, c_birth_month, c_birth_year], file_type=parquet, predicate=c_birth_month@12 IN (SET) ([1, 6, 8, 9, 12, 2]) AND DynamicFilter [ empty ], pruning_predicate=c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 1 AND 1 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 6 AND 6 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 8 AND 8 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 9 AND 9 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 12 AND 12 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 2 AND 2 <= c_birth_month_max@1, required_guarantees=[c_birth_month in (1, 12, 2, 6, 8, 9)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk, c_birth_month, c_birth_year], file_type=parquet, predicate=c_birth_month@12 IN (SET) ([1, 6, 8, 9, 12, 2]) AND DynamicFilter [ empty ], pruning_predicate=c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 1 AND 1 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 6 AND 6 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 8 AND 8 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 9 AND 9 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 12 AND 12 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 2 AND 2 <= c_birth_month_max@1, required_guarantees=[c_birth_month in (1, 12, 2, 6, 8, 9)] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk, c_birth_month, c_birth_year], file_type=parquet, predicate=c_birth_month@12 IN (SET) ([1, 6, 8, 9, 12, 2]) AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 1 AND 1 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 6 AND 6 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 8 AND 8 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 9 AND 9 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 12 AND 12 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 2 AND 2 <= c_birth_month_max@1, required_guarantees=[c_birth_month in (1, 12, 2, 6, 8, 9)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk, c_birth_month, c_birth_year], file_type=parquet, predicate=c_birth_month@12 IN (SET) ([1, 6, 8, 9, 12, 2]) AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 1 AND 1 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 6 AND 6 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 8 AND 8 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 9 AND 9 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 12 AND 12 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 2 AND 2 <= c_birth_month_max@1, required_guarantees=[c_birth_month in (1, 12, 2, 6, 8, 9)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk, c_birth_month, c_birth_year], file_type=parquet, predicate=c_birth_month@12 IN (SET) ([1, 6, 8, 9, 12, 2]) AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 1 AND 1 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 6 AND 6 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 8 AND 8 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 9 AND 9 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 12 AND 12 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 2 AND 2 <= c_birth_month_max@1, required_guarantees=[c_birth_month in (1, 12, 2, 6, 8, 9)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk, c_birth_month, c_birth_year], file_type=parquet, predicate=c_birth_month@12 IN (SET) ([1, 6, 8, 9, 12, 2]) AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 1 AND 1 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 6 AND 6 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 8 AND 8 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 9 AND 9 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 12 AND 12 <= c_birth_month_max@1 OR c_birth_month_null_count@2 != row_count@3 AND c_birth_month_min@0 <= 2 AND 2 <= c_birth_month_max@1, required_guarantees=[c_birth_month in (1, 12, 2, 6, 8, 9)] └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cd_demo_sk@0], 12), input_partitions=3 @@ -2565,18 +2565,18 @@ mod tests { ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cs_bill_cdemo_sk@2], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_bill_cdemo_sk, cs_item_sk, cs_quantity, cs_list_price, cs_sales_price, cs_coupon_amt, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_bill_cdemo_sk, cs_item_sk, cs_quantity, cs_list_price, cs_sales_price, cs_coupon_amt, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_bill_cdemo_sk, cs_item_sk, cs_quantity, cs_list_price, cs_sales_price, cs_coupon_amt, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_bill_cdemo_sk, cs_item_sk, cs_quantity, cs_list_price, cs_sales_price, cs_coupon_amt, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_bill_cdemo_sk, cs_item_sk, cs_quantity, cs_list_price, cs_sales_price, cs_coupon_amt, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_bill_cdemo_sk, cs_item_sk, cs_quantity, cs_list_price, cs_sales_price, cs_coupon_amt, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_bill_cdemo_sk, cs_item_sk, cs_quantity, cs_list_price, cs_sales_price, cs_coupon_amt, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_bill_cdemo_sk, cs_item_sk, cs_quantity, cs_list_price, cs_sales_price, cs_coupon_amt, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cd_demo_sk@0], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -2605,10 +2605,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -2624,10 +2624,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -2638,10 +2638,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -2691,10 +2691,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -2747,10 +2747,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -2805,10 +2805,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -2878,10 +2878,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity, cs_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -2910,18 +2910,18 @@ mod tests { │ CoalescePartitionsExec │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[substr(i_item_desc@4, 1, 30) as itemdesc, i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[substr(i_item_desc@4, 1, 30) as itemdesc, i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[substr(i_item_desc@4, 1, 30) as itemdesc, i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[substr(i_item_desc@4, 1, 30) as itemdesc, i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[substr(i_item_desc@4, 1, 30) as itemdesc, i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[substr(i_item_desc@4, 1, 30) as itemdesc, i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[substr(i_item_desc@4, 1, 30) as itemdesc, i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[substr(i_item_desc@4, 1, 30) as itemdesc, i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -2943,10 +2943,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 12 ── Tasks: t0:[p0..p3] │ BroadcastExec: input_partitions=1, consumer_tasks=4, output_partitions=4 @@ -2971,10 +2971,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -3020,10 +3020,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 16] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_quantity, ws_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 15 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -3052,18 +3052,18 @@ mod tests { │ CoalescePartitionsExec │ [Stage 19] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 18 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[substr(i_item_desc@4, 1, 30) as itemdesc, i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[substr(i_item_desc@4, 1, 30) as itemdesc, i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[substr(i_item_desc@4, 1, 30) as itemdesc, i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[substr(i_item_desc@4, 1, 30) as itemdesc, i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[substr(i_item_desc@4, 1, 30) as itemdesc, i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[substr(i_item_desc@4, 1, 30) as itemdesc, i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[substr(i_item_desc@4, 1, 30) as itemdesc, i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[substr(i_item_desc@4, 1, 30) as itemdesc, i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 19 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -3085,10 +3085,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 27] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 26 ── Tasks: t0:[p0..p3] │ BroadcastExec: input_partitions=1, consumer_tasks=4, output_partitions=4 @@ -3113,10 +3113,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 23] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 22 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -3235,10 +3235,10 @@ mod tests { ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_ticket_number@3, ss_item_sk@0], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 16 ── Tasks: t0:[p0..p2] t1:[p0..p2] │ RepartitionExec: partitioning=Hash([c_last_name@0, c_first_name@1, s_store_name@2], 3), input_partitions=3 @@ -3312,10 +3312,10 @@ mod tests { ┌───── Stage 14 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_ticket_number@3, ss_item_sk@0], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -3341,10 +3341,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -3402,10 +3402,10 @@ mod tests { ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cs_bill_customer_sk@1, cs_item_sk@2], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([sr_customer_sk@6, sr_item_sk@5], 12), input_partitions=3 @@ -3416,18 +3416,18 @@ mod tests { ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([sr_customer_sk@2, sr_item_sk@1, sr_ticket_number@3], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_customer_sk@2, ss_item_sk@1, ss_ticket_number@4], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -3475,10 +3475,10 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -3501,10 +3501,10 @@ mod tests { ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cs_bill_cdemo_sk@1], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_cdemo_sk, cs_item_sk, cs_promo_sk, cs_quantity, cs_list_price, cs_sales_price, cs_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_cdemo_sk, cs_item_sk, cs_promo_sk, cs_quantity, cs_list_price, cs_sales_price, cs_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_cdemo_sk, cs_item_sk, cs_promo_sk, cs_quantity, cs_list_price, cs_sales_price, cs_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_cdemo_sk, cs_item_sk, cs_promo_sk, cs_quantity, cs_list_price, cs_sales_price, cs_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_cdemo_sk, cs_item_sk, cs_promo_sk, cs_quantity, cs_list_price, cs_sales_price, cs_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_cdemo_sk, cs_item_sk, cs_promo_sk, cs_quantity, cs_list_price, cs_sales_price, cs_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_cdemo_sk, cs_item_sk, cs_promo_sk, cs_quantity, cs_list_price, cs_sales_price, cs_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_cdemo_sk, cs_item_sk, cs_promo_sk, cs_quantity, cs_list_price, cs_sales_price, cs_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -3551,10 +3551,10 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -3587,10 +3587,10 @@ mod tests { ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_cdemo_sk@2], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_store_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_store_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_store_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_store_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_store_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_store_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_store_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_store_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 12 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ RepartitionExec: partitioning=Hash([i_item_id@0], 3), input_partitions=3 @@ -3612,10 +3612,10 @@ mod tests { ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -3648,10 +3648,10 @@ mod tests { ┌───── Stage 11 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_cdemo_sk@2], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_store_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_store_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_store_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_store_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_store_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_store_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_store_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_store_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 18 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ AggregateExec: mode=Partial, gby=[], aggr=[avg(results.agg1), avg(results.agg2), avg(results.agg3), avg(results.agg4)] @@ -3672,46 +3672,46 @@ mod tests { ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 14 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: s_state@1 = TN, projection=[s_store_sk@0] │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:..]]}, projection=[s_store_sk, s_state], file_type=parquet, predicate=s_state@24 = TN AND DynamicFilter [ empty ], pruning_predicate=s_state_null_count@2 != row_count@3 AND s_state_min@0 <= TN AND TN <= s_state_max@1, required_guarantees=[s_state in (TN)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:..]]}, projection=[s_store_sk, s_state], file_type=parquet, predicate=s_state@24 = TN AND DynamicFilter [ empty ], pruning_predicate=s_state_null_count@2 != row_count@3 AND s_state_min@0 <= TN AND TN <= s_state_max@1, required_guarantees=[s_state in (TN)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_state], file_type=parquet, predicate=s_state@24 = TN AND DynamicFilter [ empty ], pruning_predicate=s_state_null_count@2 != row_count@3 AND s_state_min@0 <= TN AND TN <= s_state_max@1, required_guarantees=[s_state in (TN)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_state], file_type=parquet, predicate=s_state@24 = TN AND DynamicFilter [ empty ], pruning_predicate=s_state_null_count@2 != row_count@3 AND s_state_min@0 <= TN AND TN <= s_state_max@1, required_guarantees=[s_state in (TN)] + │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:..]]}, projection=[s_store_sk, s_state], file_type=parquet, predicate=s_state@24 = TN AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=s_state_null_count@2 != row_count@3 AND s_state_min@0 <= TN AND TN <= s_state_max@1, required_guarantees=[s_state in (TN)] + │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:..]]}, projection=[s_store_sk, s_state], file_type=parquet, predicate=s_state@24 = TN AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=s_state_null_count@2 != row_count@3 AND s_state_min@0 <= TN AND TN <= s_state_max@1, required_guarantees=[s_state in (TN)] + │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_state], file_type=parquet, predicate=s_state@24 = TN AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=s_state_null_count@2 != row_count@3 AND s_state_min@0 <= TN AND TN <= s_state_max@1, required_guarantees=[s_state in (TN)] + │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_state], file_type=parquet, predicate=s_state@24 = TN AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=s_state_null_count@2 != row_count@3 AND s_state_min@0 <= TN AND TN <= s_state_max@1, required_guarantees=[s_state in (TN)] └────────────────────────────────────────────────── ┌───── Stage 15 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: d_year@1 = 2002, projection=[d_date_sk@0] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002 AND DynamicFilter [ empty ], pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002 AND DynamicFilter [ empty ], pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002 AND DynamicFilter [ empty ], pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002 AND DynamicFilter [ empty ], pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_year], file_type=parquet, predicate=d_year@6 = 2002 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=d_year_null_count@2 != row_count@3 AND d_year_min@0 <= 2002 AND 2002 <= d_year_max@1, required_guarantees=[d_year in (2002)] └────────────────────────────────────────────────── ┌───── Stage 16 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cd_demo_sk@0], 12), input_partitions=3 │ FilterExec: cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College, projection=[cd_demo_sk@0] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College AND DynamicFilter [ empty ], pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College AND DynamicFilter [ empty ], pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College AND DynamicFilter [ empty ], pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College AND DynamicFilter [ empty ], pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status], file_type=parquet, predicate=cd_gender@1 = M AND cd_marital_status@2 = S AND cd_education_status@3 = College AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=cd_gender_null_count@2 != row_count@3 AND cd_gender_min@0 <= M AND M <= cd_gender_max@1 AND cd_marital_status_null_count@6 != row_count@3 AND cd_marital_status_min@4 <= S AND S <= cd_marital_status_max@5 AND cd_education_status_null_count@9 != row_count@3 AND cd_education_status_min@7 <= College AND College <= cd_education_status_max@8, required_guarantees=[cd_education_status in (College), cd_gender in (M), cd_marital_status in (S)] └────────────────────────────────────────────────── ┌───── Stage 17 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_cdemo_sk@2], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_store_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_store_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_store_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_store_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_store_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_store_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_store_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_cdemo_sk, ss_store_sk, ss_quantity, ss_list_price, ss_sales_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -3915,10 +3915,10 @@ mod tests { ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cs_bill_customer_sk@1, cs_item_sk@2], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_quantity], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([sr_customer_sk@6, sr_item_sk@5], 12), input_partitions=3 @@ -3929,18 +3929,18 @@ mod tests { ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([sr_customer_sk@2, sr_item_sk@1, sr_ticket_number@3], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number, sr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_customer_sk@2, ss_item_sk@1, ss_ticket_number@4], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number, ss_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -4103,10 +4103,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -4114,10 +4114,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -4144,18 +4144,18 @@ mod tests { │ CoalescePartitionsExec │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -4182,18 +4182,18 @@ mod tests { │ CoalescePartitionsExec │ [Stage 10] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 10 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -4220,18 +4220,18 @@ mod tests { │ CoalescePartitionsExec │ [Stage 14] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 14 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -4249,10 +4249,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 19] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 19 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -4260,10 +4260,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 18] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 18 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -4281,10 +4281,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 23] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 23 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -4292,10 +4292,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 22] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 22 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -4337,10 +4337,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -4367,10 +4367,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -4423,10 +4423,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -4440,10 +4440,10 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -4479,10 +4479,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_addr_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_addr_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_addr_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_addr_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_addr_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_addr_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_addr_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_addr_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -4496,10 +4496,10 @@ mod tests { ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -4535,10 +4535,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 14] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 11 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -4552,10 +4552,10 @@ mod tests { ┌───── Stage 12 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_manufact_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -4617,10 +4617,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_store_sk, ss_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_store_sk, ss_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_store_sk, ss_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_store_sk, ss_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_store_sk, ss_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_store_sk, ss_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_store_sk, ss_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_store_sk, ss_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -4678,12 +4678,12 @@ mod tests { │ CoalescePartitionsExec │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_ship_customer_sk@1] │ CoalescePartitionsExec │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_ship_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_ship_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 @@ -4691,10 +4691,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -4710,10 +4710,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_dep_count, cd_dep_employed_count, cd_dep_college_count], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -4721,10 +4721,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -4806,10 +4806,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -4858,10 +4858,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -4909,10 +4909,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 11 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -4958,7 +4958,7 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_date_sk@0, inv_date_sk@4)], projection=[i_item_sk@0, i_item_id@1, i_item_desc@2, i_current_price@3] @@ -4969,10 +4969,10 @@ mod tests { │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ FilterExec: inv_quantity_on_hand@2 >= 100 AND inv_quantity_on_hand@2 <= 500, projection=[inv_date_sk@0, inv_item_sk@1] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -4987,10 +4987,10 @@ mod tests { │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_current_price@3 >= 68.00 AND i_current_price@3 <= 98.00 AND i_manufact_id@4 IN (SET) ([677, 940, 694, 808]), projection=[i_item_sk@0, i_item_id@1, i_item_desc@2, i_current_price@3] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= 68.00 AND i_current_price@5 <= 98.00 AND i_manufact_id@13 IN (SET) ([677, 940, 694, 808]) AND DynamicFilter [ empty ], pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 68.00 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 98.00 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 677 AND 677 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 940 AND 940 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 694 AND 694 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 808 AND 808 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (677, 694, 808, 940)] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= 68.00 AND i_current_price@5 <= 98.00 AND i_manufact_id@13 IN (SET) ([677, 940, 694, 808]) AND DynamicFilter [ empty ], pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 68.00 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 98.00 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 677 AND 677 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 940 AND 940 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 694 AND 694 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 808 AND 808 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (677, 694, 808, 940)] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= 68.00 AND i_current_price@5 <= 98.00 AND i_manufact_id@13 IN (SET) ([677, 940, 694, 808]) AND DynamicFilter [ empty ], pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 68.00 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 98.00 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 677 AND 677 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 940 AND 940 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 694 AND 694 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 808 AND 808 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (677, 694, 808, 940)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= 68.00 AND i_current_price@5 <= 98.00 AND i_manufact_id@13 IN (SET) ([677, 940, 694, 808]) AND DynamicFilter [ empty ], pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 68.00 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 98.00 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 677 AND 677 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 940 AND 940 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 694 AND 694 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 808 AND 808 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (677, 694, 808, 940)] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= 68.00 AND i_current_price@5 <= 98.00 AND i_manufact_id@13 IN (SET) ([677, 940, 694, 808]) AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 68.00 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 98.00 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 677 AND 677 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 940 AND 940 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 694 AND 694 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 808 AND 808 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (677, 694, 808, 940)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= 68.00 AND i_current_price@5 <= 98.00 AND i_manufact_id@13 IN (SET) ([677, 940, 694, 808]) AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 68.00 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 98.00 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 677 AND 677 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 940 AND 940 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 694 AND 694 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 808 AND 808 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (677, 694, 808, 940)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= 68.00 AND i_current_price@5 <= 98.00 AND i_manufact_id@13 IN (SET) ([677, 940, 694, 808]) AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 68.00 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 98.00 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 677 AND 677 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 940 AND 940 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 694 AND 694 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 808 AND 808 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (677, 694, 808, 940)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= 68.00 AND i_current_price@5 <= 98.00 AND i_manufact_id@13 IN (SET) ([677, 940, 694, 808]) AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 68.00 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 98.00 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 677 AND 677 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 940 AND 940 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 694 AND 694 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 808 AND 808 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (677, 694, 808, 940)] └────────────────────────────────────────────────── "); Ok(()) @@ -5029,10 +5029,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -5061,10 +5061,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -5093,10 +5093,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -5152,10 +5152,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -5204,10 +5204,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -5305,10 +5305,10 @@ mod tests { ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cs_order_number@3, cs_item_sk@2], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_warehouse_sk, cs_item_sk, cs_order_number, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_warehouse_sk, cs_item_sk, cs_order_number, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_warehouse_sk, cs_item_sk, cs_order_number, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_warehouse_sk, cs_item_sk, cs_order_number, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_warehouse_sk, cs_item_sk, cs_order_number, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_warehouse_sk, cs_item_sk, cs_order_number, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_warehouse_sk, cs_item_sk, cs_order_number, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_warehouse_sk, cs_item_sk, cs_order_number, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "#); Ok(()) @@ -5332,10 +5332,10 @@ mod tests { │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=1 │ FilterExec: i_manufact_id@0 >= 738 AND i_manufact_id@0 <= 778, projection=[i_manufact@1, i_product_name@2] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_manufact_id, i_manufact, i_product_name], file_type=parquet, predicate=i_manufact_id@13 >= 738 AND i_manufact_id@13 <= 778 AND DynamicFilter [ empty ], pruning_predicate=i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_max@0 >= 738 AND i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_min@3 <= 778, required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_manufact_id, i_manufact, i_product_name], file_type=parquet, predicate=i_manufact_id@13 >= 738 AND i_manufact_id@13 <= 778 AND DynamicFilter [ empty ], pruning_predicate=i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_max@0 >= 738 AND i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_min@3 <= 778, required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_manufact_id, i_manufact, i_product_name], file_type=parquet, predicate=i_manufact_id@13 >= 738 AND i_manufact_id@13 <= 778 AND DynamicFilter [ empty ], pruning_predicate=i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_max@0 >= 738 AND i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_min@3 <= 778, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_manufact_id, i_manufact, i_product_name], file_type=parquet, predicate=i_manufact_id@13 >= 738 AND i_manufact_id@13 <= 778 AND DynamicFilter [ empty ], pruning_predicate=i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_max@0 >= 738 AND i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_min@3 <= 778, required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_manufact_id, i_manufact, i_product_name], file_type=parquet, predicate=i_manufact_id@13 >= 738 AND i_manufact_id@13 <= 778 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_max@0 >= 738 AND i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_min@3 <= 778, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_manufact_id, i_manufact, i_product_name], file_type=parquet, predicate=i_manufact_id@13 >= 738 AND i_manufact_id@13 <= 778 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_max@0 >= 738 AND i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_min@3 <= 778, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_manufact_id, i_manufact, i_product_name], file_type=parquet, predicate=i_manufact_id@13 >= 738 AND i_manufact_id@13 <= 778 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_max@0 >= 738 AND i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_min@3 <= 778, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_manufact_id, i_manufact, i_product_name], file_type=parquet, predicate=i_manufact_id@13 >= 738 AND i_manufact_id@13 <= 778 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_max@0 >= 738 AND i_manufact_id_null_count@1 != row_count@2 AND i_manufact_id_min@3 <= 778, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -5379,10 +5379,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -5429,20 +5429,20 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: s_gmt_offset@3 = -5.00, projection=[s_store_sk@0, s_store_id@1, s_store_name@2] │ RepartitionExec: partitioning=RoundRobinBatch(3), input_partitions=2 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:..]]}, projection=[s_store_sk, s_store_id, s_store_name, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = -5.00 AND DynamicFilter [ empty ], pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= -5.00 AND -5.00 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (-5.00)] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:..]]}, projection=[s_store_sk, s_store_id, s_store_name, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = -5.00 AND DynamicFilter [ empty ], pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= -5.00 AND -5.00 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (-5.00)] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_store_id, s_store_name, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = -5.00 AND DynamicFilter [ empty ], pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= -5.00 AND -5.00 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (-5.00)] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_store_id, s_store_name, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = -5.00 AND DynamicFilter [ empty ], pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= -5.00 AND -5.00 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (-5.00)] + │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:..]]}, projection=[s_store_sk, s_store_id, s_store_name, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = -5.00 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= -5.00 AND -5.00 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (-5.00)] + │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:..]]}, projection=[s_store_sk, s_store_id, s_store_name, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = -5.00 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= -5.00 AND -5.00 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (-5.00)] + │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_store_id, s_store_name, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = -5.00 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= -5.00 AND -5.00 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (-5.00)] + │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_store_id, s_store_name, s_gmt_offset], file_type=parquet, predicate=s_gmt_offset@27 = -5.00 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=s_gmt_offset_null_count@2 != row_count@3 AND s_gmt_offset_min@0 <= -5.00 AND -5.00 <= s_gmt_offset_max@1, required_guarantees=[s_gmt_offset in (-5.00)] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -5610,10 +5610,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -5644,18 +5644,18 @@ mod tests { ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_city, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_city, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_city, ca_zip], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -5691,10 +5691,10 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_ticket_number@0, ss_customer_sk@1, ss_addr_sk@2, ca_city@3], 12), input_partitions=3 @@ -5712,10 +5712,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_ticket_number, ss_coupon_amt, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_ticket_number, ss_coupon_amt, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_ticket_number, ss_coupon_amt, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_ticket_number, ss_coupon_amt, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_ticket_number, ss_coupon_amt, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_ticket_number, ss_coupon_amt, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_ticket_number, ss_coupon_amt, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_ticket_number, ss_coupon_amt, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -5808,10 +5808,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -5856,10 +5856,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -5904,10 +5904,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 11 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -5992,10 +5992,10 @@ mod tests { │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 │ FilterExec: (ss_net_profit@6 >= 0.00 AND ss_net_profit@6 <= 2000.00 OR ss_net_profit@6 >= 150.00 AND ss_net_profit@6 <= 3000.00 OR ss_net_profit@6 >= 50.00 AND ss_net_profit@6 <= 25000.00) AND (ss_sales_price@5 >= 100.00 AND ss_sales_price@5 <= 150.00 OR ss_sales_price@5 >= 50.00 AND ss_sales_price@5 <= 100.00 OR ss_sales_price@5 >= 150.00 AND ss_sales_price@5 <= 200.00) │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= 0.00 AND ss_net_profit@22 <= 2000.00 OR ss_net_profit@22 >= 150.00 AND ss_net_profit@22 <= 3000.00 OR ss_net_profit@22 >= 50.00 AND ss_net_profit@22 <= 25000.00) AND (ss_sales_price@13 >= 100.00 AND ss_sales_price@13 <= 150.00 OR ss_sales_price@13 >= 50.00 AND ss_sales_price@13 <= 100.00 OR ss_sales_price@13 >= 150.00 AND ss_sales_price@13 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 0.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 2000.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 150.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 3000.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 50.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 25000.00) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 100.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 150.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 50.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 100.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 150.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 200.00), required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= 0.00 AND ss_net_profit@22 <= 2000.00 OR ss_net_profit@22 >= 150.00 AND ss_net_profit@22 <= 3000.00 OR ss_net_profit@22 >= 50.00 AND ss_net_profit@22 <= 25000.00) AND (ss_sales_price@13 >= 100.00 AND ss_sales_price@13 <= 150.00 OR ss_sales_price@13 >= 50.00 AND ss_sales_price@13 <= 100.00 OR ss_sales_price@13 >= 150.00 AND ss_sales_price@13 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 0.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 2000.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 150.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 3000.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 50.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 25000.00) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 100.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 150.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 50.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 100.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 150.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 200.00), required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= 0.00 AND ss_net_profit@22 <= 2000.00 OR ss_net_profit@22 >= 150.00 AND ss_net_profit@22 <= 3000.00 OR ss_net_profit@22 >= 50.00 AND ss_net_profit@22 <= 25000.00) AND (ss_sales_price@13 >= 100.00 AND ss_sales_price@13 <= 150.00 OR ss_sales_price@13 >= 50.00 AND ss_sales_price@13 <= 100.00 OR ss_sales_price@13 >= 150.00 AND ss_sales_price@13 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 0.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 2000.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 150.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 3000.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 50.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 25000.00) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 100.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 150.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 50.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 100.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 150.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 200.00), required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= 0.00 AND ss_net_profit@22 <= 2000.00 OR ss_net_profit@22 >= 150.00 AND ss_net_profit@22 <= 3000.00 OR ss_net_profit@22 >= 50.00 AND ss_net_profit@22 <= 25000.00) AND (ss_sales_price@13 >= 100.00 AND ss_sales_price@13 <= 150.00 OR ss_sales_price@13 >= 50.00 AND ss_sales_price@13 <= 100.00 OR ss_sales_price@13 >= 150.00 AND ss_sales_price@13 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 0.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 2000.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 150.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 3000.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 50.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 25000.00) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 100.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 150.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 50.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 100.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 150.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 200.00), required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= 0.00 AND ss_net_profit@22 <= 2000.00 OR ss_net_profit@22 >= 150.00 AND ss_net_profit@22 <= 3000.00 OR ss_net_profit@22 >= 50.00 AND ss_net_profit@22 <= 25000.00) AND (ss_sales_price@13 >= 100.00 AND ss_sales_price@13 <= 150.00 OR ss_sales_price@13 >= 50.00 AND ss_sales_price@13 <= 100.00 OR ss_sales_price@13 >= 150.00 AND ss_sales_price@13 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 0.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 2000.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 150.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 3000.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 50.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 25000.00) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 100.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 150.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 50.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 100.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 150.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 200.00), required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= 0.00 AND ss_net_profit@22 <= 2000.00 OR ss_net_profit@22 >= 150.00 AND ss_net_profit@22 <= 3000.00 OR ss_net_profit@22 >= 50.00 AND ss_net_profit@22 <= 25000.00) AND (ss_sales_price@13 >= 100.00 AND ss_sales_price@13 <= 150.00 OR ss_sales_price@13 >= 50.00 AND ss_sales_price@13 <= 100.00 OR ss_sales_price@13 >= 150.00 AND ss_sales_price@13 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 0.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 2000.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 150.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 3000.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 50.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 25000.00) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 100.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 150.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 50.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 100.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 150.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 200.00), required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= 0.00 AND ss_net_profit@22 <= 2000.00 OR ss_net_profit@22 >= 150.00 AND ss_net_profit@22 <= 3000.00 OR ss_net_profit@22 >= 50.00 AND ss_net_profit@22 <= 25000.00) AND (ss_sales_price@13 >= 100.00 AND ss_sales_price@13 <= 150.00 OR ss_sales_price@13 >= 50.00 AND ss_sales_price@13 <= 100.00 OR ss_sales_price@13 >= 150.00 AND ss_sales_price@13 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 0.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 2000.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 150.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 3000.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 50.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 25000.00) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 100.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 150.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 50.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 100.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 150.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 200.00), required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_cdemo_sk, ss_addr_sk, ss_store_sk, ss_quantity, ss_sales_price, ss_net_profit], file_type=parquet, predicate=(ss_net_profit@22 >= 0.00 AND ss_net_profit@22 <= 2000.00 OR ss_net_profit@22 >= 150.00 AND ss_net_profit@22 <= 3000.00 OR ss_net_profit@22 >= 50.00 AND ss_net_profit@22 <= 25000.00) AND (ss_sales_price@13 >= 100.00 AND ss_sales_price@13 <= 150.00 OR ss_sales_price@13 >= 50.00 AND ss_sales_price@13 <= 100.00 OR ss_sales_price@13 >= 150.00 AND ss_sales_price@13 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=(ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 0.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 2000.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 150.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 3000.00 OR ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 >= 50.00 AND ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_min@3 <= 25000.00) AND (ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 100.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 150.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 50.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 100.00 OR ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_max@4 >= 150.00 AND ss_sales_price_null_count@5 != row_count@2 AND ss_sales_price_min@6 <= 200.00), required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -6071,10 +6071,10 @@ mod tests { │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ FilterExec: ws_net_profit@5 > 1.00 AND ws_net_paid@4 > 0.00 AND ws_quantity@3 > 0, projection=[ws_sold_date_sk@0, ws_item_sk@1, ws_order_number@2, ws_quantity@3, ws_net_paid@4] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_net_paid, ws_net_profit], file_type=parquet, predicate=ws_net_profit@33 > 1.00 AND ws_net_paid@29 > 0.00 AND ws_quantity@18 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 > 1.00 AND ws_net_paid_null_count@4 != row_count@2 AND ws_net_paid_max@3 > 0.00 AND ws_quantity_null_count@6 != row_count@2 AND ws_quantity_max@5 > 0, required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_net_paid, ws_net_profit], file_type=parquet, predicate=ws_net_profit@33 > 1.00 AND ws_net_paid@29 > 0.00 AND ws_quantity@18 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 > 1.00 AND ws_net_paid_null_count@4 != row_count@2 AND ws_net_paid_max@3 > 0.00 AND ws_quantity_null_count@6 != row_count@2 AND ws_quantity_max@5 > 0, required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_net_paid, ws_net_profit], file_type=parquet, predicate=ws_net_profit@33 > 1.00 AND ws_net_paid@29 > 0.00 AND ws_quantity@18 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 > 1.00 AND ws_net_paid_null_count@4 != row_count@2 AND ws_net_paid_max@3 > 0.00 AND ws_quantity_null_count@6 != row_count@2 AND ws_quantity_max@5 > 0, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_net_paid, ws_net_profit], file_type=parquet, predicate=ws_net_profit@33 > 1.00 AND ws_net_paid@29 > 0.00 AND ws_quantity@18 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 > 1.00 AND ws_net_paid_null_count@4 != row_count@2 AND ws_net_paid_max@3 > 0.00 AND ws_quantity_null_count@6 != row_count@2 AND ws_quantity_max@5 > 0, required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_net_paid, ws_net_profit], file_type=parquet, predicate=ws_net_profit@33 > 1.00 AND ws_net_paid@29 > 0.00 AND ws_quantity@18 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 > 1.00 AND ws_net_paid_null_count@4 != row_count@2 AND ws_net_paid_max@3 > 0.00 AND ws_quantity_null_count@6 != row_count@2 AND ws_quantity_max@5 > 0, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_net_paid, ws_net_profit], file_type=parquet, predicate=ws_net_profit@33 > 1.00 AND ws_net_paid@29 > 0.00 AND ws_quantity@18 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 > 1.00 AND ws_net_paid_null_count@4 != row_count@2 AND ws_net_paid_max@3 > 0.00 AND ws_quantity_null_count@6 != row_count@2 AND ws_quantity_max@5 > 0, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_net_paid, ws_net_profit], file_type=parquet, predicate=ws_net_profit@33 > 1.00 AND ws_net_paid@29 > 0.00 AND ws_quantity@18 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 > 1.00 AND ws_net_paid_null_count@4 != row_count@2 AND ws_net_paid_max@3 > 0.00 AND ws_quantity_null_count@6 != row_count@2 AND ws_quantity_max@5 > 0, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_net_paid, ws_net_profit], file_type=parquet, predicate=ws_net_profit@33 > 1.00 AND ws_net_paid@29 > 0.00 AND ws_quantity@18 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 > 1.00 AND ws_net_paid_null_count@4 != row_count@2 AND ws_net_paid_max@3 > 0.00 AND ws_quantity_null_count@6 != row_count@2 AND ws_quantity_max@5 > 0, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -6112,10 +6112,10 @@ mod tests { │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ FilterExec: cs_net_profit@5 > 1.00 AND cs_net_paid@4 > 0.00 AND cs_quantity@3 > 0, projection=[cs_sold_date_sk@0, cs_item_sk@1, cs_order_number@2, cs_quantity@3, cs_net_paid@4] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_net_paid, cs_net_profit], file_type=parquet, predicate=cs_net_profit@33 > 1.00 AND cs_net_paid@29 > 0.00 AND cs_quantity@18 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=cs_net_profit_null_count@1 != row_count@2 AND cs_net_profit_max@0 > 1.00 AND cs_net_paid_null_count@4 != row_count@2 AND cs_net_paid_max@3 > 0.00 AND cs_quantity_null_count@6 != row_count@2 AND cs_quantity_max@5 > 0, required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_net_paid, cs_net_profit], file_type=parquet, predicate=cs_net_profit@33 > 1.00 AND cs_net_paid@29 > 0.00 AND cs_quantity@18 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=cs_net_profit_null_count@1 != row_count@2 AND cs_net_profit_max@0 > 1.00 AND cs_net_paid_null_count@4 != row_count@2 AND cs_net_paid_max@3 > 0.00 AND cs_quantity_null_count@6 != row_count@2 AND cs_quantity_max@5 > 0, required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_net_paid, cs_net_profit], file_type=parquet, predicate=cs_net_profit@33 > 1.00 AND cs_net_paid@29 > 0.00 AND cs_quantity@18 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=cs_net_profit_null_count@1 != row_count@2 AND cs_net_profit_max@0 > 1.00 AND cs_net_paid_null_count@4 != row_count@2 AND cs_net_paid_max@3 > 0.00 AND cs_quantity_null_count@6 != row_count@2 AND cs_quantity_max@5 > 0, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_net_paid, cs_net_profit], file_type=parquet, predicate=cs_net_profit@33 > 1.00 AND cs_net_paid@29 > 0.00 AND cs_quantity@18 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=cs_net_profit_null_count@1 != row_count@2 AND cs_net_profit_max@0 > 1.00 AND cs_net_paid_null_count@4 != row_count@2 AND cs_net_paid_max@3 > 0.00 AND cs_quantity_null_count@6 != row_count@2 AND cs_quantity_max@5 > 0, required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_net_paid, cs_net_profit], file_type=parquet, predicate=cs_net_profit@33 > 1.00 AND cs_net_paid@29 > 0.00 AND cs_quantity@18 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=cs_net_profit_null_count@1 != row_count@2 AND cs_net_profit_max@0 > 1.00 AND cs_net_paid_null_count@4 != row_count@2 AND cs_net_paid_max@3 > 0.00 AND cs_quantity_null_count@6 != row_count@2 AND cs_quantity_max@5 > 0, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_net_paid, cs_net_profit], file_type=parquet, predicate=cs_net_profit@33 > 1.00 AND cs_net_paid@29 > 0.00 AND cs_quantity@18 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=cs_net_profit_null_count@1 != row_count@2 AND cs_net_profit_max@0 > 1.00 AND cs_net_paid_null_count@4 != row_count@2 AND cs_net_paid_max@3 > 0.00 AND cs_quantity_null_count@6 != row_count@2 AND cs_quantity_max@5 > 0, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_net_paid, cs_net_profit], file_type=parquet, predicate=cs_net_profit@33 > 1.00 AND cs_net_paid@29 > 0.00 AND cs_quantity@18 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=cs_net_profit_null_count@1 != row_count@2 AND cs_net_profit_max@0 > 1.00 AND cs_net_paid_null_count@4 != row_count@2 AND cs_net_paid_max@3 > 0.00 AND cs_quantity_null_count@6 != row_count@2 AND cs_quantity_max@5 > 0, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_net_paid, cs_net_profit], file_type=parquet, predicate=cs_net_profit@33 > 1.00 AND cs_net_paid@29 > 0.00 AND cs_quantity@18 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=cs_net_profit_null_count@1 != row_count@2 AND cs_net_profit_max@0 > 1.00 AND cs_net_paid_null_count@4 != row_count@2 AND cs_net_paid_max@3 > 0.00 AND cs_quantity_null_count@6 != row_count@2 AND cs_quantity_max@5 > 0, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -6168,10 +6168,10 @@ mod tests { │ RepartitionExec: partitioning=Hash([ss_ticket_number@2, ss_item_sk@1], 6), input_partitions=3 │ FilterExec: ss_net_profit@5 > 1.00 AND ss_net_paid@4 > 0.00 AND ss_quantity@3 > 0, projection=[ss_sold_date_sk@0, ss_item_sk@1, ss_ticket_number@2, ss_quantity@3, ss_net_paid@4] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_net_paid, ss_net_profit], file_type=parquet, predicate=ss_net_profit@22 > 1.00 AND ss_net_paid@20 > 0.00 AND ss_quantity@10 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 > 1.00 AND ss_net_paid_null_count@4 != row_count@2 AND ss_net_paid_max@3 > 0.00 AND ss_quantity_null_count@6 != row_count@2 AND ss_quantity_max@5 > 0, required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_net_paid, ss_net_profit], file_type=parquet, predicate=ss_net_profit@22 > 1.00 AND ss_net_paid@20 > 0.00 AND ss_quantity@10 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 > 1.00 AND ss_net_paid_null_count@4 != row_count@2 AND ss_net_paid_max@3 > 0.00 AND ss_quantity_null_count@6 != row_count@2 AND ss_quantity_max@5 > 0, required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_net_paid, ss_net_profit], file_type=parquet, predicate=ss_net_profit@22 > 1.00 AND ss_net_paid@20 > 0.00 AND ss_quantity@10 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 > 1.00 AND ss_net_paid_null_count@4 != row_count@2 AND ss_net_paid_max@3 > 0.00 AND ss_quantity_null_count@6 != row_count@2 AND ss_quantity_max@5 > 0, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_net_paid, ss_net_profit], file_type=parquet, predicate=ss_net_profit@22 > 1.00 AND ss_net_paid@20 > 0.00 AND ss_quantity@10 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 > 1.00 AND ss_net_paid_null_count@4 != row_count@2 AND ss_net_paid_max@3 > 0.00 AND ss_quantity_null_count@6 != row_count@2 AND ss_quantity_max@5 > 0, required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_net_paid, ss_net_profit], file_type=parquet, predicate=ss_net_profit@22 > 1.00 AND ss_net_paid@20 > 0.00 AND ss_quantity@10 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 > 1.00 AND ss_net_paid_null_count@4 != row_count@2 AND ss_net_paid_max@3 > 0.00 AND ss_quantity_null_count@6 != row_count@2 AND ss_quantity_max@5 > 0, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_net_paid, ss_net_profit], file_type=parquet, predicate=ss_net_profit@22 > 1.00 AND ss_net_paid@20 > 0.00 AND ss_quantity@10 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 > 1.00 AND ss_net_paid_null_count@4 != row_count@2 AND ss_net_paid_max@3 > 0.00 AND ss_quantity_null_count@6 != row_count@2 AND ss_quantity_max@5 > 0, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_net_paid, ss_net_profit], file_type=parquet, predicate=ss_net_profit@22 > 1.00 AND ss_net_paid@20 > 0.00 AND ss_quantity@10 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 > 1.00 AND ss_net_paid_null_count@4 != row_count@2 AND ss_net_paid_max@3 > 0.00 AND ss_quantity_null_count@6 != row_count@2 AND ss_quantity_max@5 > 0, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_net_paid, ss_net_profit], file_type=parquet, predicate=ss_net_profit@22 > 1.00 AND ss_net_paid@20 > 0.00 AND ss_quantity@10 > 0 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=ss_net_profit_null_count@1 != row_count@2 AND ss_net_profit_max@0 > 1.00 AND ss_net_paid_null_count@4 != row_count@2 AND ss_net_paid_max@3 > 0.00 AND ss_quantity_null_count@6 != row_count@2 AND ss_quantity_max@5 > 0, required_guarantees=[] └────────────────────────────────────────────────── "#); Ok(()) @@ -6227,26 +6227,26 @@ mod tests { ┌───── Stage 3 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:..]]}, projection=[s_store_sk, s_store_name, s_company_id, s_street_number, s_street_name, s_street_type, s_suite_number, s_city, s_county, s_state, s_zip], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:..]]}, projection=[s_store_sk, s_store_name, s_company_id, s_street_number, s_street_name, s_street_type, s_suite_number, s_city, s_county, s_state, s_zip], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_store_name, s_company_id, s_street_number, s_street_name, s_street_type, s_suite_number, s_city, s_county, s_state, s_zip], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_store_name, s_company_id, s_street_number, s_street_name, s_street_type, s_suite_number, s_city, s_county, s_state, s_zip], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:..]]}, projection=[s_store_sk, s_store_name, s_company_id, s_street_number, s_street_name, s_street_type, s_suite_number, s_city, s_county, s_state, s_zip], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:..]]}, projection=[s_store_sk, s_store_name, s_company_id, s_street_number, s_street_name, s_street_type, s_suite_number, s_city, s_county, s_state, s_zip], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_store_name, s_company_id, s_street_number, s_street_name, s_street_type, s_suite_number, s_city, s_county, s_state, s_zip], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/store/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store/part-3.parquet:..]]}, projection=[s_store_sk, s_store_name, s_company_id, s_street_number, s_street_name, s_street_type, s_suite_number, s_city, s_county, s_state, s_zip], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([sr_ticket_number@3, sr_item_sk@1, sr_customer_sk@2], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_customer_sk, sr_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_ticket_number@4, ss_item_sk@1, ss_customer_sk@2], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -6288,10 +6288,10 @@ mod tests { │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ FilterExec: ws_item_sk@1 IS NOT NULL │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_sales_price], file_type=parquet, predicate=ws_item_sk@3 IS NOT NULL AND DynamicFilter [ empty ], pruning_predicate=ws_item_sk_null_count@1 != row_count@0, required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_sales_price], file_type=parquet, predicate=ws_item_sk@3 IS NOT NULL AND DynamicFilter [ empty ], pruning_predicate=ws_item_sk_null_count@1 != row_count@0, required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_sales_price], file_type=parquet, predicate=ws_item_sk@3 IS NOT NULL AND DynamicFilter [ empty ], pruning_predicate=ws_item_sk_null_count@1 != row_count@0, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_sales_price], file_type=parquet, predicate=ws_item_sk@3 IS NOT NULL AND DynamicFilter [ empty ], pruning_predicate=ws_item_sk_null_count@1 != row_count@0, required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_sales_price], file_type=parquet, predicate=ws_item_sk@3 IS NOT NULL AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=ws_item_sk_null_count@1 != row_count@0, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_sales_price], file_type=parquet, predicate=ws_item_sk@3 IS NOT NULL AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=ws_item_sk_null_count@1 != row_count@0, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_sales_price], file_type=parquet, predicate=ws_item_sk@3 IS NOT NULL AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=ws_item_sk_null_count@1 != row_count@0, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_sales_price], file_type=parquet, predicate=ws_item_sk@3 IS NOT NULL AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=ws_item_sk_null_count@1 != row_count@0, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -6315,10 +6315,10 @@ mod tests { │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ FilterExec: ss_item_sk@1 IS NOT NULL │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_sales_price], file_type=parquet, predicate=ss_item_sk@2 IS NOT NULL AND DynamicFilter [ empty ], pruning_predicate=ss_item_sk_null_count@1 != row_count@0, required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_sales_price], file_type=parquet, predicate=ss_item_sk@2 IS NOT NULL AND DynamicFilter [ empty ], pruning_predicate=ss_item_sk_null_count@1 != row_count@0, required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_sales_price], file_type=parquet, predicate=ss_item_sk@2 IS NOT NULL AND DynamicFilter [ empty ], pruning_predicate=ss_item_sk_null_count@1 != row_count@0, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_sales_price], file_type=parquet, predicate=ss_item_sk@2 IS NOT NULL AND DynamicFilter [ empty ], pruning_predicate=ss_item_sk_null_count@1 != row_count@0, required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_sales_price], file_type=parquet, predicate=ss_item_sk@2 IS NOT NULL AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=ss_item_sk_null_count@1 != row_count@0, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_sales_price], file_type=parquet, predicate=ss_item_sk@2 IS NOT NULL AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=ss_item_sk_null_count@1 != row_count@0, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_sales_price], file_type=parquet, predicate=ss_item_sk@2 IS NOT NULL AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=ss_item_sk_null_count@1 != row_count@0, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_sales_price], file_type=parquet, predicate=ss_item_sk@2 IS NOT NULL AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=ss_item_sk_null_count@1 != row_count@0, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -6356,10 +6356,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -6414,10 +6414,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -6483,10 +6483,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 10] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_month_seq], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -6516,10 +6516,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=2 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -6532,10 +6532,10 @@ mod tests { ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_county, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_county, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -6549,10 +6549,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -6564,11 +6564,11 @@ mod tests { │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedUnionExec: t0:[c0(0/2)] t1:[c0(1/2)] t2:[c1(0/2)] t3:[c1(1/2)] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk@0 as sold_date_sk, cs_bill_customer_sk@3 as customer_sk, cs_item_sk@15 as item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk@0 as sold_date_sk, cs_bill_customer_sk@3 as customer_sk, cs_item_sk@15 as item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk@0 as sold_date_sk, cs_bill_customer_sk@3 as customer_sk, cs_item_sk@15 as item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk@0 as sold_date_sk, cs_bill_customer_sk@3 as customer_sk, cs_item_sk@15 as item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk@0 as sold_date_sk, ws_bill_customer_sk@4 as customer_sk, ws_item_sk@3 as item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk@0 as sold_date_sk, ws_bill_customer_sk@4 as customer_sk, ws_item_sk@3 as item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk@0 as sold_date_sk, ws_bill_customer_sk@4 as customer_sk, ws_item_sk@3 as item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk@0 as sold_date_sk, ws_bill_customer_sk@4 as customer_sk, ws_item_sk@3 as item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -6626,10 +6626,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -6691,10 +6691,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -6708,10 +6708,10 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -6741,10 +6741,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -6764,10 +6764,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_addr_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_addr_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_addr_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_addr_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_addr_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_addr_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_addr_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_addr_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -6797,10 +6797,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 14] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 11 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -6820,10 +6820,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 12 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -6897,10 +6897,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -6945,10 +6945,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -6993,10 +6993,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_item_sk, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 11 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -7067,10 +7067,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -7078,10 +7078,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -7095,10 +7095,10 @@ mod tests { ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -7127,10 +7127,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 10] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -7138,10 +7138,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -7155,10 +7155,10 @@ mod tests { ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 10 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -7181,10 +7181,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 16] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 14 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -7192,10 +7192,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -7209,18 +7209,18 @@ mod tests { ┌───── Stage 15 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 16 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -7287,18 +7287,18 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -7324,18 +7324,18 @@ mod tests { │ CoalescePartitionsExec │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_week_seq, d_day_name], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "#); Ok(()) @@ -7379,10 +7379,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_addr_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -7396,10 +7396,10 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -7429,10 +7429,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -7452,10 +7452,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_addr_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_addr_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_addr_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_addr_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_addr_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_addr_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_addr_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_addr_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -7485,10 +7485,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 14] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 11 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -7508,10 +7508,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 13] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_addr_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 12 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -7565,10 +7565,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -7600,10 +7600,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_promo_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_promo_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_promo_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_promo_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_promo_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_promo_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_promo_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_promo_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -7646,10 +7646,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 12] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -7678,10 +7678,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 11] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_store_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 10 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -7736,10 +7736,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_ship_date_sk, ws_web_site_sk, ws_ship_mode_sk, ws_warehouse_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_ship_date_sk, ws_web_site_sk, ws_ship_mode_sk, ws_warehouse_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_ship_date_sk, ws_web_site_sk, ws_ship_mode_sk, ws_warehouse_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_ship_date_sk, ws_web_site_sk, ws_ship_mode_sk, ws_warehouse_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_ship_date_sk, ws_web_site_sk, ws_ship_mode_sk, ws_warehouse_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_ship_date_sk, ws_web_site_sk, ws_ship_mode_sk, ws_warehouse_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_ship_date_sk, ws_web_site_sk, ws_ship_mode_sk, ws_warehouse_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_ship_date_sk, ws_web_site_sk, ws_ship_mode_sk, ws_warehouse_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -7809,10 +7809,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -7875,10 +7875,10 @@ mod tests { │ [Stage 24] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 │ FilterExec: i_color@2 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@1 >= 65.00 AND i_current_price@1 <= 74.00, projection=[i_item_sk@0, i_product_name@3] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= 65.00 AND i_current_price@5 <= 74.00 AND DynamicFilter [ empty ], pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= 65.00 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= 74.00, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= 65.00 AND i_current_price@5 <= 74.00 AND DynamicFilter [ empty ], pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= 65.00 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= 74.00, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= 65.00 AND i_current_price@5 <= 74.00 AND DynamicFilter [ empty ], pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= 65.00 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= 74.00, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= 65.00 AND i_current_price@5 <= 74.00 AND DynamicFilter [ empty ], pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= 65.00 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= 74.00, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= 65.00 AND i_current_price@5 <= 74.00 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= 65.00 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= 74.00, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= 65.00 AND i_current_price@5 <= 74.00 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= 65.00 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= 74.00, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= 65.00 AND i_current_price@5 <= 74.00 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= 65.00 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= 74.00, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= 65.00 AND i_current_price@5 <= 74.00 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= 65.00 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= 74.00, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] └────────────────────────────────────────────────── ┌───── Stage 24 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -7886,10 +7886,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 23] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/income_band/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/income_band/part-1.parquet:..]]}, projection=[ib_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/income_band/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/income_band/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/income_band/part-2.parquet:..]]}, projection=[ib_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/income_band/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/income_band/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/income_band/part-3.parquet:..]]}, projection=[ib_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/income_band/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/income_band/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/income_band/part-3.parquet:..]]}, projection=[ib_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/income_band/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/income_band/part-1.parquet:..]]}, projection=[ib_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/income_band/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/income_band/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/income_band/part-2.parquet:..]]}, projection=[ib_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/income_band/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/income_band/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/income_band/part-3.parquet:..]]}, projection=[ib_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/income_band/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/income_band/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/income_band/part-3.parquet:..]]}, projection=[ib_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 23 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -7950,10 +7950,10 @@ mod tests { ┌───── Stage 5 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..]]}, projection=[hd_demo_sk, hd_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..]]}, projection=[hd_demo_sk, hd_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..]]}, projection=[hd_demo_sk, hd_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/household_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/household_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/household_demographics/part-3.parquet:..]]}, projection=[hd_demo_sk, hd_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..]]}, projection=[hd_demo_sk, hd_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..]]}, projection=[hd_demo_sk, hd_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..]]}, projection=[hd_demo_sk, hd_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/household_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/household_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/household_demographics/part-3.parquet:..]]}, projection=[hd_demo_sk, hd_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -8000,10 +8000,10 @@ mod tests { ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([c_customer_sk@0], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 18 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_customer_sk@1], 12), input_partitions=3 @@ -8061,10 +8061,10 @@ mod tests { ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cs_item_sk@0, cs_order_number@1], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_item_sk, cs_order_number, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_item_sk, cs_order_number, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_item_sk, cs_order_number, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_item_sk, cs_order_number, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_item_sk, cs_order_number, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_item_sk, cs_order_number, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_item_sk, cs_order_number, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_item_sk, cs_order_number, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 16 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([sr_item_sk@0, sr_ticket_number@1], 12), input_partitions=3 @@ -8077,26 +8077,26 @@ mod tests { ┌───── Stage 17 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_item_sk@1, ss_ticket_number@8], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 20 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cd_demo_sk@0], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 22 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cd_demo_sk@0], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 51 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([i_product_name@0, i_item_sk@1, s_store_name@2, s_zip@3, ca_street_number@4, ca_street_name@5, ca_city@6, ca_zip@7, ca_street_number@8, ca_street_name@9, ca_city@10, ca_zip@11, d_year@12, d_year@13, d_year@14], 6), input_partitions=3 @@ -8106,10 +8106,10 @@ mod tests { │ [Stage 50] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 │ FilterExec: i_color@2 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@1 >= 65.00 AND i_current_price@1 <= 74.00, projection=[i_item_sk@0, i_product_name@3] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= 65.00 AND i_current_price@5 <= 74.00 AND DynamicFilter [ empty ], pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= 65.00 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= 74.00, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= 65.00 AND i_current_price@5 <= 74.00 AND DynamicFilter [ empty ], pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= 65.00 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= 74.00, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= 65.00 AND i_current_price@5 <= 74.00 AND DynamicFilter [ empty ], pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= 65.00 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= 74.00, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= 65.00 AND i_current_price@5 <= 74.00 AND DynamicFilter [ empty ], pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= 65.00 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= 74.00, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= 65.00 AND i_current_price@5 <= 74.00 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= 65.00 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= 74.00, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= 65.00 AND i_current_price@5 <= 74.00 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= 65.00 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= 74.00, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= 65.00 AND i_current_price@5 <= 74.00 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= 65.00 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= 74.00, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_current_price, i_color, i_product_name], file_type=parquet, predicate=i_color@17 IN (SET) ([purple, burlywood, indian, spring, floral, medium]) AND i_current_price@5 >= 65.00 AND i_current_price@5 <= 74.00 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=(i_color_null_count@2 != row_count@3 AND i_color_min@0 <= purple AND purple <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= burlywood AND burlywood <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= indian AND indian <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= spring AND spring <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= floral AND floral <= i_color_max@1 OR i_color_null_count@2 != row_count@3 AND i_color_min@0 <= medium AND medium <= i_color_max@1) AND i_current_price_null_count@5 != row_count@3 AND i_current_price_max@4 >= 65.00 AND i_current_price_null_count@5 != row_count@3 AND i_current_price_min@6 <= 74.00, required_guarantees=[i_color in (burlywood, floral, indian, medium, purple, spring)] └────────────────────────────────────────────────── ┌───── Stage 50 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -8117,10 +8117,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 49] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/income_band/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/income_band/part-1.parquet:..]]}, projection=[ib_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/income_band/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/income_band/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/income_band/part-2.parquet:..]]}, projection=[ib_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/income_band/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/income_band/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/income_band/part-3.parquet:..]]}, projection=[ib_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/income_band/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/income_band/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/income_band/part-3.parquet:..]]}, projection=[ib_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/income_band/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/income_band/part-1.parquet:..]]}, projection=[ib_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/income_band/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/income_band/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/income_band/part-2.parquet:..]]}, projection=[ib_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/income_band/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/income_band/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/income_band/part-3.parquet:..]]}, projection=[ib_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/income_band/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/income_band/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/income_band/part-3.parquet:..]]}, projection=[ib_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 49 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -8181,10 +8181,10 @@ mod tests { ┌───── Stage 31 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..]]}, projection=[hd_demo_sk, hd_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..]]}, projection=[hd_demo_sk, hd_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..]]}, projection=[hd_demo_sk, hd_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/household_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/household_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/household_demographics/part-3.parquet:..]]}, projection=[hd_demo_sk, hd_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..]]}, projection=[hd_demo_sk, hd_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..]]}, projection=[hd_demo_sk, hd_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..]]}, projection=[hd_demo_sk, hd_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/household_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/household_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/household_demographics/part-3.parquet:..]]}, projection=[hd_demo_sk, hd_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 32 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -8231,10 +8231,10 @@ mod tests { ┌───── Stage 35 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([c_customer_sk@0], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_shipto_date_sk, c_first_sales_date_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 44 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_customer_sk@1], 12), input_partitions=3 @@ -8292,10 +8292,10 @@ mod tests { ┌───── Stage 39 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cs_item_sk@0, cs_order_number@1], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_item_sk, cs_order_number, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_item_sk, cs_order_number, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_item_sk, cs_order_number, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_item_sk, cs_order_number, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_item_sk, cs_order_number, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_item_sk, cs_order_number, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_item_sk, cs_order_number, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_item_sk, cs_order_number, cs_ext_list_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 42 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([sr_item_sk@0, sr_ticket_number@1], 12), input_partitions=3 @@ -8308,26 +8308,26 @@ mod tests { ┌───── Stage 43 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_item_sk@1, ss_ticket_number@8], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_cdemo_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_wholesale_cost, ss_list_price, ss_coupon_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 46 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cd_demo_sk@0], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 48 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cd_demo_sk@0], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -8383,10 +8383,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -8411,10 +8411,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -8468,10 +8468,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_sold_time_sk, ws_ship_mode_sk, ws_warehouse_sk, ws_quantity, ws_ext_sales_price, ws_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_sold_time_sk, ws_ship_mode_sk, ws_warehouse_sk, ws_quantity, ws_ext_sales_price, ws_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_sold_time_sk, ws_ship_mode_sk, ws_warehouse_sk, ws_quantity, ws_ext_sales_price, ws_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_sold_time_sk, ws_ship_mode_sk, ws_warehouse_sk, ws_quantity, ws_ext_sales_price, ws_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_sold_time_sk, ws_ship_mode_sk, ws_warehouse_sk, ws_quantity, ws_ext_sales_price, ws_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_sold_time_sk, ws_ship_mode_sk, ws_warehouse_sk, ws_quantity, ws_ext_sales_price, ws_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_sold_time_sk, ws_ship_mode_sk, ws_warehouse_sk, ws_quantity, ws_ext_sales_price, ws_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_sold_time_sk, ws_ship_mode_sk, ws_warehouse_sk, ws_quantity, ws_ext_sales_price, ws_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -8526,10 +8526,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_sold_time_sk, cs_ship_mode_sk, cs_warehouse_sk, cs_quantity, cs_sales_price, cs_net_paid_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_sold_time_sk, cs_ship_mode_sk, cs_warehouse_sk, cs_quantity, cs_sales_price, cs_net_paid_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_sold_time_sk, cs_ship_mode_sk, cs_warehouse_sk, cs_quantity, cs_sales_price, cs_net_paid_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_sold_time_sk, cs_ship_mode_sk, cs_warehouse_sk, cs_quantity, cs_sales_price, cs_net_paid_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_sold_time_sk, cs_ship_mode_sk, cs_warehouse_sk, cs_quantity, cs_sales_price, cs_net_paid_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_sold_time_sk, cs_ship_mode_sk, cs_warehouse_sk, cs_quantity, cs_sales_price, cs_net_paid_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_sold_time_sk, cs_ship_mode_sk, cs_warehouse_sk, cs_quantity, cs_sales_price, cs_net_paid_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_sold_time_sk, cs_ship_mode_sk, cs_warehouse_sk, cs_quantity, cs_sales_price, cs_net_paid_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -8603,10 +8603,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_quantity, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -8667,10 +8667,10 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_ticket_number@0, ss_customer_sk@1, ss_addr_sk@2, ca_city@3], 12), input_partitions=3 @@ -8688,10 +8688,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_ticket_number, ss_ext_sales_price, ss_ext_list_price, ss_ext_tax], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_ticket_number, ss_ext_sales_price, ss_ext_list_price, ss_ext_tax], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_ticket_number, ss_ext_sales_price, ss_ext_list_price, ss_ext_tax], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_ticket_number, ss_ext_sales_price, ss_ext_list_price, ss_ext_tax], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_ticket_number, ss_ext_sales_price, ss_ext_list_price, ss_ext_tax], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_ticket_number, ss_ext_sales_price, ss_ext_list_price, ss_ext_tax], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_ticket_number, ss_ext_sales_price, ss_ext_list_price, ss_ext_tax], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_ticket_number, ss_ext_sales_price, ss_ext_list_price, ss_ext_tax], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -8756,12 +8756,12 @@ mod tests { │ CoalescePartitionsExec │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_ship_customer_sk@1] │ CoalescePartitionsExec │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_ship_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_ship_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ BroadcastExec: input_partitions=3, consumer_tasks=1, output_partitions=3 @@ -8769,10 +8769,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -8788,10 +8788,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_gender, cd_marital_status, cd_education_status, cd_purchase_estimate, cd_credit_rating], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -8799,10 +8799,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -8947,20 +8947,20 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=6, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_sold_time_sk, ws_item_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_sold_time_sk, ws_item_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_sold_time_sk, ws_item_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_sold_time_sk, ws_item_sk, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible │ ProjectionExec: expr=[cs_ext_sales_price@0 as ext_price, cs_item_sk@1 as sold_item_sk, cs_sold_time_sk@2 as time_sk] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[cs_ext_sales_price@4, cs_item_sk@3, cs_sold_time_sk@2] │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_sold_time_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_sold_time_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible │ ProjectionExec: expr=[ss_ext_sales_price@0 as ext_price, ss_item_sk@1 as sold_item_sk, ss_sold_time_sk@2 as time_sk] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ss_sold_date_sk@0)], projection=[ss_ext_sales_price@4, ss_item_sk@3, ss_sold_time_sk@2] │ CoalescePartitionsExec │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_sold_time_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_sold_time_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -9143,18 +9143,18 @@ mod tests { ┌───── Stage 10 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cs_item_sk@4], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_ship_date_sk, cs_bill_cdemo_sk, cs_bill_hdemo_sk, cs_item_sk, cs_promo_sk, cs_order_number, cs_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_ship_date_sk, cs_bill_cdemo_sk, cs_bill_hdemo_sk, cs_item_sk, cs_promo_sk, cs_order_number, cs_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_ship_date_sk, cs_bill_cdemo_sk, cs_bill_hdemo_sk, cs_item_sk, cs_promo_sk, cs_order_number, cs_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_ship_date_sk, cs_bill_cdemo_sk, cs_bill_hdemo_sk, cs_item_sk, cs_promo_sk, cs_order_number, cs_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_ship_date_sk, cs_bill_cdemo_sk, cs_bill_hdemo_sk, cs_item_sk, cs_promo_sk, cs_order_number, cs_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_ship_date_sk, cs_bill_cdemo_sk, cs_bill_hdemo_sk, cs_item_sk, cs_promo_sk, cs_order_number, cs_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_ship_date_sk, cs_bill_cdemo_sk, cs_bill_hdemo_sk, cs_item_sk, cs_promo_sk, cs_order_number, cs_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_ship_date_sk, cs_bill_cdemo_sk, cs_bill_hdemo_sk, cs_item_sk, cs_promo_sk, cs_order_number, cs_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 11 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([inv_item_sk@1], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_warehouse_sk, inv_quantity_on_hand], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -9198,10 +9198,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_store_sk, ss_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_store_sk, ss_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_store_sk, ss_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_store_sk, ss_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_store_sk, ss_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_store_sk, ss_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_store_sk, ss_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_store_sk, ss_ticket_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -9282,10 +9282,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -9322,10 +9322,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -9339,10 +9339,10 @@ mod tests { ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 11 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([c_customer_id@0, c_first_name@1, c_last_name@2, d_year@3], 6), input_partitions=3 @@ -9354,10 +9354,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 10] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -9371,10 +9371,10 @@ mod tests { ┌───── Stage 10 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 15 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([c_customer_id@0, c_first_name@1, c_last_name@2, d_year@3], 6), input_partitions=3 @@ -9386,10 +9386,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 14] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk, ws_net_paid], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -9403,10 +9403,10 @@ mod tests { ┌───── Stage 14 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -9464,10 +9464,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -9490,10 +9490,10 @@ mod tests { ┌───── Stage 4 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([cr_order_number@1, cr_item_sk@0], 6), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_return_quantity, cr_return_amount], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_return_quantity, cr_return_amount], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_return_quantity, cr_return_amount], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_return_quantity, cr_return_amount], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_return_quantity, cr_return_amount], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_return_quantity, cr_return_amount], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_return_quantity, cr_return_amount], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_return_quantity, cr_return_amount], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ RepartitionExec: partitioning=Hash([ss_ticket_number@1, ss_item_sk@0], 3), input_partitions=3 @@ -9504,10 +9504,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -9530,10 +9530,10 @@ mod tests { ┌───── Stage 8 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ RepartitionExec: partitioning=Hash([sr_ticket_number@1, sr_item_sk@0], 3), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number, sr_return_quantity, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number, sr_return_quantity, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number, sr_return_quantity, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number, sr_return_quantity, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number, sr_return_quantity, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number, sr_return_quantity, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number, sr_return_quantity, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number, sr_return_quantity, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 11 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ RepartitionExec: partitioning=Hash([ws_order_number@1, ws_item_sk@0], 3), input_partitions=3 @@ -9544,10 +9544,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 10] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -9570,10 +9570,10 @@ mod tests { ┌───── Stage 12 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ RepartitionExec: partitioning=Hash([wr_order_number@1, wr_item_sk@0], 3), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 28 ── Tasks: t0:[p0..p2] t1:[p0..p2] │ RepartitionExec: partitioning=Hash([d_year@0, i_brand_id@1, i_class_id@2, i_category_id@3, i_manufact_id@4], 3), input_partitions=3 @@ -9610,10 +9610,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 16] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_item_sk, cs_order_number, cs_quantity, cs_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 15 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -9628,18 +9628,18 @@ mod tests { │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_category@4 = Books, projection=[i_item_sk@0, i_brand_id@1, i_class_id@2, i_category_id@3, i_manufact_id@5] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] └────────────────────────────────────────────────── ┌───── Stage 18 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([cr_order_number@1, cr_item_sk@0], 6), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_return_quantity, cr_return_amount], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_return_quantity, cr_return_amount], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_return_quantity, cr_return_amount], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_return_quantity, cr_return_amount], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_return_quantity, cr_return_amount], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_return_quantity, cr_return_amount], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_return_quantity, cr_return_amount], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_item_sk, cr_order_number, cr_return_quantity, cr_return_amount], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 21 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ RepartitionExec: partitioning=Hash([ss_ticket_number@1, ss_item_sk@0], 3), input_partitions=3 @@ -9650,10 +9650,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 20] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ticket_number, ss_quantity, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 19 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -9668,18 +9668,18 @@ mod tests { │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_category@4 = Books, projection=[i_item_sk@0, i_brand_id@1, i_class_id@2, i_category_id@3, i_manufact_id@5] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] └────────────────────────────────────────────────── ┌───── Stage 22 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ RepartitionExec: partitioning=Hash([sr_ticket_number@1, sr_item_sk@0], 3), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number, sr_return_quantity, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number, sr_return_quantity, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number, sr_return_quantity, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number, sr_return_quantity, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number, sr_return_quantity, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number, sr_return_quantity, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number, sr_return_quantity, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_item_sk, sr_ticket_number, sr_return_quantity, sr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 25 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ RepartitionExec: partitioning=Hash([ws_order_number@1, ws_item_sk@0], 3), input_partitions=3 @@ -9690,10 +9690,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 24] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_order_number, ws_quantity, ws_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 23 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -9708,18 +9708,18 @@ mod tests { │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_category@4 = Books, projection=[i_item_sk@0, i_brand_id@1, i_class_id@2, i_category_id@3, i_manufact_id@5] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_brand_id, i_class_id, i_category_id, i_category, i_manufact_id], file_type=parquet, predicate=i_category@12 = Books AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=i_category_null_count@2 != row_count@3 AND i_category_min@0 <= Books AND Books <= i_category_max@1, required_guarantees=[i_category in (Books)] └────────────────────────────────────────────────── ┌───── Stage 26 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ RepartitionExec: partitioning=Hash([wr_order_number@1, wr_item_sk@0], 3), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_order_number, wr_return_quantity, wr_return_amt], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -9751,8 +9751,8 @@ mod tests { │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=6, input_tasks=4 │ FilterExec: ss_store_sk@2 IS NULL, projection=[ss_sold_date_sk@0, ss_item_sk@1, ss_ext_sales_price@3] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price], file_type=parquet, predicate=ss_store_sk@7 IS NULL AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=ss_store_sk_null_count@0 > 0, required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price], file_type=parquet, predicate=ss_store_sk@7 IS NULL AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=ss_store_sk_null_count@0 > 0, required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price], file_type=parquet, predicate=ss_store_sk@7 IS NULL AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=ss_store_sk_null_count@0 > 0, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_ext_sales_price], file_type=parquet, predicate=ss_store_sk@7 IS NULL AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=ss_store_sk_null_count@0 > 0, required_guarantees=[] │ ProjectionExec: expr=[web as channel, ws_ship_customer_sk as col_name, d_year@0 as d_year, d_qoy@1 as d_qoy, i_category@2 as i_category, ws_ext_sales_price@3 as ext_sales_price] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, ws_sold_date_sk@0)], projection=[d_year@1, d_qoy@2, i_category@5, ws_ext_sales_price@4] │ CoalescePartitionsExec @@ -9762,7 +9762,7 @@ mod tests { │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 │ FilterExec: ws_ship_customer_sk@2 IS NULL, projection=[ws_sold_date_sk@0, ws_item_sk@1, ws_ext_sales_price@3] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ship_customer_sk, ws_ext_sales_price], file_type=parquet, predicate=ws_ship_customer_sk@8 IS NULL AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=ws_ship_customer_sk_null_count@0 > 0, required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ship_customer_sk, ws_ext_sales_price], file_type=parquet, predicate=ws_ship_customer_sk@8 IS NULL AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=ws_ship_customer_sk_null_count@0 > 0, required_guarantees=[] │ ProjectionExec: expr=[catalog as channel, cs_ship_addr_sk as col_name, d_year@0 as d_year, d_qoy@1 as d_qoy, i_category@2 as i_category, cs_ext_sales_price@3 as ext_sales_price] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(d_date_sk@0, cs_sold_date_sk@0)], projection=[d_year@1, d_qoy@2, i_category@5, cs_ext_sales_price@4] │ CoalescePartitionsExec @@ -9772,7 +9772,7 @@ mod tests { │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 │ FilterExec: cs_ship_addr_sk@1 IS NULL, projection=[cs_sold_date_sk@0, cs_item_sk@2, cs_ext_sales_price@3] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_ship_addr_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=cs_ship_addr_sk@10 IS NULL AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=cs_ship_addr_sk_null_count@0 > 0, required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_ship_addr_sk, cs_item_sk, cs_ext_sales_price], file_type=parquet, predicate=cs_ship_addr_sk@10 IS NULL AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=cs_ship_addr_sk_null_count@0 > 0, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p5] t1:[p6..p11] t2:[p12..p17] t3:[p18..p23] │ BroadcastExec: input_partitions=3, consumer_tasks=2, output_partitions=6 @@ -9880,10 +9880,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_returned_date_sk, sr_store_sk, sr_return_amt, sr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_store_sk, sr_return_amt, sr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_store_sk, sr_return_amt, sr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_store_sk, sr_return_amt, sr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_returned_date_sk, sr_store_sk, sr_return_amt, sr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_store_sk, sr_return_amt, sr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_store_sk, sr_return_amt, sr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_store_sk, sr_return_amt, sr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -9912,10 +9912,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_store_sk, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -9947,10 +9947,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..]]}, projection=[cr_returned_date_sk, cr_call_center_sk, cr_return_amount, cr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_call_center_sk, cr_return_amount, cr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_call_center_sk, cr_return_amount, cr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_call_center_sk, cr_return_amount, cr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..]]}, projection=[cr_returned_date_sk, cr_call_center_sk, cr_return_amount, cr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_call_center_sk, cr_return_amount, cr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_call_center_sk, cr_return_amount, cr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_call_center_sk, cr_return_amount, cr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -9968,10 +9968,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 11] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_ext_sales_price, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_ext_sales_price, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_ext_sales_price, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_ext_sales_price, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_ext_sales_price, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_ext_sales_price, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_ext_sales_price, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_call_center_sk, cs_ext_sales_price, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 11 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -9998,10 +9998,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 14] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_returned_date_sk, wr_web_page_sk, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_web_page_sk, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_web_page_sk, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_web_page_sk, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_returned_date_sk, wr_web_page_sk, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_web_page_sk, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_web_page_sk, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_web_page_sk, wr_return_amt, wr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 13 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -10030,10 +10030,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 18] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_web_page_sk, ws_ext_sales_price, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_web_page_sk, ws_ext_sales_price, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_web_page_sk, ws_ext_sales_price, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_web_page_sk, ws_ext_sales_price, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_web_page_sk, ws_ext_sales_price, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_web_page_sk, ws_ext_sales_price, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_web_page_sk, ws_ext_sales_price, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_web_page_sk, ws_ext_sales_price, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 17 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -10111,10 +10111,10 @@ mod tests { ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cs_order_number@3, cs_item_sk@2], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_order_number, cs_quantity, cs_wholesale_cost, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_order_number, cs_quantity, cs_wholesale_cost, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_order_number, cs_quantity, cs_wholesale_cost, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_order_number, cs_quantity, cs_wholesale_cost, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_order_number, cs_quantity, cs_wholesale_cost, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_order_number, cs_quantity, cs_wholesale_cost, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_order_number, cs_quantity, cs_wholesale_cost, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk, cs_order_number, cs_quantity, cs_wholesale_cost, cs_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p5] t1:[p0..p5] t2:[p0..p5] t3:[p0..p5] │ RepartitionExec: partitioning=Hash([d_year@0, ws_item_sk@1, ws_bill_customer_sk@2], 6), input_partitions=3 @@ -10127,10 +10127,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_order_number, ws_quantity, ws_wholesale_cost, ws_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_order_number, ws_quantity, ws_wholesale_cost, ws_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_order_number, ws_quantity, ws_wholesale_cost, ws_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_order_number, ws_quantity, ws_wholesale_cost, ws_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_order_number, ws_quantity, ws_wholesale_cost, ws_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_order_number, ws_quantity, ws_wholesale_cost, ws_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_order_number, ws_quantity, ws_wholesale_cost, ws_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_bill_customer_sk, ws_order_number, ws_quantity, ws_wholesale_cost, ws_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -10180,10 +10180,10 @@ mod tests { ┌───── Stage 10 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_ticket_number@3, ss_item_sk@1], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_ticket_number, ss_quantity, ss_wholesale_cost, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_ticket_number, ss_quantity, ss_wholesale_cost, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_ticket_number, ss_quantity, ss_wholesale_cost, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_ticket_number, ss_quantity, ss_wholesale_cost, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_ticket_number, ss_quantity, ss_wholesale_cost, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_ticket_number, ss_quantity, ss_wholesale_cost, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_ticket_number, ss_quantity, ss_wholesale_cost, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk, ss_ticket_number, ss_quantity, ss_wholesale_cost, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -10227,10 +10227,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_ticket_number, ss_coupon_amt, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_ticket_number, ss_coupon_amt, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_ticket_number, ss_coupon_amt, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_ticket_number, ss_coupon_amt, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_ticket_number, ss_coupon_amt, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_ticket_number, ss_coupon_amt, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_ticket_number, ss_coupon_amt, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk, ss_hdemo_sk, ss_addr_sk, ss_store_sk, ss_ticket_number, ss_coupon_amt, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -10356,10 +10356,10 @@ mod tests { ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ss_item_sk@1, ss_ticket_number@4], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_promo_sk, ss_ticket_number, ss_ext_sales_price, ss_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 14 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ RepartitionExec: partitioning=Hash([cp_catalog_page_id@0], 3), input_partitions=3 @@ -10428,10 +10428,10 @@ mod tests { ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cs_item_sk@2, cs_order_number@4], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_catalog_page_sk, cs_item_sk, cs_promo_sk, cs_order_number, cs_ext_sales_price, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_catalog_page_sk, cs_item_sk, cs_promo_sk, cs_order_number, cs_ext_sales_price, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_catalog_page_sk, cs_item_sk, cs_promo_sk, cs_order_number, cs_ext_sales_price, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_catalog_page_sk, cs_item_sk, cs_promo_sk, cs_order_number, cs_ext_sales_price, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_catalog_page_sk, cs_item_sk, cs_promo_sk, cs_order_number, cs_ext_sales_price, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_catalog_page_sk, cs_item_sk, cs_promo_sk, cs_order_number, cs_ext_sales_price, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_catalog_page_sk, cs_item_sk, cs_promo_sk, cs_order_number, cs_ext_sales_price, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_catalog_page_sk, cs_item_sk, cs_promo_sk, cs_order_number, cs_ext_sales_price, cs_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 21 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ RepartitionExec: partitioning=Hash([web_site_id@0], 3), input_partitions=3 @@ -10500,10 +10500,10 @@ mod tests { ┌───── Stage 20 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ws_item_sk@1, ws_order_number@4], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_web_site_sk, ws_promo_sk, ws_order_number, ws_ext_sales_price, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_web_site_sk, ws_promo_sk, ws_order_number, ws_ext_sales_price, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_web_site_sk, ws_promo_sk, ws_order_number, ws_ext_sales_price, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_web_site_sk, ws_promo_sk, ws_order_number, ws_ext_sales_price, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_web_site_sk, ws_promo_sk, ws_order_number, ws_ext_sales_price, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_web_site_sk, ws_promo_sk, ws_order_number, ws_ext_sales_price, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_web_site_sk, ws_promo_sk, ws_order_number, ws_ext_sales_price, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_web_site_sk, ws_promo_sk, ws_order_number, ws_ext_sales_price, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -10530,10 +10530,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=2 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_current_addr_sk, c_salutation, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_current_addr_sk, c_salutation, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_current_addr_sk, c_salutation, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_current_addr_sk, c_salutation, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_current_addr_sk, c_salutation, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_current_addr_sk, c_salutation, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_current_addr_sk, c_salutation, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_customer_id, c_current_addr_sk, c_salutation, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -10557,10 +10557,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -10568,10 +10568,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_returning_addr_sk, cr_return_amt_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_returning_addr_sk, cr_return_amt_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_returning_addr_sk, cr_return_amt_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_returning_addr_sk, cr_return_amt_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_returning_addr_sk, cr_return_amt_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_returning_addr_sk, cr_return_amt_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_returning_addr_sk, cr_return_amt_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_returning_addr_sk, cr_return_amt_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -10596,10 +10596,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_state], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -10607,10 +10607,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_returning_addr_sk, cr_return_amt_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_returning_addr_sk, cr_return_amt_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_returning_addr_sk, cr_return_amt_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_returning_addr_sk, cr_return_amt_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_returning_addr_sk, cr_return_amt_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_returning_addr_sk, cr_return_amt_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_returning_addr_sk, cr_return_amt_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_returning_addr_sk, cr_return_amt_inc_tax], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -10638,7 +10638,7 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ HashJoinExec: mode=CollectLeft, join_type=RightSemi, on=[(d_date_sk@0, inv_date_sk@4)], projection=[i_item_sk@0, i_item_id@1, i_item_desc@2, i_current_price@3] @@ -10649,10 +10649,10 @@ mod tests { │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ FilterExec: inv_quantity_on_hand@2 >= 100 AND inv_quantity_on_hand@2 <= 500, projection=[inv_date_sk@0, inv_item_sk@1] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/inventory/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/inventory/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/inventory/part-3.parquet:..]]}, projection=[inv_date_sk, inv_item_sk, inv_quantity_on_hand], file_type=parquet, predicate=inv_quantity_on_hand@3 >= 100 AND inv_quantity_on_hand@3 <= 500 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_max@0 >= 100 AND inv_quantity_on_hand_null_count@1 != row_count@2 AND inv_quantity_on_hand_min@3 <= 500, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -10667,10 +10667,10 @@ mod tests { │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: i_current_price@3 >= 62.00 AND i_current_price@3 <= 92.00 AND i_manufact_id@4 IN (SET) ([129, 270, 821, 423]), projection=[i_item_sk@0, i_item_id@1, i_item_desc@2, i_current_price@3] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= 62.00 AND i_current_price@5 <= 92.00 AND i_manufact_id@13 IN (SET) ([129, 270, 821, 423]) AND DynamicFilter [ empty ], pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 62.00 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 92.00 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 129 AND 129 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 270 AND 270 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 821 AND 821 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 423 AND 423 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (129, 270, 423, 821)] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= 62.00 AND i_current_price@5 <= 92.00 AND i_manufact_id@13 IN (SET) ([129, 270, 821, 423]) AND DynamicFilter [ empty ], pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 62.00 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 92.00 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 129 AND 129 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 270 AND 270 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 821 AND 821 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 423 AND 423 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (129, 270, 423, 821)] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= 62.00 AND i_current_price@5 <= 92.00 AND i_manufact_id@13 IN (SET) ([129, 270, 821, 423]) AND DynamicFilter [ empty ], pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 62.00 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 92.00 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 129 AND 129 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 270 AND 270 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 821 AND 821 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 423 AND 423 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (129, 270, 423, 821)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= 62.00 AND i_current_price@5 <= 92.00 AND i_manufact_id@13 IN (SET) ([129, 270, 821, 423]) AND DynamicFilter [ empty ], pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 62.00 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 92.00 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 129 AND 129 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 270 AND 270 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 821 AND 821 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 423 AND 423 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (129, 270, 423, 821)] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= 62.00 AND i_current_price@5 <= 92.00 AND i_manufact_id@13 IN (SET) ([129, 270, 821, 423]) AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 62.00 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 92.00 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 129 AND 129 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 270 AND 270 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 821 AND 821 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 423 AND 423 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (129, 270, 423, 821)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= 62.00 AND i_current_price@5 <= 92.00 AND i_manufact_id@13 IN (SET) ([129, 270, 821, 423]) AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 62.00 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 92.00 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 129 AND 129 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 270 AND 270 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 821 AND 821 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 423 AND 423 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (129, 270, 423, 821)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= 62.00 AND i_current_price@5 <= 92.00 AND i_manufact_id@13 IN (SET) ([129, 270, 821, 423]) AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 62.00 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 92.00 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 129 AND 129 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 270 AND 270 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 821 AND 821 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 423 AND 423 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (129, 270, 423, 821)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id, i_item_desc, i_current_price, i_manufact_id], file_type=parquet, predicate=i_current_price@5 >= 62.00 AND i_current_price@5 <= 92.00 AND i_manufact_id@13 IN (SET) ([129, 270, 821, 423]) AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=i_current_price_null_count@1 != row_count@2 AND i_current_price_max@0 >= 62.00 AND i_current_price_null_count@1 != row_count@2 AND i_current_price_min@3 <= 92.00 AND (i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 129 AND 129 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 270 AND 270 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 821 AND 821 <= i_manufact_id_max@5 OR i_manufact_id_null_count@6 != row_count@2 AND i_manufact_id_min@4 <= 423 AND 423 <= i_manufact_id_max@5), required_guarantees=[i_manufact_id in (129, 270, 423, 821)] └────────────────────────────────────────────────── "); Ok(()) @@ -10711,17 +10711,17 @@ mod tests { │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=3, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(wr_returned_date_sk@0, d_date_sk@0)], projection=[wr_return_quantity@1, i_item_id@2, d_date@4] │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -10729,10 +10729,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_returned_date_sk, wr_item_sk, wr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -10764,10 +10764,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 9] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..]]}, projection=[cr_returned_date_sk, cr_item_sk, cr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_item_sk, cr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_item_sk, cr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_item_sk, cr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..]]}, projection=[cr_returned_date_sk, cr_item_sk, cr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_item_sk, cr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_item_sk, cr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_item_sk, cr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -10775,10 +10775,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -10792,10 +10792,10 @@ mod tests { ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -10818,10 +10818,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 14] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_returned_date_sk, sr_item_sk, sr_return_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 12 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -10829,10 +10829,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 11] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date, d_week_seq], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 11 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -10846,18 +10846,18 @@ mod tests { ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/date_dim/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/date_dim/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/date_dim/part-3.parquet:..]]}, projection=[d_date_sk, d_date], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 14 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/item/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/item/part-3.parquet:..]]}, projection=[i_item_sk, i_item_id], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -10877,10 +10877,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_cdemo_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_cdemo_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_cdemo_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_cdemo_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..]]}, projection=[sr_cdemo_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_cdemo_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_cdemo_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_returns/part-3.parquet:..]]}, projection=[sr_cdemo_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -10894,10 +10894,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -10912,10 +10912,10 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..]]}, projection=[hd_demo_sk, hd_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..]]}, projection=[hd_demo_sk, hd_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..]]}, projection=[hd_demo_sk, hd_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/household_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/household_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/household_demographics/part-3.parquet:..]]}, projection=[hd_demo_sk, hd_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..]]}, projection=[hd_demo_sk, hd_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..]]}, projection=[hd_demo_sk, hd_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..]]}, projection=[hd_demo_sk, hd_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={2 groups: [[/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/household_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/household_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/household_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/household_demographics/part-3.parquet:..]]}, projection=[hd_demo_sk, hd_income_band_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -10923,10 +10923,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_id, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_id, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_id, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_id, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_id, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_id, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_id, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_id, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk, c_first_name, c_last_name], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -11022,36 +11022,36 @@ mod tests { ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([wr_item_sk@0, wr_order_number@5], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_item_sk, wr_refunded_cdemo_sk, wr_refunded_addr_sk, wr_returning_cdemo_sk, wr_reason_sk, wr_order_number, wr_fee, wr_refunded_cash], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_refunded_cdemo_sk, wr_refunded_addr_sk, wr_returning_cdemo_sk, wr_reason_sk, wr_order_number, wr_fee, wr_refunded_cash], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_refunded_cdemo_sk, wr_refunded_addr_sk, wr_returning_cdemo_sk, wr_reason_sk, wr_order_number, wr_fee, wr_refunded_cash], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_refunded_cdemo_sk, wr_refunded_addr_sk, wr_returning_cdemo_sk, wr_reason_sk, wr_order_number, wr_fee, wr_refunded_cash], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..]]}, projection=[wr_item_sk, wr_refunded_cdemo_sk, wr_refunded_addr_sk, wr_returning_cdemo_sk, wr_reason_sk, wr_order_number, wr_fee, wr_refunded_cash], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_refunded_cdemo_sk, wr_refunded_addr_sk, wr_returning_cdemo_sk, wr_reason_sk, wr_order_number, wr_fee, wr_refunded_cash], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_refunded_cdemo_sk, wr_refunded_addr_sk, wr_returning_cdemo_sk, wr_reason_sk, wr_order_number, wr_fee, wr_refunded_cash], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_item_sk, wr_refunded_cdemo_sk, wr_refunded_addr_sk, wr_returning_cdemo_sk, wr_reason_sk, wr_order_number, wr_fee, wr_refunded_cash], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([ws_item_sk@1, ws_order_number@3], 12), input_partitions=3 │ FilterExec: (ws_net_profit@6 >= 100.00 AND ws_net_profit@6 <= 200.00 OR ws_net_profit@6 >= 150.00 AND ws_net_profit@6 <= 300.00 OR ws_net_profit@6 >= 50.00 AND ws_net_profit@6 <= 250.00) AND (ws_sales_price@5 >= 100.00 AND ws_sales_price@5 <= 150.00 OR ws_sales_price@5 >= 50.00 AND ws_sales_price@5 <= 100.00 OR ws_sales_price@5 >= 150.00 AND ws_sales_price@5 <= 200.00) │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_web_page_sk, ws_order_number, ws_quantity, ws_sales_price, ws_net_profit], file_type=parquet, predicate=(ws_net_profit@33 >= 100.00 AND ws_net_profit@33 <= 200.00 OR ws_net_profit@33 >= 150.00 AND ws_net_profit@33 <= 300.00 OR ws_net_profit@33 >= 50.00 AND ws_net_profit@33 <= 250.00) AND (ws_sales_price@21 >= 100.00 AND ws_sales_price@21 <= 150.00 OR ws_sales_price@21 >= 50.00 AND ws_sales_price@21 <= 100.00 OR ws_sales_price@21 >= 150.00 AND ws_sales_price@21 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 100.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 200.00 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 150.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 300.00 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 50.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 250.00) AND (ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 100.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 150.00 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 50.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 100.00 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 150.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 200.00), required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_web_page_sk, ws_order_number, ws_quantity, ws_sales_price, ws_net_profit], file_type=parquet, predicate=(ws_net_profit@33 >= 100.00 AND ws_net_profit@33 <= 200.00 OR ws_net_profit@33 >= 150.00 AND ws_net_profit@33 <= 300.00 OR ws_net_profit@33 >= 50.00 AND ws_net_profit@33 <= 250.00) AND (ws_sales_price@21 >= 100.00 AND ws_sales_price@21 <= 150.00 OR ws_sales_price@21 >= 50.00 AND ws_sales_price@21 <= 100.00 OR ws_sales_price@21 >= 150.00 AND ws_sales_price@21 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 100.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 200.00 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 150.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 300.00 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 50.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 250.00) AND (ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 100.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 150.00 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 50.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 100.00 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 150.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 200.00), required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_web_page_sk, ws_order_number, ws_quantity, ws_sales_price, ws_net_profit], file_type=parquet, predicate=(ws_net_profit@33 >= 100.00 AND ws_net_profit@33 <= 200.00 OR ws_net_profit@33 >= 150.00 AND ws_net_profit@33 <= 300.00 OR ws_net_profit@33 >= 50.00 AND ws_net_profit@33 <= 250.00) AND (ws_sales_price@21 >= 100.00 AND ws_sales_price@21 <= 150.00 OR ws_sales_price@21 >= 50.00 AND ws_sales_price@21 <= 100.00 OR ws_sales_price@21 >= 150.00 AND ws_sales_price@21 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 100.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 200.00 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 150.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 300.00 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 50.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 250.00) AND (ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 100.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 150.00 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 50.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 100.00 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 150.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 200.00), required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_web_page_sk, ws_order_number, ws_quantity, ws_sales_price, ws_net_profit], file_type=parquet, predicate=(ws_net_profit@33 >= 100.00 AND ws_net_profit@33 <= 200.00 OR ws_net_profit@33 >= 150.00 AND ws_net_profit@33 <= 300.00 OR ws_net_profit@33 >= 50.00 AND ws_net_profit@33 <= 250.00) AND (ws_sales_price@21 >= 100.00 AND ws_sales_price@21 <= 150.00 OR ws_sales_price@21 >= 50.00 AND ws_sales_price@21 <= 100.00 OR ws_sales_price@21 >= 150.00 AND ws_sales_price@21 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=(ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 100.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 200.00 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 150.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 300.00 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 50.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 250.00) AND (ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 100.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 150.00 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 50.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 100.00 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 150.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 200.00), required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_web_page_sk, ws_order_number, ws_quantity, ws_sales_price, ws_net_profit], file_type=parquet, predicate=(ws_net_profit@33 >= 100.00 AND ws_net_profit@33 <= 200.00 OR ws_net_profit@33 >= 150.00 AND ws_net_profit@33 <= 300.00 OR ws_net_profit@33 >= 50.00 AND ws_net_profit@33 <= 250.00) AND (ws_sales_price@21 >= 100.00 AND ws_sales_price@21 <= 150.00 OR ws_sales_price@21 >= 50.00 AND ws_sales_price@21 <= 100.00 OR ws_sales_price@21 >= 150.00 AND ws_sales_price@21 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=(ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 100.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 200.00 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 150.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 300.00 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 50.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 250.00) AND (ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 100.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 150.00 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 50.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 100.00 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 150.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 200.00), required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_web_page_sk, ws_order_number, ws_quantity, ws_sales_price, ws_net_profit], file_type=parquet, predicate=(ws_net_profit@33 >= 100.00 AND ws_net_profit@33 <= 200.00 OR ws_net_profit@33 >= 150.00 AND ws_net_profit@33 <= 300.00 OR ws_net_profit@33 >= 50.00 AND ws_net_profit@33 <= 250.00) AND (ws_sales_price@21 >= 100.00 AND ws_sales_price@21 <= 150.00 OR ws_sales_price@21 >= 50.00 AND ws_sales_price@21 <= 100.00 OR ws_sales_price@21 >= 150.00 AND ws_sales_price@21 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=(ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 100.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 200.00 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 150.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 300.00 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 50.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 250.00) AND (ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 100.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 150.00 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 50.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 100.00 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 150.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 200.00), required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_web_page_sk, ws_order_number, ws_quantity, ws_sales_price, ws_net_profit], file_type=parquet, predicate=(ws_net_profit@33 >= 100.00 AND ws_net_profit@33 <= 200.00 OR ws_net_profit@33 >= 150.00 AND ws_net_profit@33 <= 300.00 OR ws_net_profit@33 >= 50.00 AND ws_net_profit@33 <= 250.00) AND (ws_sales_price@21 >= 100.00 AND ws_sales_price@21 <= 150.00 OR ws_sales_price@21 >= 50.00 AND ws_sales_price@21 <= 100.00 OR ws_sales_price@21 >= 150.00 AND ws_sales_price@21 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=(ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 100.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 200.00 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 150.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 300.00 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 50.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 250.00) AND (ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 100.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 150.00 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 50.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 100.00 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 150.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 200.00), required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_web_page_sk, ws_order_number, ws_quantity, ws_sales_price, ws_net_profit], file_type=parquet, predicate=(ws_net_profit@33 >= 100.00 AND ws_net_profit@33 <= 200.00 OR ws_net_profit@33 >= 150.00 AND ws_net_profit@33 <= 300.00 OR ws_net_profit@33 >= 50.00 AND ws_net_profit@33 <= 250.00) AND (ws_sales_price@21 >= 100.00 AND ws_sales_price@21 <= 150.00 OR ws_sales_price@21 >= 50.00 AND ws_sales_price@21 <= 100.00 OR ws_sales_price@21 >= 150.00 AND ws_sales_price@21 <= 200.00) AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=(ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 100.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 200.00 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 150.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 300.00 OR ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_max@0 >= 50.00 AND ws_net_profit_null_count@1 != row_count@2 AND ws_net_profit_min@3 <= 250.00) AND (ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 100.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 150.00 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 50.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 100.00 OR ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_max@4 >= 150.00 AND ws_sales_price_null_count@5 != row_count@2 AND ws_sales_price_min@6 <= 200.00), required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cd_demo_sk@0], 12), input_partitions=3 │ FilterExec: cd_marital_status@1 = M AND cd_education_status@2 = Advanced Degree OR cd_marital_status@1 = S AND cd_education_status@2 = College OR cd_marital_status@1 = W AND cd_education_status@2 = 2 yr Degree │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=(cd_marital_status@2 = M AND cd_education_status@3 = Advanced Degree OR cd_marital_status@2 = S AND cd_education_status@3 = College OR cd_marital_status@2 = W AND cd_education_status@3 = 2 yr Degree) AND DynamicFilter [ empty ], pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= S AND S <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= College AND College <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= 2 yr Degree AND 2 yr Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (2 yr Degree, Advanced Degree, College), cd_marital_status in (M, S, W)] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=(cd_marital_status@2 = M AND cd_education_status@3 = Advanced Degree OR cd_marital_status@2 = S AND cd_education_status@3 = College OR cd_marital_status@2 = W AND cd_education_status@3 = 2 yr Degree) AND DynamicFilter [ empty ], pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= S AND S <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= College AND College <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= 2 yr Degree AND 2 yr Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (2 yr Degree, Advanced Degree, College), cd_marital_status in (M, S, W)] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=(cd_marital_status@2 = M AND cd_education_status@3 = Advanced Degree OR cd_marital_status@2 = S AND cd_education_status@3 = College OR cd_marital_status@2 = W AND cd_education_status@3 = 2 yr Degree) AND DynamicFilter [ empty ], pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= S AND S <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= College AND College <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= 2 yr Degree AND 2 yr Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (2 yr Degree, Advanced Degree, College), cd_marital_status in (M, S, W)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=(cd_marital_status@2 = M AND cd_education_status@3 = Advanced Degree OR cd_marital_status@2 = S AND cd_education_status@3 = College OR cd_marital_status@2 = W AND cd_education_status@3 = 2 yr Degree) AND DynamicFilter [ empty ], pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= S AND S <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= College AND College <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= 2 yr Degree AND 2 yr Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (2 yr Degree, Advanced Degree, College), cd_marital_status in (M, S, W)] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=(cd_marital_status@2 = M AND cd_education_status@3 = Advanced Degree OR cd_marital_status@2 = S AND cd_education_status@3 = College OR cd_marital_status@2 = W AND cd_education_status@3 = 2 yr Degree) AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= S AND S <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= College AND College <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= 2 yr Degree AND 2 yr Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (2 yr Degree, Advanced Degree, College), cd_marital_status in (M, S, W)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=(cd_marital_status@2 = M AND cd_education_status@3 = Advanced Degree OR cd_marital_status@2 = S AND cd_education_status@3 = College OR cd_marital_status@2 = W AND cd_education_status@3 = 2 yr Degree) AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= S AND S <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= College AND College <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= 2 yr Degree AND 2 yr Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (2 yr Degree, Advanced Degree, College), cd_marital_status in (M, S, W)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=(cd_marital_status@2 = M AND cd_education_status@3 = Advanced Degree OR cd_marital_status@2 = S AND cd_education_status@3 = College OR cd_marital_status@2 = W AND cd_education_status@3 = 2 yr Degree) AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= S AND S <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= College AND College <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= 2 yr Degree AND 2 yr Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (2 yr Degree, Advanced Degree, College), cd_marital_status in (M, S, W)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=(cd_marital_status@2 = M AND cd_education_status@3 = Advanced Degree OR cd_marital_status@2 = S AND cd_education_status@3 = College OR cd_marital_status@2 = W AND cd_education_status@3 = 2 yr Degree) AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= S AND S <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= College AND College <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= 2 yr Degree AND 2 yr Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (2 yr Degree, Advanced Degree, College), cd_marital_status in (M, S, W)] └────────────────────────────────────────────────── ┌───── Stage 10 ── Tasks: t0:[p0..p11] t1:[p0..p11] t2:[p0..p11] t3:[p0..p11] │ RepartitionExec: partitioning=Hash([cd_demo_sk@0, cd_marital_status@1, cd_education_status@2], 12), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -11137,10 +11137,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -11169,10 +11169,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -11201,10 +11201,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -11303,10 +11303,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -11349,10 +11349,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -11395,10 +11395,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 11] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 9 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -11441,10 +11441,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 15] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 13 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -11487,10 +11487,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 19] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 17 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -11533,10 +11533,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 23] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 21 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -11579,10 +11579,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 27] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 25 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -11625,10 +11625,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 31] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 29 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -11693,10 +11693,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_store_sk, ss_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p7] t1:[p8..p15] t2:[p16..p23] t3:[p24..p31] │ BroadcastExec: input_partitions=2, consumer_tasks=4, output_partitions=8 @@ -11758,10 +11758,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_time_sk, ws_ship_hdemo_sk, ws_web_page_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_time_sk, ws_ship_hdemo_sk, ws_web_page_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_time_sk, ws_ship_hdemo_sk, ws_web_page_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_time_sk, ws_ship_hdemo_sk, ws_web_page_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_time_sk, ws_ship_hdemo_sk, ws_web_page_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_time_sk, ws_ship_hdemo_sk, ws_web_page_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_time_sk, ws_ship_hdemo_sk, ws_web_page_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_time_sk, ws_ship_hdemo_sk, ws_web_page_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -11804,10 +11804,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_time_sk, ws_ship_hdemo_sk, ws_web_page_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_time_sk, ws_ship_hdemo_sk, ws_web_page_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_time_sk, ws_ship_hdemo_sk, ws_web_page_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_time_sk, ws_ship_hdemo_sk, ws_web_page_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_time_sk, ws_ship_hdemo_sk, ws_web_page_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_time_sk, ws_ship_hdemo_sk, ws_web_page_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_time_sk, ws_ship_hdemo_sk, ws_web_page_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_time_sk, ws_ship_hdemo_sk, ws_web_page_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -11866,10 +11866,10 @@ mod tests { │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ FilterExec: cd_marital_status@1 = M AND cd_education_status@2 = Unknown OR cd_marital_status@1 = W AND cd_education_status@2 = Advanced Degree │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=(cd_marital_status@2 = M AND cd_education_status@3 = Unknown OR cd_marital_status@2 = W AND cd_education_status@3 = Advanced Degree) AND DynamicFilter [ empty ], pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Unknown AND Unknown <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (Advanced Degree, Unknown), cd_marital_status in (M, W)] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=(cd_marital_status@2 = M AND cd_education_status@3 = Unknown OR cd_marital_status@2 = W AND cd_education_status@3 = Advanced Degree) AND DynamicFilter [ empty ], pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Unknown AND Unknown <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (Advanced Degree, Unknown), cd_marital_status in (M, W)] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=(cd_marital_status@2 = M AND cd_education_status@3 = Unknown OR cd_marital_status@2 = W AND cd_education_status@3 = Advanced Degree) AND DynamicFilter [ empty ], pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Unknown AND Unknown <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (Advanced Degree, Unknown), cd_marital_status in (M, W)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=(cd_marital_status@2 = M AND cd_education_status@3 = Unknown OR cd_marital_status@2 = W AND cd_education_status@3 = Advanced Degree) AND DynamicFilter [ empty ], pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Unknown AND Unknown <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (Advanced Degree, Unknown), cd_marital_status in (M, W)] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=(cd_marital_status@2 = M AND cd_education_status@3 = Unknown OR cd_marital_status@2 = W AND cd_education_status@3 = Advanced Degree) AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Unknown AND Unknown <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (Advanced Degree, Unknown), cd_marital_status in (M, W)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=(cd_marital_status@2 = M AND cd_education_status@3 = Unknown OR cd_marital_status@2 = W AND cd_education_status@3 = Advanced Degree) AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Unknown AND Unknown <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (Advanced Degree, Unknown), cd_marital_status in (M, W)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=(cd_marital_status@2 = M AND cd_education_status@3 = Unknown OR cd_marital_status@2 = W AND cd_education_status@3 = Advanced Degree) AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Unknown AND Unknown <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (Advanced Degree, Unknown), cd_marital_status in (M, W)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_demographics/part-3.parquet:..]]}, projection=[cd_demo_sk, cd_marital_status, cd_education_status], file_type=parquet, predicate=(cd_marital_status@2 = M AND cd_education_status@3 = Unknown OR cd_marital_status@2 = W AND cd_education_status@3 = Advanced Degree) AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= M AND M <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Unknown AND Unknown <= cd_education_status_max@5 OR cd_marital_status_null_count@2 != row_count@3 AND cd_marital_status_min@0 <= W AND W <= cd_marital_status_max@1 AND cd_education_status_null_count@6 != row_count@3 AND cd_education_status_min@4 <= Advanced Degree AND Advanced Degree <= cd_education_status_max@5, required_guarantees=[cd_education_status in (Advanced Degree, Unknown), cd_marital_status in (M, W)] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -11888,10 +11888,10 @@ mod tests { │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ FilterExec: ca_gmt_offset@1 = -7.00, projection=[ca_address_sk@0] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -7.00 AND DynamicFilter [ empty ], pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -7.00 AND -7.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-7.00)] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -7.00 AND DynamicFilter [ empty ], pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -7.00 AND -7.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-7.00)] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -7.00 AND DynamicFilter [ empty ], pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -7.00 AND -7.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-7.00)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -7.00 AND DynamicFilter [ empty ], pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -7.00 AND -7.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-7.00)] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -7.00 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -7.00 AND -7.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-7.00)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -7.00 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -7.00 AND -7.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-7.00)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -7.00 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -7.00 AND -7.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-7.00)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer_address/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer_address/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer_address/part-3.parquet:..]]}, projection=[ca_address_sk, ca_gmt_offset], file_type=parquet, predicate=ca_gmt_offset@11 = -7.00 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=ca_gmt_offset_null_count@2 != row_count@3 AND ca_gmt_offset_min@0 <= -7.00 AND -7.00 <= ca_gmt_offset_max@1, required_guarantees=[ca_gmt_offset in (-7.00)] └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -11899,10 +11899,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/customer/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/customer/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/customer/part-3.parquet:..]]}, projection=[c_customer_sk, c_current_cdemo_sk, c_current_hdemo_sk, c_current_addr_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -11913,10 +11913,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_call_center_sk, cr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_call_center_sk, cr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_call_center_sk, cr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_call_center_sk, cr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_call_center_sk, cr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_call_center_sk, cr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_call_center_sk, cr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_returns/part-3.parquet:..]]}, projection=[cr_returned_date_sk, cr_returning_customer_sk, cr_call_center_sk, cr_net_loss], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -11963,10 +11963,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -11993,10 +11993,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_sold_date_sk, ws_item_sk, ws_ext_discount_amt], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -12083,9 +12083,9 @@ mod tests { │ CoalescePartitionsExec │ [Stage 4] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_returns/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_returns/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_returns/part-3.parquet:..]]}, projection=[wr_order_number], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(web_site_sk@0, ws_web_site_sk@0)], projection=[ws_warehouse_sk@2, ws_order_number@3, ws_ext_ship_cost@4, ws_net_profit@5] @@ -12098,10 +12098,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_ship_date_sk, ws_ship_addr_sk, ws_web_site_sk, ws_warehouse_sk, ws_order_number, ws_ext_ship_cost, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_ship_date_sk, ws_ship_addr_sk, ws_web_site_sk, ws_warehouse_sk, ws_order_number, ws_ext_ship_cost, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_ship_date_sk, ws_ship_addr_sk, ws_web_site_sk, ws_warehouse_sk, ws_order_number, ws_ext_ship_cost, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_ship_date_sk, ws_ship_addr_sk, ws_web_site_sk, ws_warehouse_sk, ws_order_number, ws_ext_ship_cost, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_ship_date_sk, ws_ship_addr_sk, ws_web_site_sk, ws_warehouse_sk, ws_order_number, ws_ext_ship_cost, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_ship_date_sk, ws_ship_addr_sk, ws_web_site_sk, ws_warehouse_sk, ws_order_number, ws_ext_ship_cost, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_ship_date_sk, ws_ship_addr_sk, ws_web_site_sk, ws_warehouse_sk, ws_order_number, ws_ext_ship_cost, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_ship_date_sk, ws_ship_addr_sk, ws_web_site_sk, ws_warehouse_sk, ws_order_number, ws_ext_ship_cost, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -12167,18 +12167,18 @@ mod tests { ┌───── Stage 1 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ RepartitionExec: partitioning=Hash([ws_order_number@1], 3), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ RepartitionExec: partitioning=Hash([ws_order_number@1], 3), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(web_site_sk@0, ws_web_site_sk@0)], projection=[ws_order_number@2, ws_ext_ship_cost@3, ws_net_profit@4] @@ -12191,10 +12191,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_ship_date_sk, ws_ship_addr_sk, ws_web_site_sk, ws_order_number, ws_ext_ship_cost, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_ship_date_sk, ws_ship_addr_sk, ws_web_site_sk, ws_order_number, ws_ext_ship_cost, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_ship_date_sk, ws_ship_addr_sk, ws_web_site_sk, ws_order_number, ws_ext_ship_cost, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_ship_date_sk, ws_ship_addr_sk, ws_web_site_sk, ws_order_number, ws_ext_ship_cost, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_ship_date_sk, ws_ship_addr_sk, ws_web_site_sk, ws_order_number, ws_ext_ship_cost, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_ship_date_sk, ws_ship_addr_sk, ws_web_site_sk, ws_order_number, ws_ext_ship_cost, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_ship_date_sk, ws_ship_addr_sk, ws_web_site_sk, ws_order_number, ws_ext_ship_cost, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_ship_date_sk, ws_ship_addr_sk, ws_web_site_sk, ws_order_number, ws_ext_ship_cost, ws_net_profit], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -12227,18 +12227,18 @@ mod tests { ┌───── Stage 7 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ RepartitionExec: partitioning=Hash([ws_order_number@1], 3), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p2] t1:[p0..p2] t2:[p0..p2] t3:[p0..p2] │ RepartitionExec: partitioning=Hash([ws_order_number@1], 3), input_partitions=3 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/web_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/web_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/web_sales/part-3.parquet:..]]}, projection=[ws_warehouse_sk, ws_order_number], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -12266,10 +12266,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_time_sk, ss_hdemo_sk, ss_store_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -12332,10 +12332,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_bill_customer_sk, cs_item_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -12353,10 +12353,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_customer_sk], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -12397,10 +12397,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/store_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/store_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/store_sales/part-3.parquet:..]]}, projection=[ss_sold_date_sk, ss_item_sk, ss_ext_sales_price], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -12454,10 +12454,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=2, stage_partitions=8, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_ship_date_sk, cs_call_center_sk, cs_ship_mode_sk, cs_warehouse_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_ship_date_sk, cs_call_center_sk, cs_ship_mode_sk, cs_warehouse_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_ship_date_sk, cs_call_center_sk, cs_ship_mode_sk, cs_warehouse_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_ship_date_sk, cs_call_center_sk, cs_ship_mode_sk, cs_warehouse_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..]]}, projection=[cs_sold_date_sk, cs_ship_date_sk, cs_call_center_sk, cs_ship_mode_sk, cs_warehouse_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_ship_date_sk, cs_call_center_sk, cs_ship_mode_sk, cs_warehouse_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-0.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_ship_date_sk, cs_call_center_sk, cs_ship_mode_sk, cs_warehouse_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-1.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:.., /testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-2.parquet:..], [/testdata/tpcds/plans_sf1_partitions4/catalog_sales/part-3.parquet:..]]}, projection=[cs_sold_date_sk, cs_ship_date_sk, cs_call_center_sk, cs_ship_mode_sk, cs_warehouse_sk], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -12535,16 +12535,9 @@ mod tests { let df = d_ctx.sql(&query_sql).await?; let plan = df.create_physical_plan().await?; if plan.is::() { - Ok(normalize_plan_display(display_plan_ascii( - plan.as_ref(), - false, - ))) + Ok(display_plan_ascii(plan.as_ref(), false)) } else { Ok("".to_string()) } } - - fn normalize_plan_display(display: String) -> String { - display.replace(", dynamic_rg_pruning=eligible", "") - } } diff --git a/tests/tpch_plans_test.rs b/tests/tpch_plans_test.rs index 2667c5a1..72fe9d54 100644 --- a/tests/tpch_plans_test.rs +++ b/tests/tpch_plans_test.rs @@ -75,10 +75,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/1.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/10.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/15.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/5.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/10.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/11.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/15.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/16.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/5.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/6.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/7.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/11.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/12.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/16.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/2.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/3.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/7.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/8.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/12.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/13.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/3.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/8.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/9.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/1.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/10.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/15.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/5.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/10.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/11.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/15.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/16.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/5.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/6.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/7.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/11.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/12.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/16.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/2.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/3.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/7.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/8.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/12.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/13.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/3.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/8.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/9.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -92,18 +92,18 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/1.parquet:.., /testdata/tpch/plan_sf0.02/nation/10.parquet:..], [/testdata/tpch/plan_sf0.02/nation/14.parquet:.., /testdata/tpch/plan_sf0.02/nation/15.parquet:..], [/testdata/tpch/plan_sf0.02/nation/4.parquet:.., /testdata/tpch/plan_sf0.02/nation/5.parquet:.., /testdata/tpch/plan_sf0.02/nation/6.parquet:..]]}, projection=[n_nationkey, n_name, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/10.parquet:.., /testdata/tpch/plan_sf0.02/nation/11.parquet:..], [/testdata/tpch/plan_sf0.02/nation/15.parquet:.., /testdata/tpch/plan_sf0.02/nation/16.parquet:.., /testdata/tpch/plan_sf0.02/nation/2.parquet:..], [/testdata/tpch/plan_sf0.02/nation/6.parquet:.., /testdata/tpch/plan_sf0.02/nation/7.parquet:..]]}, projection=[n_nationkey, n_name, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/11.parquet:.., /testdata/tpch/plan_sf0.02/nation/12.parquet:.., /testdata/tpch/plan_sf0.02/nation/13.parquet:..], [/testdata/tpch/plan_sf0.02/nation/2.parquet:.., /testdata/tpch/plan_sf0.02/nation/3.parquet:..], [/testdata/tpch/plan_sf0.02/nation/7.parquet:.., /testdata/tpch/plan_sf0.02/nation/8.parquet:..]]}, projection=[n_nationkey, n_name, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/13.parquet:.., /testdata/tpch/plan_sf0.02/nation/14.parquet:..], [/testdata/tpch/plan_sf0.02/nation/3.parquet:.., /testdata/tpch/plan_sf0.02/nation/4.parquet:..], [/testdata/tpch/plan_sf0.02/nation/8.parquet:.., /testdata/tpch/plan_sf0.02/nation/9.parquet:..]]}, projection=[n_nationkey, n_name, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/1.parquet:.., /testdata/tpch/plan_sf0.02/nation/10.parquet:..], [/testdata/tpch/plan_sf0.02/nation/14.parquet:.., /testdata/tpch/plan_sf0.02/nation/15.parquet:..], [/testdata/tpch/plan_sf0.02/nation/4.parquet:.., /testdata/tpch/plan_sf0.02/nation/5.parquet:.., /testdata/tpch/plan_sf0.02/nation/6.parquet:..]]}, projection=[n_nationkey, n_name, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/10.parquet:.., /testdata/tpch/plan_sf0.02/nation/11.parquet:..], [/testdata/tpch/plan_sf0.02/nation/15.parquet:.., /testdata/tpch/plan_sf0.02/nation/16.parquet:.., /testdata/tpch/plan_sf0.02/nation/2.parquet:..], [/testdata/tpch/plan_sf0.02/nation/6.parquet:.., /testdata/tpch/plan_sf0.02/nation/7.parquet:..]]}, projection=[n_nationkey, n_name, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/11.parquet:.., /testdata/tpch/plan_sf0.02/nation/12.parquet:.., /testdata/tpch/plan_sf0.02/nation/13.parquet:..], [/testdata/tpch/plan_sf0.02/nation/2.parquet:.., /testdata/tpch/plan_sf0.02/nation/3.parquet:..], [/testdata/tpch/plan_sf0.02/nation/7.parquet:.., /testdata/tpch/plan_sf0.02/nation/8.parquet:..]]}, projection=[n_nationkey, n_name, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/13.parquet:.., /testdata/tpch/plan_sf0.02/nation/14.parquet:..], [/testdata/tpch/plan_sf0.02/nation/3.parquet:.., /testdata/tpch/plan_sf0.02/nation/4.parquet:..], [/testdata/tpch/plan_sf0.02/nation/8.parquet:.., /testdata/tpch/plan_sf0.02/nation/9.parquet:..]]}, projection=[n_nationkey, n_name, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/1.parquet:.., /testdata/tpch/plan_sf0.02/supplier/10.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/14.parquet:.., /testdata/tpch/plan_sf0.02/supplier/15.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/4.parquet:.., /testdata/tpch/plan_sf0.02/supplier/5.parquet:..]]}, projection=[s_suppkey, s_name, s_address, s_nationkey, s_phone, s_acctbal, s_comment], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/10.parquet:.., /testdata/tpch/plan_sf0.02/supplier/11.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/15.parquet:.., /testdata/tpch/plan_sf0.02/supplier/16.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/5.parquet:.., /testdata/tpch/plan_sf0.02/supplier/6.parquet:.., /testdata/tpch/plan_sf0.02/supplier/7.parquet:..]]}, projection=[s_suppkey, s_name, s_address, s_nationkey, s_phone, s_acctbal, s_comment], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/11.parquet:.., /testdata/tpch/plan_sf0.02/supplier/12.parquet:.., /testdata/tpch/plan_sf0.02/supplier/13.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/16.parquet:.., /testdata/tpch/plan_sf0.02/supplier/2.parquet:.., /testdata/tpch/plan_sf0.02/supplier/3.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/7.parquet:.., /testdata/tpch/plan_sf0.02/supplier/8.parquet:..]]}, projection=[s_suppkey, s_name, s_address, s_nationkey, s_phone, s_acctbal, s_comment], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/13.parquet:.., /testdata/tpch/plan_sf0.02/supplier/14.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/3.parquet:.., /testdata/tpch/plan_sf0.02/supplier/4.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/8.parquet:.., /testdata/tpch/plan_sf0.02/supplier/9.parquet:..]]}, projection=[s_suppkey, s_name, s_address, s_nationkey, s_phone, s_acctbal, s_comment], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/1.parquet:.., /testdata/tpch/plan_sf0.02/supplier/10.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/14.parquet:.., /testdata/tpch/plan_sf0.02/supplier/15.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/4.parquet:.., /testdata/tpch/plan_sf0.02/supplier/5.parquet:..]]}, projection=[s_suppkey, s_name, s_address, s_nationkey, s_phone, s_acctbal, s_comment], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/10.parquet:.., /testdata/tpch/plan_sf0.02/supplier/11.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/15.parquet:.., /testdata/tpch/plan_sf0.02/supplier/16.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/5.parquet:.., /testdata/tpch/plan_sf0.02/supplier/6.parquet:.., /testdata/tpch/plan_sf0.02/supplier/7.parquet:..]]}, projection=[s_suppkey, s_name, s_address, s_nationkey, s_phone, s_acctbal, s_comment], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/11.parquet:.., /testdata/tpch/plan_sf0.02/supplier/12.parquet:.., /testdata/tpch/plan_sf0.02/supplier/13.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/16.parquet:.., /testdata/tpch/plan_sf0.02/supplier/2.parquet:.., /testdata/tpch/plan_sf0.02/supplier/3.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/7.parquet:.., /testdata/tpch/plan_sf0.02/supplier/8.parquet:..]]}, projection=[s_suppkey, s_name, s_address, s_nationkey, s_phone, s_acctbal, s_comment], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/13.parquet:.., /testdata/tpch/plan_sf0.02/supplier/14.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/3.parquet:.., /testdata/tpch/plan_sf0.02/supplier/4.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/8.parquet:.., /testdata/tpch/plan_sf0.02/supplier/9.parquet:..]]}, projection=[s_suppkey, s_name, s_address, s_nationkey, s_phone, s_acctbal, s_comment], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -133,10 +133,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 8] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/1.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/10.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/15.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/5.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/10.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/11.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/15.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/16.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/5.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/6.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/7.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/11.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/12.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/16.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/2.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/3.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/7.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/8.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/12.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/13.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/3.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/8.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/9.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/1.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/10.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/15.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/5.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/10.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/11.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/15.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/16.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/5.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/6.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/7.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/11.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/12.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/16.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/2.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/3.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/7.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/8.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/12.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/13.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/3.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/8.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/9.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -150,18 +150,18 @@ mod tests { ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/1.parquet:.., /testdata/tpch/plan_sf0.02/nation/10.parquet:..], [/testdata/tpch/plan_sf0.02/nation/14.parquet:.., /testdata/tpch/plan_sf0.02/nation/15.parquet:..], [/testdata/tpch/plan_sf0.02/nation/4.parquet:.., /testdata/tpch/plan_sf0.02/nation/5.parquet:.., /testdata/tpch/plan_sf0.02/nation/6.parquet:..]]}, projection=[n_nationkey, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/10.parquet:.., /testdata/tpch/plan_sf0.02/nation/11.parquet:..], [/testdata/tpch/plan_sf0.02/nation/15.parquet:.., /testdata/tpch/plan_sf0.02/nation/16.parquet:.., /testdata/tpch/plan_sf0.02/nation/2.parquet:..], [/testdata/tpch/plan_sf0.02/nation/6.parquet:.., /testdata/tpch/plan_sf0.02/nation/7.parquet:..]]}, projection=[n_nationkey, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/11.parquet:.., /testdata/tpch/plan_sf0.02/nation/12.parquet:.., /testdata/tpch/plan_sf0.02/nation/13.parquet:..], [/testdata/tpch/plan_sf0.02/nation/2.parquet:.., /testdata/tpch/plan_sf0.02/nation/3.parquet:..], [/testdata/tpch/plan_sf0.02/nation/7.parquet:.., /testdata/tpch/plan_sf0.02/nation/8.parquet:..]]}, projection=[n_nationkey, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/13.parquet:.., /testdata/tpch/plan_sf0.02/nation/14.parquet:..], [/testdata/tpch/plan_sf0.02/nation/3.parquet:.., /testdata/tpch/plan_sf0.02/nation/4.parquet:..], [/testdata/tpch/plan_sf0.02/nation/8.parquet:.., /testdata/tpch/plan_sf0.02/nation/9.parquet:..]]}, projection=[n_nationkey, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/1.parquet:.., /testdata/tpch/plan_sf0.02/nation/10.parquet:..], [/testdata/tpch/plan_sf0.02/nation/14.parquet:.., /testdata/tpch/plan_sf0.02/nation/15.parquet:..], [/testdata/tpch/plan_sf0.02/nation/4.parquet:.., /testdata/tpch/plan_sf0.02/nation/5.parquet:.., /testdata/tpch/plan_sf0.02/nation/6.parquet:..]]}, projection=[n_nationkey, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/10.parquet:.., /testdata/tpch/plan_sf0.02/nation/11.parquet:..], [/testdata/tpch/plan_sf0.02/nation/15.parquet:.., /testdata/tpch/plan_sf0.02/nation/16.parquet:.., /testdata/tpch/plan_sf0.02/nation/2.parquet:..], [/testdata/tpch/plan_sf0.02/nation/6.parquet:.., /testdata/tpch/plan_sf0.02/nation/7.parquet:..]]}, projection=[n_nationkey, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/11.parquet:.., /testdata/tpch/plan_sf0.02/nation/12.parquet:.., /testdata/tpch/plan_sf0.02/nation/13.parquet:..], [/testdata/tpch/plan_sf0.02/nation/2.parquet:.., /testdata/tpch/plan_sf0.02/nation/3.parquet:..], [/testdata/tpch/plan_sf0.02/nation/7.parquet:.., /testdata/tpch/plan_sf0.02/nation/8.parquet:..]]}, projection=[n_nationkey, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/13.parquet:.., /testdata/tpch/plan_sf0.02/nation/14.parquet:..], [/testdata/tpch/plan_sf0.02/nation/3.parquet:.., /testdata/tpch/plan_sf0.02/nation/4.parquet:..], [/testdata/tpch/plan_sf0.02/nation/8.parquet:.., /testdata/tpch/plan_sf0.02/nation/9.parquet:..]]}, projection=[n_nationkey, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 8 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/1.parquet:.., /testdata/tpch/plan_sf0.02/supplier/10.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/14.parquet:.., /testdata/tpch/plan_sf0.02/supplier/15.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/4.parquet:.., /testdata/tpch/plan_sf0.02/supplier/5.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/10.parquet:.., /testdata/tpch/plan_sf0.02/supplier/11.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/15.parquet:.., /testdata/tpch/plan_sf0.02/supplier/16.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/5.parquet:.., /testdata/tpch/plan_sf0.02/supplier/6.parquet:.., /testdata/tpch/plan_sf0.02/supplier/7.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/11.parquet:.., /testdata/tpch/plan_sf0.02/supplier/12.parquet:.., /testdata/tpch/plan_sf0.02/supplier/13.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/16.parquet:.., /testdata/tpch/plan_sf0.02/supplier/2.parquet:.., /testdata/tpch/plan_sf0.02/supplier/3.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/7.parquet:.., /testdata/tpch/plan_sf0.02/supplier/8.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/13.parquet:.., /testdata/tpch/plan_sf0.02/supplier/14.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/3.parquet:.., /testdata/tpch/plan_sf0.02/supplier/4.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/8.parquet:.., /testdata/tpch/plan_sf0.02/supplier/9.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/1.parquet:.., /testdata/tpch/plan_sf0.02/supplier/10.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/14.parquet:.., /testdata/tpch/plan_sf0.02/supplier/15.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/4.parquet:.., /testdata/tpch/plan_sf0.02/supplier/5.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/10.parquet:.., /testdata/tpch/plan_sf0.02/supplier/11.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/15.parquet:.., /testdata/tpch/plan_sf0.02/supplier/16.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/5.parquet:.., /testdata/tpch/plan_sf0.02/supplier/6.parquet:.., /testdata/tpch/plan_sf0.02/supplier/7.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/11.parquet:.., /testdata/tpch/plan_sf0.02/supplier/12.parquet:.., /testdata/tpch/plan_sf0.02/supplier/13.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/16.parquet:.., /testdata/tpch/plan_sf0.02/supplier/2.parquet:.., /testdata/tpch/plan_sf0.02/supplier/3.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/7.parquet:.., /testdata/tpch/plan_sf0.02/supplier/8.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/13.parquet:.., /testdata/tpch/plan_sf0.02/supplier/14.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/3.parquet:.., /testdata/tpch/plan_sf0.02/supplier/4.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/8.parquet:.., /testdata/tpch/plan_sf0.02/supplier/9.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -189,10 +189,10 @@ mod tests { │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ FilterExec: l_shipdate@3 > 1995-03-15, projection=[l_orderkey@0, l_extendedprice@1, l_discount@2] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_orderkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 > 1995-03-15 AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 > 1995-03-15, required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_orderkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 > 1995-03-15 AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 > 1995-03-15, required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_orderkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 > 1995-03-15 AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 > 1995-03-15, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 > 1995-03-15 AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 > 1995-03-15, required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_orderkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 > 1995-03-15 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 > 1995-03-15, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_orderkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 > 1995-03-15 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 > 1995-03-15, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_orderkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 > 1995-03-15 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 > 1995-03-15, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 > 1995-03-15 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 > 1995-03-15, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -201,10 +201,10 @@ mod tests { │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ FilterExec: o_orderdate@2 < 1995-03-15 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:..], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:..], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate, o_shippriority], file_type=parquet, predicate=o_orderdate@4 < 1995-03-15 AND DynamicFilter [ empty ], pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@0 < 1995-03-15, required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:..], [/testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:..], [/testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate, o_shippriority], file_type=parquet, predicate=o_orderdate@4 < 1995-03-15 AND DynamicFilter [ empty ], pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@0 < 1995-03-15, required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:..], [/testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:..], [/testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate, o_shippriority], file_type=parquet, predicate=o_orderdate@4 < 1995-03-15 AND DynamicFilter [ empty ], pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@0 < 1995-03-15, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate, o_shippriority], file_type=parquet, predicate=o_orderdate@4 < 1995-03-15 AND DynamicFilter [ empty ], pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@0 < 1995-03-15, required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:..], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:..], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate, o_shippriority], file_type=parquet, predicate=o_orderdate@4 < 1995-03-15 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@0 < 1995-03-15, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:..], [/testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:..], [/testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate, o_shippriority], file_type=parquet, predicate=o_orderdate@4 < 1995-03-15 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@0 < 1995-03-15, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:..], [/testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:..], [/testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate, o_shippriority], file_type=parquet, predicate=o_orderdate@4 < 1995-03-15 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@0 < 1995-03-15, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate, o_shippriority], file_type=parquet, predicate=o_orderdate@4 < 1995-03-15 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@0 < 1995-03-15, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -235,7 +235,7 @@ mod tests { │ [Stage 1] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 │ FilterExec: l_receiptdate@2 > l_commitdate@1, projection=[l_orderkey@0] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., ...], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., ...], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., ...]]}, projection=[l_orderkey, l_commitdate, l_receiptdate], file_type=parquet, predicate=l_receiptdate@12 > l_commitdate@11 AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., ...], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., ...], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., ...]]}, projection=[l_orderkey, l_commitdate, l_receiptdate], file_type=parquet, predicate=l_receiptdate@12 > l_commitdate@11 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ FilterExec: o_orderdate@1 >= 1993-07-01 AND o_orderdate@1 < 1993-10-01, projection=[o_orderkey@0, o_orderpriority@2] @@ -279,10 +279,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -296,18 +296,18 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/1.parquet:.., /testdata/tpch/plan_sf0.02/nation/10.parquet:..], [/testdata/tpch/plan_sf0.02/nation/14.parquet:.., /testdata/tpch/plan_sf0.02/nation/15.parquet:..], [/testdata/tpch/plan_sf0.02/nation/4.parquet:.., /testdata/tpch/plan_sf0.02/nation/5.parquet:.., /testdata/tpch/plan_sf0.02/nation/6.parquet:..]]}, projection=[n_nationkey, n_name, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/10.parquet:.., /testdata/tpch/plan_sf0.02/nation/11.parquet:..], [/testdata/tpch/plan_sf0.02/nation/15.parquet:.., /testdata/tpch/plan_sf0.02/nation/16.parquet:.., /testdata/tpch/plan_sf0.02/nation/2.parquet:..], [/testdata/tpch/plan_sf0.02/nation/6.parquet:.., /testdata/tpch/plan_sf0.02/nation/7.parquet:..]]}, projection=[n_nationkey, n_name, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/11.parquet:.., /testdata/tpch/plan_sf0.02/nation/12.parquet:.., /testdata/tpch/plan_sf0.02/nation/13.parquet:..], [/testdata/tpch/plan_sf0.02/nation/2.parquet:.., /testdata/tpch/plan_sf0.02/nation/3.parquet:..], [/testdata/tpch/plan_sf0.02/nation/7.parquet:.., /testdata/tpch/plan_sf0.02/nation/8.parquet:..]]}, projection=[n_nationkey, n_name, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/13.parquet:.., /testdata/tpch/plan_sf0.02/nation/14.parquet:..], [/testdata/tpch/plan_sf0.02/nation/3.parquet:.., /testdata/tpch/plan_sf0.02/nation/4.parquet:..], [/testdata/tpch/plan_sf0.02/nation/8.parquet:.., /testdata/tpch/plan_sf0.02/nation/9.parquet:..]]}, projection=[n_nationkey, n_name, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/1.parquet:.., /testdata/tpch/plan_sf0.02/nation/10.parquet:..], [/testdata/tpch/plan_sf0.02/nation/14.parquet:.., /testdata/tpch/plan_sf0.02/nation/15.parquet:..], [/testdata/tpch/plan_sf0.02/nation/4.parquet:.., /testdata/tpch/plan_sf0.02/nation/5.parquet:.., /testdata/tpch/plan_sf0.02/nation/6.parquet:..]]}, projection=[n_nationkey, n_name, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/10.parquet:.., /testdata/tpch/plan_sf0.02/nation/11.parquet:..], [/testdata/tpch/plan_sf0.02/nation/15.parquet:.., /testdata/tpch/plan_sf0.02/nation/16.parquet:.., /testdata/tpch/plan_sf0.02/nation/2.parquet:..], [/testdata/tpch/plan_sf0.02/nation/6.parquet:.., /testdata/tpch/plan_sf0.02/nation/7.parquet:..]]}, projection=[n_nationkey, n_name, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/11.parquet:.., /testdata/tpch/plan_sf0.02/nation/12.parquet:.., /testdata/tpch/plan_sf0.02/nation/13.parquet:..], [/testdata/tpch/plan_sf0.02/nation/2.parquet:.., /testdata/tpch/plan_sf0.02/nation/3.parquet:..], [/testdata/tpch/plan_sf0.02/nation/7.parquet:.., /testdata/tpch/plan_sf0.02/nation/8.parquet:..]]}, projection=[n_nationkey, n_name, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/13.parquet:.., /testdata/tpch/plan_sf0.02/nation/14.parquet:..], [/testdata/tpch/plan_sf0.02/nation/3.parquet:.., /testdata/tpch/plan_sf0.02/nation/4.parquet:..], [/testdata/tpch/plan_sf0.02/nation/8.parquet:.., /testdata/tpch/plan_sf0.02/nation/9.parquet:..]]}, projection=[n_nationkey, n_name, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/1.parquet:.., /testdata/tpch/plan_sf0.02/supplier/10.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/14.parquet:.., /testdata/tpch/plan_sf0.02/supplier/15.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/4.parquet:.., /testdata/tpch/plan_sf0.02/supplier/5.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/10.parquet:.., /testdata/tpch/plan_sf0.02/supplier/11.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/15.parquet:.., /testdata/tpch/plan_sf0.02/supplier/16.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/5.parquet:.., /testdata/tpch/plan_sf0.02/supplier/6.parquet:.., /testdata/tpch/plan_sf0.02/supplier/7.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/11.parquet:.., /testdata/tpch/plan_sf0.02/supplier/12.parquet:.., /testdata/tpch/plan_sf0.02/supplier/13.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/16.parquet:.., /testdata/tpch/plan_sf0.02/supplier/2.parquet:.., /testdata/tpch/plan_sf0.02/supplier/3.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/7.parquet:.., /testdata/tpch/plan_sf0.02/supplier/8.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/13.parquet:.., /testdata/tpch/plan_sf0.02/supplier/14.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/3.parquet:.., /testdata/tpch/plan_sf0.02/supplier/4.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/8.parquet:.., /testdata/tpch/plan_sf0.02/supplier/9.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/1.parquet:.., /testdata/tpch/plan_sf0.02/supplier/10.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/14.parquet:.., /testdata/tpch/plan_sf0.02/supplier/15.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/4.parquet:.., /testdata/tpch/plan_sf0.02/supplier/5.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/10.parquet:.., /testdata/tpch/plan_sf0.02/supplier/11.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/15.parquet:.., /testdata/tpch/plan_sf0.02/supplier/16.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/5.parquet:.., /testdata/tpch/plan_sf0.02/supplier/6.parquet:.., /testdata/tpch/plan_sf0.02/supplier/7.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/11.parquet:.., /testdata/tpch/plan_sf0.02/supplier/12.parquet:.., /testdata/tpch/plan_sf0.02/supplier/13.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/16.parquet:.., /testdata/tpch/plan_sf0.02/supplier/2.parquet:.., /testdata/tpch/plan_sf0.02/supplier/3.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/7.parquet:.., /testdata/tpch/plan_sf0.02/supplier/8.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/13.parquet:.., /testdata/tpch/plan_sf0.02/supplier/14.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/3.parquet:.., /testdata/tpch/plan_sf0.02/supplier/4.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/8.parquet:.., /testdata/tpch/plan_sf0.02/supplier/9.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -316,10 +316,10 @@ mod tests { │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ FilterExec: o_orderdate@2 >= 1994-01-01 AND o_orderdate@2 < 1995-01-01, projection=[o_orderkey@0, o_custkey@1] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:..], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:..], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1994-01-01 AND o_orderdate@4 < 1995-01-01 AND DynamicFilter [ empty ], pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1994-01-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 < 1995-01-01, required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:..], [/testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:..], [/testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1994-01-01 AND o_orderdate@4 < 1995-01-01 AND DynamicFilter [ empty ], pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1994-01-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 < 1995-01-01, required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:..], [/testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:..], [/testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1994-01-01 AND o_orderdate@4 < 1995-01-01 AND DynamicFilter [ empty ], pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1994-01-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 < 1995-01-01, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1994-01-01 AND o_orderdate@4 < 1995-01-01 AND DynamicFilter [ empty ], pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1994-01-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 < 1995-01-01, required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:..], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:..], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1994-01-01 AND o_orderdate@4 < 1995-01-01 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1994-01-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 < 1995-01-01, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:..], [/testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:..], [/testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1994-01-01 AND o_orderdate@4 < 1995-01-01 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1994-01-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 < 1995-01-01, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:..], [/testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:..], [/testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1994-01-01 AND o_orderdate@4 < 1995-01-01 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1994-01-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 < 1995-01-01, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1994-01-01 AND o_orderdate@4 < 1995-01-01 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1994-01-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 < 1995-01-01, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -391,10 +391,10 @@ mod tests { │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ FilterExec: l_shipdate@4 >= 1995-01-01 AND l_shipdate@4 <= 1996-12-31 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1995-01-01 AND l_shipdate@10 <= 1996-12-31 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1995-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 <= 1996-12-31, required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1995-01-01 AND l_shipdate@10 <= 1996-12-31 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1995-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 <= 1996-12-31, required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1995-01-01 AND l_shipdate@10 <= 1996-12-31 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1995-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 <= 1996-12-31, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1995-01-01 AND l_shipdate@10 <= 1996-12-31 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1995-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 <= 1996-12-31, required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1995-01-01 AND l_shipdate@10 <= 1996-12-31 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1995-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 <= 1996-12-31, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1995-01-01 AND l_shipdate@10 <= 1996-12-31 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1995-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 <= 1996-12-31, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1995-01-01 AND l_shipdate@10 <= 1996-12-31 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1995-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 <= 1996-12-31, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1995-01-01 AND l_shipdate@10 <= 1996-12-31 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1995-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 <= 1996-12-31, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -417,26 +417,26 @@ mod tests { ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/1.parquet:.., /testdata/tpch/plan_sf0.02/customer/10.parquet:..], [/testdata/tpch/plan_sf0.02/customer/14.parquet:.., /testdata/tpch/plan_sf0.02/customer/15.parquet:..], [/testdata/tpch/plan_sf0.02/customer/4.parquet:.., /testdata/tpch/plan_sf0.02/customer/5.parquet:.., /testdata/tpch/plan_sf0.02/customer/6.parquet:..]]}, projection=[c_custkey, c_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/10.parquet:.., /testdata/tpch/plan_sf0.02/customer/11.parquet:..], [/testdata/tpch/plan_sf0.02/customer/15.parquet:.., /testdata/tpch/plan_sf0.02/customer/16.parquet:..], [/testdata/tpch/plan_sf0.02/customer/6.parquet:.., /testdata/tpch/plan_sf0.02/customer/7.parquet:..]]}, projection=[c_custkey, c_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/11.parquet:.., /testdata/tpch/plan_sf0.02/customer/12.parquet:.., /testdata/tpch/plan_sf0.02/customer/13.parquet:..], [/testdata/tpch/plan_sf0.02/customer/16.parquet:.., /testdata/tpch/plan_sf0.02/customer/2.parquet:.., /testdata/tpch/plan_sf0.02/customer/3.parquet:..], [/testdata/tpch/plan_sf0.02/customer/7.parquet:.., /testdata/tpch/plan_sf0.02/customer/8.parquet:..]]}, projection=[c_custkey, c_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/13.parquet:.., /testdata/tpch/plan_sf0.02/customer/14.parquet:..], [/testdata/tpch/plan_sf0.02/customer/3.parquet:.., /testdata/tpch/plan_sf0.02/customer/4.parquet:..], [/testdata/tpch/plan_sf0.02/customer/8.parquet:.., /testdata/tpch/plan_sf0.02/customer/9.parquet:..]]}, projection=[c_custkey, c_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/1.parquet:.., /testdata/tpch/plan_sf0.02/customer/10.parquet:..], [/testdata/tpch/plan_sf0.02/customer/14.parquet:.., /testdata/tpch/plan_sf0.02/customer/15.parquet:..], [/testdata/tpch/plan_sf0.02/customer/4.parquet:.., /testdata/tpch/plan_sf0.02/customer/5.parquet:.., /testdata/tpch/plan_sf0.02/customer/6.parquet:..]]}, projection=[c_custkey, c_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/10.parquet:.., /testdata/tpch/plan_sf0.02/customer/11.parquet:..], [/testdata/tpch/plan_sf0.02/customer/15.parquet:.., /testdata/tpch/plan_sf0.02/customer/16.parquet:..], [/testdata/tpch/plan_sf0.02/customer/6.parquet:.., /testdata/tpch/plan_sf0.02/customer/7.parquet:..]]}, projection=[c_custkey, c_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/11.parquet:.., /testdata/tpch/plan_sf0.02/customer/12.parquet:.., /testdata/tpch/plan_sf0.02/customer/13.parquet:..], [/testdata/tpch/plan_sf0.02/customer/16.parquet:.., /testdata/tpch/plan_sf0.02/customer/2.parquet:.., /testdata/tpch/plan_sf0.02/customer/3.parquet:..], [/testdata/tpch/plan_sf0.02/customer/7.parquet:.., /testdata/tpch/plan_sf0.02/customer/8.parquet:..]]}, projection=[c_custkey, c_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/13.parquet:.., /testdata/tpch/plan_sf0.02/customer/14.parquet:..], [/testdata/tpch/plan_sf0.02/customer/3.parquet:.., /testdata/tpch/plan_sf0.02/customer/4.parquet:..], [/testdata/tpch/plan_sf0.02/customer/8.parquet:.., /testdata/tpch/plan_sf0.02/customer/9.parquet:..]]}, projection=[c_custkey, c_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:..], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:..], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:..]]}, projection=[o_orderkey, o_custkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:..], [/testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:..], [/testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:..]]}, projection=[o_orderkey, o_custkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:..], [/testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:..], [/testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:..]]}, projection=[o_orderkey, o_custkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_custkey], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:..], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:..], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:..]]}, projection=[o_orderkey, o_custkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:..], [/testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:..], [/testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:..]]}, projection=[o_orderkey, o_custkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:..], [/testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:..], [/testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:..]]}, projection=[o_orderkey, o_custkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_custkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/1.parquet:.., /testdata/tpch/plan_sf0.02/supplier/10.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/14.parquet:.., /testdata/tpch/plan_sf0.02/supplier/15.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/4.parquet:.., /testdata/tpch/plan_sf0.02/supplier/5.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/10.parquet:.., /testdata/tpch/plan_sf0.02/supplier/11.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/15.parquet:.., /testdata/tpch/plan_sf0.02/supplier/16.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/5.parquet:.., /testdata/tpch/plan_sf0.02/supplier/6.parquet:.., /testdata/tpch/plan_sf0.02/supplier/7.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/11.parquet:.., /testdata/tpch/plan_sf0.02/supplier/12.parquet:.., /testdata/tpch/plan_sf0.02/supplier/13.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/16.parquet:.., /testdata/tpch/plan_sf0.02/supplier/2.parquet:.., /testdata/tpch/plan_sf0.02/supplier/3.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/7.parquet:.., /testdata/tpch/plan_sf0.02/supplier/8.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/13.parquet:.., /testdata/tpch/plan_sf0.02/supplier/14.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/3.parquet:.., /testdata/tpch/plan_sf0.02/supplier/4.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/8.parquet:.., /testdata/tpch/plan_sf0.02/supplier/9.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/1.parquet:.., /testdata/tpch/plan_sf0.02/supplier/10.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/14.parquet:.., /testdata/tpch/plan_sf0.02/supplier/15.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/4.parquet:.., /testdata/tpch/plan_sf0.02/supplier/5.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/10.parquet:.., /testdata/tpch/plan_sf0.02/supplier/11.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/15.parquet:.., /testdata/tpch/plan_sf0.02/supplier/16.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/5.parquet:.., /testdata/tpch/plan_sf0.02/supplier/6.parquet:.., /testdata/tpch/plan_sf0.02/supplier/7.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/11.parquet:.., /testdata/tpch/plan_sf0.02/supplier/12.parquet:.., /testdata/tpch/plan_sf0.02/supplier/13.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/16.parquet:.., /testdata/tpch/plan_sf0.02/supplier/2.parquet:.., /testdata/tpch/plan_sf0.02/supplier/3.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/7.parquet:.., /testdata/tpch/plan_sf0.02/supplier/8.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/13.parquet:.., /testdata/tpch/plan_sf0.02/supplier/14.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/3.parquet:.., /testdata/tpch/plan_sf0.02/supplier/4.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/8.parquet:.., /testdata/tpch/plan_sf0.02/supplier/9.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -482,10 +482,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 7] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_orderkey, l_partkey, l_suppkey, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_orderkey, l_partkey, l_suppkey, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_orderkey, l_partkey, l_suppkey, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_partkey, l_suppkey, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_orderkey, l_partkey, l_suppkey, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_orderkey, l_partkey, l_suppkey, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_orderkey, l_partkey, l_suppkey, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_partkey, l_suppkey, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -507,35 +507,35 @@ mod tests { ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/1.parquet:.., /testdata/tpch/plan_sf0.02/nation/10.parquet:..], [/testdata/tpch/plan_sf0.02/nation/14.parquet:.., /testdata/tpch/plan_sf0.02/nation/15.parquet:..], [/testdata/tpch/plan_sf0.02/nation/4.parquet:.., /testdata/tpch/plan_sf0.02/nation/5.parquet:.., /testdata/tpch/plan_sf0.02/nation/6.parquet:..]]}, projection=[n_nationkey, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/10.parquet:.., /testdata/tpch/plan_sf0.02/nation/11.parquet:..], [/testdata/tpch/plan_sf0.02/nation/15.parquet:.., /testdata/tpch/plan_sf0.02/nation/16.parquet:.., /testdata/tpch/plan_sf0.02/nation/2.parquet:..], [/testdata/tpch/plan_sf0.02/nation/6.parquet:.., /testdata/tpch/plan_sf0.02/nation/7.parquet:..]]}, projection=[n_nationkey, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/11.parquet:.., /testdata/tpch/plan_sf0.02/nation/12.parquet:.., /testdata/tpch/plan_sf0.02/nation/13.parquet:..], [/testdata/tpch/plan_sf0.02/nation/2.parquet:.., /testdata/tpch/plan_sf0.02/nation/3.parquet:..], [/testdata/tpch/plan_sf0.02/nation/7.parquet:.., /testdata/tpch/plan_sf0.02/nation/8.parquet:..]]}, projection=[n_nationkey, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/13.parquet:.., /testdata/tpch/plan_sf0.02/nation/14.parquet:..], [/testdata/tpch/plan_sf0.02/nation/3.parquet:.., /testdata/tpch/plan_sf0.02/nation/4.parquet:..], [/testdata/tpch/plan_sf0.02/nation/8.parquet:.., /testdata/tpch/plan_sf0.02/nation/9.parquet:..]]}, projection=[n_nationkey, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/1.parquet:.., /testdata/tpch/plan_sf0.02/nation/10.parquet:..], [/testdata/tpch/plan_sf0.02/nation/14.parquet:.., /testdata/tpch/plan_sf0.02/nation/15.parquet:..], [/testdata/tpch/plan_sf0.02/nation/4.parquet:.., /testdata/tpch/plan_sf0.02/nation/5.parquet:.., /testdata/tpch/plan_sf0.02/nation/6.parquet:..]]}, projection=[n_nationkey, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/10.parquet:.., /testdata/tpch/plan_sf0.02/nation/11.parquet:..], [/testdata/tpch/plan_sf0.02/nation/15.parquet:.., /testdata/tpch/plan_sf0.02/nation/16.parquet:.., /testdata/tpch/plan_sf0.02/nation/2.parquet:..], [/testdata/tpch/plan_sf0.02/nation/6.parquet:.., /testdata/tpch/plan_sf0.02/nation/7.parquet:..]]}, projection=[n_nationkey, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/11.parquet:.., /testdata/tpch/plan_sf0.02/nation/12.parquet:.., /testdata/tpch/plan_sf0.02/nation/13.parquet:..], [/testdata/tpch/plan_sf0.02/nation/2.parquet:.., /testdata/tpch/plan_sf0.02/nation/3.parquet:..], [/testdata/tpch/plan_sf0.02/nation/7.parquet:.., /testdata/tpch/plan_sf0.02/nation/8.parquet:..]]}, projection=[n_nationkey, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/nation/13.parquet:.., /testdata/tpch/plan_sf0.02/nation/14.parquet:..], [/testdata/tpch/plan_sf0.02/nation/3.parquet:.., /testdata/tpch/plan_sf0.02/nation/4.parquet:..], [/testdata/tpch/plan_sf0.02/nation/8.parquet:.., /testdata/tpch/plan_sf0.02/nation/9.parquet:..]]}, projection=[n_nationkey, n_regionkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/1.parquet:.., /testdata/tpch/plan_sf0.02/customer/10.parquet:..], [/testdata/tpch/plan_sf0.02/customer/14.parquet:.., /testdata/tpch/plan_sf0.02/customer/15.parquet:..], [/testdata/tpch/plan_sf0.02/customer/4.parquet:.., /testdata/tpch/plan_sf0.02/customer/5.parquet:.., /testdata/tpch/plan_sf0.02/customer/6.parquet:..]]}, projection=[c_custkey, c_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/10.parquet:.., /testdata/tpch/plan_sf0.02/customer/11.parquet:..], [/testdata/tpch/plan_sf0.02/customer/15.parquet:.., /testdata/tpch/plan_sf0.02/customer/16.parquet:..], [/testdata/tpch/plan_sf0.02/customer/6.parquet:.., /testdata/tpch/plan_sf0.02/customer/7.parquet:..]]}, projection=[c_custkey, c_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/11.parquet:.., /testdata/tpch/plan_sf0.02/customer/12.parquet:.., /testdata/tpch/plan_sf0.02/customer/13.parquet:..], [/testdata/tpch/plan_sf0.02/customer/16.parquet:.., /testdata/tpch/plan_sf0.02/customer/2.parquet:.., /testdata/tpch/plan_sf0.02/customer/3.parquet:..], [/testdata/tpch/plan_sf0.02/customer/7.parquet:.., /testdata/tpch/plan_sf0.02/customer/8.parquet:..]]}, projection=[c_custkey, c_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/13.parquet:.., /testdata/tpch/plan_sf0.02/customer/14.parquet:..], [/testdata/tpch/plan_sf0.02/customer/3.parquet:.., /testdata/tpch/plan_sf0.02/customer/4.parquet:..], [/testdata/tpch/plan_sf0.02/customer/8.parquet:.., /testdata/tpch/plan_sf0.02/customer/9.parquet:..]]}, projection=[c_custkey, c_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/1.parquet:.., /testdata/tpch/plan_sf0.02/customer/10.parquet:..], [/testdata/tpch/plan_sf0.02/customer/14.parquet:.., /testdata/tpch/plan_sf0.02/customer/15.parquet:..], [/testdata/tpch/plan_sf0.02/customer/4.parquet:.., /testdata/tpch/plan_sf0.02/customer/5.parquet:.., /testdata/tpch/plan_sf0.02/customer/6.parquet:..]]}, projection=[c_custkey, c_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/10.parquet:.., /testdata/tpch/plan_sf0.02/customer/11.parquet:..], [/testdata/tpch/plan_sf0.02/customer/15.parquet:.., /testdata/tpch/plan_sf0.02/customer/16.parquet:..], [/testdata/tpch/plan_sf0.02/customer/6.parquet:.., /testdata/tpch/plan_sf0.02/customer/7.parquet:..]]}, projection=[c_custkey, c_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/11.parquet:.., /testdata/tpch/plan_sf0.02/customer/12.parquet:.., /testdata/tpch/plan_sf0.02/customer/13.parquet:..], [/testdata/tpch/plan_sf0.02/customer/16.parquet:.., /testdata/tpch/plan_sf0.02/customer/2.parquet:.., /testdata/tpch/plan_sf0.02/customer/3.parquet:..], [/testdata/tpch/plan_sf0.02/customer/7.parquet:.., /testdata/tpch/plan_sf0.02/customer/8.parquet:..]]}, projection=[c_custkey, c_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/13.parquet:.., /testdata/tpch/plan_sf0.02/customer/14.parquet:..], [/testdata/tpch/plan_sf0.02/customer/3.parquet:.., /testdata/tpch/plan_sf0.02/customer/4.parquet:..], [/testdata/tpch/plan_sf0.02/customer/8.parquet:.., /testdata/tpch/plan_sf0.02/customer/9.parquet:..]]}, projection=[c_custkey, c_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ FilterExec: o_orderdate@2 >= 1995-01-01 AND o_orderdate@2 <= 1996-12-31 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:..], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:..], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1995-01-01 AND o_orderdate@4 <= 1996-12-31 AND DynamicFilter [ empty ], pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1995-01-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 <= 1996-12-31, required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:..], [/testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:..], [/testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1995-01-01 AND o_orderdate@4 <= 1996-12-31 AND DynamicFilter [ empty ], pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1995-01-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 <= 1996-12-31, required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:..], [/testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:..], [/testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1995-01-01 AND o_orderdate@4 <= 1996-12-31 AND DynamicFilter [ empty ], pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1995-01-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 <= 1996-12-31, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1995-01-01 AND o_orderdate@4 <= 1996-12-31 AND DynamicFilter [ empty ], pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1995-01-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 <= 1996-12-31, required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:..], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:..], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1995-01-01 AND o_orderdate@4 <= 1996-12-31 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1995-01-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 <= 1996-12-31, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:..], [/testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:..], [/testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1995-01-01 AND o_orderdate@4 <= 1996-12-31 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1995-01-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 <= 1996-12-31, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:..], [/testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:..], [/testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1995-01-01 AND o_orderdate@4 <= 1996-12-31 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1995-01-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 <= 1996-12-31, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_custkey, o_orderdate], file_type=parquet, predicate=o_orderdate@4 >= 1995-01-01 AND o_orderdate@4 <= 1996-12-31 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=o_orderdate_null_count@1 != row_count@2 AND o_orderdate_max@0 >= 1995-01-01 AND o_orderdate_null_count@1 != row_count@2 AND o_orderdate_min@3 <= 1996-12-31, required_guarantees=[] └────────────────────────────────────────────────── ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/1.parquet:.., /testdata/tpch/plan_sf0.02/supplier/10.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/14.parquet:.., /testdata/tpch/plan_sf0.02/supplier/15.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/4.parquet:.., /testdata/tpch/plan_sf0.02/supplier/5.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/10.parquet:.., /testdata/tpch/plan_sf0.02/supplier/11.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/15.parquet:.., /testdata/tpch/plan_sf0.02/supplier/16.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/5.parquet:.., /testdata/tpch/plan_sf0.02/supplier/6.parquet:.., /testdata/tpch/plan_sf0.02/supplier/7.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/11.parquet:.., /testdata/tpch/plan_sf0.02/supplier/12.parquet:.., /testdata/tpch/plan_sf0.02/supplier/13.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/16.parquet:.., /testdata/tpch/plan_sf0.02/supplier/2.parquet:.., /testdata/tpch/plan_sf0.02/supplier/3.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/7.parquet:.., /testdata/tpch/plan_sf0.02/supplier/8.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/13.parquet:.., /testdata/tpch/plan_sf0.02/supplier/14.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/3.parquet:.., /testdata/tpch/plan_sf0.02/supplier/4.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/8.parquet:.., /testdata/tpch/plan_sf0.02/supplier/9.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/1.parquet:.., /testdata/tpch/plan_sf0.02/supplier/10.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/14.parquet:.., /testdata/tpch/plan_sf0.02/supplier/15.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/4.parquet:.., /testdata/tpch/plan_sf0.02/supplier/5.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/10.parquet:.., /testdata/tpch/plan_sf0.02/supplier/11.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/15.parquet:.., /testdata/tpch/plan_sf0.02/supplier/16.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/5.parquet:.., /testdata/tpch/plan_sf0.02/supplier/6.parquet:.., /testdata/tpch/plan_sf0.02/supplier/7.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/11.parquet:.., /testdata/tpch/plan_sf0.02/supplier/12.parquet:.., /testdata/tpch/plan_sf0.02/supplier/13.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/16.parquet:.., /testdata/tpch/plan_sf0.02/supplier/2.parquet:.., /testdata/tpch/plan_sf0.02/supplier/3.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/7.parquet:.., /testdata/tpch/plan_sf0.02/supplier/8.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/13.parquet:.., /testdata/tpch/plan_sf0.02/supplier/14.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/3.parquet:.., /testdata/tpch/plan_sf0.02/supplier/4.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/8.parquet:.., /testdata/tpch/plan_sf0.02/supplier/9.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -584,10 +584,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 5] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_orderkey, l_partkey, l_suppkey, l_quantity, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_orderkey, l_partkey, l_suppkey, l_quantity, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_orderkey, l_partkey, l_suppkey, l_quantity, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_partkey, l_suppkey, l_quantity, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_orderkey, l_partkey, l_suppkey, l_quantity, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_orderkey, l_partkey, l_suppkey, l_quantity, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_orderkey, l_partkey, l_suppkey, l_quantity, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_partkey, l_suppkey, l_quantity, l_extendedprice, l_discount], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -616,10 +616,10 @@ mod tests { ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/1.parquet:.., /testdata/tpch/plan_sf0.02/supplier/10.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/14.parquet:.., /testdata/tpch/plan_sf0.02/supplier/15.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/4.parquet:.., /testdata/tpch/plan_sf0.02/supplier/5.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/10.parquet:.., /testdata/tpch/plan_sf0.02/supplier/11.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/15.parquet:.., /testdata/tpch/plan_sf0.02/supplier/16.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/5.parquet:.., /testdata/tpch/plan_sf0.02/supplier/6.parquet:.., /testdata/tpch/plan_sf0.02/supplier/7.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/11.parquet:.., /testdata/tpch/plan_sf0.02/supplier/12.parquet:.., /testdata/tpch/plan_sf0.02/supplier/13.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/16.parquet:.., /testdata/tpch/plan_sf0.02/supplier/2.parquet:.., /testdata/tpch/plan_sf0.02/supplier/3.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/7.parquet:.., /testdata/tpch/plan_sf0.02/supplier/8.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/13.parquet:.., /testdata/tpch/plan_sf0.02/supplier/14.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/3.parquet:.., /testdata/tpch/plan_sf0.02/supplier/4.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/8.parquet:.., /testdata/tpch/plan_sf0.02/supplier/9.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/1.parquet:.., /testdata/tpch/plan_sf0.02/supplier/10.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/14.parquet:.., /testdata/tpch/plan_sf0.02/supplier/15.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/4.parquet:.., /testdata/tpch/plan_sf0.02/supplier/5.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/10.parquet:.., /testdata/tpch/plan_sf0.02/supplier/11.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/15.parquet:.., /testdata/tpch/plan_sf0.02/supplier/16.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/5.parquet:.., /testdata/tpch/plan_sf0.02/supplier/6.parquet:.., /testdata/tpch/plan_sf0.02/supplier/7.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/11.parquet:.., /testdata/tpch/plan_sf0.02/supplier/12.parquet:.., /testdata/tpch/plan_sf0.02/supplier/13.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/16.parquet:.., /testdata/tpch/plan_sf0.02/supplier/2.parquet:.., /testdata/tpch/plan_sf0.02/supplier/3.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/7.parquet:.., /testdata/tpch/plan_sf0.02/supplier/8.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/13.parquet:.., /testdata/tpch/plan_sf0.02/supplier/14.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/3.parquet:.., /testdata/tpch/plan_sf0.02/supplier/4.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/8.parquet:.., /testdata/tpch/plan_sf0.02/supplier/9.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -659,10 +659,10 @@ mod tests { │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ FilterExec: l_returnflag@3 = R, projection=[l_orderkey@0, l_extendedprice@1, l_discount@2] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_orderkey, l_extendedprice, l_discount, l_returnflag], file_type=parquet, predicate=l_returnflag@8 = R AND DynamicFilter [ empty ], pruning_predicate=l_returnflag_null_count@2 != row_count@3 AND l_returnflag_min@0 <= R AND R <= l_returnflag_max@1, required_guarantees=[l_returnflag in (R)] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_orderkey, l_extendedprice, l_discount, l_returnflag], file_type=parquet, predicate=l_returnflag@8 = R AND DynamicFilter [ empty ], pruning_predicate=l_returnflag_null_count@2 != row_count@3 AND l_returnflag_min@0 <= R AND R <= l_returnflag_max@1, required_guarantees=[l_returnflag in (R)] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_orderkey, l_extendedprice, l_discount, l_returnflag], file_type=parquet, predicate=l_returnflag@8 = R AND DynamicFilter [ empty ], pruning_predicate=l_returnflag_null_count@2 != row_count@3 AND l_returnflag_min@0 <= R AND R <= l_returnflag_max@1, required_guarantees=[l_returnflag in (R)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_extendedprice, l_discount, l_returnflag], file_type=parquet, predicate=l_returnflag@8 = R AND DynamicFilter [ empty ], pruning_predicate=l_returnflag_null_count@2 != row_count@3 AND l_returnflag_min@0 <= R AND R <= l_returnflag_max@1, required_guarantees=[l_returnflag in (R)] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_orderkey, l_extendedprice, l_discount, l_returnflag], file_type=parquet, predicate=l_returnflag@8 = R AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=l_returnflag_null_count@2 != row_count@3 AND l_returnflag_min@0 <= R AND R <= l_returnflag_max@1, required_guarantees=[l_returnflag in (R)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_orderkey, l_extendedprice, l_discount, l_returnflag], file_type=parquet, predicate=l_returnflag@8 = R AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=l_returnflag_null_count@2 != row_count@3 AND l_returnflag_min@0 <= R AND R <= l_returnflag_max@1, required_guarantees=[l_returnflag in (R)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_orderkey, l_extendedprice, l_discount, l_returnflag], file_type=parquet, predicate=l_returnflag@8 = R AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=l_returnflag_null_count@2 != row_count@3 AND l_returnflag_min@0 <= R AND R <= l_returnflag_max@1, required_guarantees=[l_returnflag in (R)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_extendedprice, l_discount, l_returnflag], file_type=parquet, predicate=l_returnflag@8 = R AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=l_returnflag_null_count@2 != row_count@3 AND l_returnflag_min@0 <= R AND R <= l_returnflag_max@1, required_guarantees=[l_returnflag in (R)] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -678,10 +678,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/1.parquet:.., /testdata/tpch/plan_sf0.02/customer/10.parquet:..], [/testdata/tpch/plan_sf0.02/customer/14.parquet:.., /testdata/tpch/plan_sf0.02/customer/15.parquet:..], [/testdata/tpch/plan_sf0.02/customer/4.parquet:.., /testdata/tpch/plan_sf0.02/customer/5.parquet:.., /testdata/tpch/plan_sf0.02/customer/6.parquet:..]]}, projection=[c_custkey, c_name, c_address, c_nationkey, c_phone, c_acctbal, c_comment], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/10.parquet:.., /testdata/tpch/plan_sf0.02/customer/11.parquet:..], [/testdata/tpch/plan_sf0.02/customer/15.parquet:.., /testdata/tpch/plan_sf0.02/customer/16.parquet:..], [/testdata/tpch/plan_sf0.02/customer/6.parquet:.., /testdata/tpch/plan_sf0.02/customer/7.parquet:..]]}, projection=[c_custkey, c_name, c_address, c_nationkey, c_phone, c_acctbal, c_comment], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/11.parquet:.., /testdata/tpch/plan_sf0.02/customer/12.parquet:.., /testdata/tpch/plan_sf0.02/customer/13.parquet:..], [/testdata/tpch/plan_sf0.02/customer/16.parquet:.., /testdata/tpch/plan_sf0.02/customer/2.parquet:.., /testdata/tpch/plan_sf0.02/customer/3.parquet:..], [/testdata/tpch/plan_sf0.02/customer/7.parquet:.., /testdata/tpch/plan_sf0.02/customer/8.parquet:..]]}, projection=[c_custkey, c_name, c_address, c_nationkey, c_phone, c_acctbal, c_comment], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/13.parquet:.., /testdata/tpch/plan_sf0.02/customer/14.parquet:..], [/testdata/tpch/plan_sf0.02/customer/3.parquet:.., /testdata/tpch/plan_sf0.02/customer/4.parquet:..], [/testdata/tpch/plan_sf0.02/customer/8.parquet:.., /testdata/tpch/plan_sf0.02/customer/9.parquet:..]]}, projection=[c_custkey, c_name, c_address, c_nationkey, c_phone, c_acctbal, c_comment], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/1.parquet:.., /testdata/tpch/plan_sf0.02/customer/10.parquet:..], [/testdata/tpch/plan_sf0.02/customer/14.parquet:.., /testdata/tpch/plan_sf0.02/customer/15.parquet:..], [/testdata/tpch/plan_sf0.02/customer/4.parquet:.., /testdata/tpch/plan_sf0.02/customer/5.parquet:.., /testdata/tpch/plan_sf0.02/customer/6.parquet:..]]}, projection=[c_custkey, c_name, c_address, c_nationkey, c_phone, c_acctbal, c_comment], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/10.parquet:.., /testdata/tpch/plan_sf0.02/customer/11.parquet:..], [/testdata/tpch/plan_sf0.02/customer/15.parquet:.., /testdata/tpch/plan_sf0.02/customer/16.parquet:..], [/testdata/tpch/plan_sf0.02/customer/6.parquet:.., /testdata/tpch/plan_sf0.02/customer/7.parquet:..]]}, projection=[c_custkey, c_name, c_address, c_nationkey, c_phone, c_acctbal, c_comment], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/11.parquet:.., /testdata/tpch/plan_sf0.02/customer/12.parquet:.., /testdata/tpch/plan_sf0.02/customer/13.parquet:..], [/testdata/tpch/plan_sf0.02/customer/16.parquet:.., /testdata/tpch/plan_sf0.02/customer/2.parquet:.., /testdata/tpch/plan_sf0.02/customer/3.parquet:..], [/testdata/tpch/plan_sf0.02/customer/7.parquet:.., /testdata/tpch/plan_sf0.02/customer/8.parquet:..]]}, projection=[c_custkey, c_name, c_address, c_nationkey, c_phone, c_acctbal, c_comment], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/13.parquet:.., /testdata/tpch/plan_sf0.02/customer/14.parquet:..], [/testdata/tpch/plan_sf0.02/customer/3.parquet:.., /testdata/tpch/plan_sf0.02/customer/4.parquet:..], [/testdata/tpch/plan_sf0.02/customer/8.parquet:.., /testdata/tpch/plan_sf0.02/customer/9.parquet:..]]}, projection=[c_custkey, c_name, c_address, c_nationkey, c_phone, c_acctbal, c_comment], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -730,10 +730,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/1.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/10.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/15.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/5.parquet:..]]}, projection=[ps_suppkey, ps_availqty, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/10.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/11.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/15.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/16.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/5.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/6.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/7.parquet:..]]}, projection=[ps_suppkey, ps_availqty, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/11.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/12.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/16.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/2.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/3.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/7.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/8.parquet:..]]}, projection=[ps_suppkey, ps_availqty, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/12.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/13.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/3.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/8.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/9.parquet:..]]}, projection=[ps_suppkey, ps_availqty, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/1.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/10.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/15.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/5.parquet:..]]}, projection=[ps_suppkey, ps_availqty, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/10.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/11.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/15.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/16.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/5.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/6.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/7.parquet:..]]}, projection=[ps_suppkey, ps_availqty, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/11.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/12.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/16.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/2.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/3.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/7.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/8.parquet:..]]}, projection=[ps_suppkey, ps_availqty, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/12.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/13.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/3.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/8.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/9.parquet:..]]}, projection=[ps_suppkey, ps_availqty, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -747,10 +747,10 @@ mod tests { ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/1.parquet:.., /testdata/tpch/plan_sf0.02/supplier/10.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/14.parquet:.., /testdata/tpch/plan_sf0.02/supplier/15.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/4.parquet:.., /testdata/tpch/plan_sf0.02/supplier/5.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/10.parquet:.., /testdata/tpch/plan_sf0.02/supplier/11.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/15.parquet:.., /testdata/tpch/plan_sf0.02/supplier/16.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/5.parquet:.., /testdata/tpch/plan_sf0.02/supplier/6.parquet:.., /testdata/tpch/plan_sf0.02/supplier/7.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/11.parquet:.., /testdata/tpch/plan_sf0.02/supplier/12.parquet:.., /testdata/tpch/plan_sf0.02/supplier/13.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/16.parquet:.., /testdata/tpch/plan_sf0.02/supplier/2.parquet:.., /testdata/tpch/plan_sf0.02/supplier/3.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/7.parquet:.., /testdata/tpch/plan_sf0.02/supplier/8.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/13.parquet:.., /testdata/tpch/plan_sf0.02/supplier/14.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/3.parquet:.., /testdata/tpch/plan_sf0.02/supplier/4.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/8.parquet:.., /testdata/tpch/plan_sf0.02/supplier/9.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/1.parquet:.., /testdata/tpch/plan_sf0.02/supplier/10.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/14.parquet:.., /testdata/tpch/plan_sf0.02/supplier/15.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/4.parquet:.., /testdata/tpch/plan_sf0.02/supplier/5.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/10.parquet:.., /testdata/tpch/plan_sf0.02/supplier/11.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/15.parquet:.., /testdata/tpch/plan_sf0.02/supplier/16.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/5.parquet:.., /testdata/tpch/plan_sf0.02/supplier/6.parquet:.., /testdata/tpch/plan_sf0.02/supplier/7.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/11.parquet:.., /testdata/tpch/plan_sf0.02/supplier/12.parquet:.., /testdata/tpch/plan_sf0.02/supplier/13.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/16.parquet:.., /testdata/tpch/plan_sf0.02/supplier/2.parquet:.., /testdata/tpch/plan_sf0.02/supplier/3.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/7.parquet:.., /testdata/tpch/plan_sf0.02/supplier/8.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/13.parquet:.., /testdata/tpch/plan_sf0.02/supplier/14.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/3.parquet:.., /testdata/tpch/plan_sf0.02/supplier/4.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/8.parquet:.., /testdata/tpch/plan_sf0.02/supplier/9.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 7 ── Tasks: t0:[p0..p8] t1:[p0..p8] t2:[p0..p8] t3:[p0..p8] │ RepartitionExec: partitioning=Hash([ps_partkey@0], 9), input_partitions=3 @@ -762,10 +762,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 6] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/1.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/10.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/15.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/5.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/10.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/11.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/15.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/16.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/5.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/6.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/7.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/11.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/12.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/16.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/2.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/3.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/7.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/8.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/12.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/13.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/3.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/8.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/9.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/1.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/10.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/15.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/5.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/10.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/11.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/15.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/16.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/5.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/6.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/7.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/11.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/12.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/16.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/2.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/3.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/7.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/8.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/12.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/13.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/3.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/8.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/9.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty, ps_supplycost], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -779,10 +779,10 @@ mod tests { ┌───── Stage 6 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/1.parquet:.., /testdata/tpch/plan_sf0.02/supplier/10.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/14.parquet:.., /testdata/tpch/plan_sf0.02/supplier/15.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/4.parquet:.., /testdata/tpch/plan_sf0.02/supplier/5.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/10.parquet:.., /testdata/tpch/plan_sf0.02/supplier/11.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/15.parquet:.., /testdata/tpch/plan_sf0.02/supplier/16.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/5.parquet:.., /testdata/tpch/plan_sf0.02/supplier/6.parquet:.., /testdata/tpch/plan_sf0.02/supplier/7.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/11.parquet:.., /testdata/tpch/plan_sf0.02/supplier/12.parquet:.., /testdata/tpch/plan_sf0.02/supplier/13.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/16.parquet:.., /testdata/tpch/plan_sf0.02/supplier/2.parquet:.., /testdata/tpch/plan_sf0.02/supplier/3.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/7.parquet:.., /testdata/tpch/plan_sf0.02/supplier/8.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/13.parquet:.., /testdata/tpch/plan_sf0.02/supplier/14.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/3.parquet:.., /testdata/tpch/plan_sf0.02/supplier/4.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/8.parquet:.., /testdata/tpch/plan_sf0.02/supplier/9.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/1.parquet:.., /testdata/tpch/plan_sf0.02/supplier/10.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/14.parquet:.., /testdata/tpch/plan_sf0.02/supplier/15.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/4.parquet:.., /testdata/tpch/plan_sf0.02/supplier/5.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/10.parquet:.., /testdata/tpch/plan_sf0.02/supplier/11.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/15.parquet:.., /testdata/tpch/plan_sf0.02/supplier/16.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/5.parquet:.., /testdata/tpch/plan_sf0.02/supplier/6.parquet:.., /testdata/tpch/plan_sf0.02/supplier/7.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/11.parquet:.., /testdata/tpch/plan_sf0.02/supplier/12.parquet:.., /testdata/tpch/plan_sf0.02/supplier/13.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/16.parquet:.., /testdata/tpch/plan_sf0.02/supplier/2.parquet:.., /testdata/tpch/plan_sf0.02/supplier/3.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/7.parquet:.., /testdata/tpch/plan_sf0.02/supplier/8.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/13.parquet:.., /testdata/tpch/plan_sf0.02/supplier/14.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/3.parquet:.., /testdata/tpch/plan_sf0.02/supplier/4.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/8.parquet:.., /testdata/tpch/plan_sf0.02/supplier/9.parquet:..]]}, projection=[s_suppkey, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -809,10 +809,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:..], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:..], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:..]]}, projection=[o_orderkey, o_orderpriority], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:..], [/testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:..], [/testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:..]]}, projection=[o_orderkey, o_orderpriority], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:..], [/testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:..], [/testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:..]]}, projection=[o_orderkey, o_orderpriority], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_orderpriority], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:..], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:..], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:..]]}, projection=[o_orderkey, o_orderpriority], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:..], [/testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:..], [/testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:..]]}, projection=[o_orderkey, o_orderpriority], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:..], [/testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:..], [/testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:..]]}, projection=[o_orderkey, o_orderpriority], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_orderpriority], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -845,7 +845,7 @@ mod tests { CoalescePartitionsExec DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/customer/1.parquet, /testdata/tpch/plan_sf0.02/customer/10.parquet, /testdata/tpch/plan_sf0.02/customer/11.parquet, /testdata/tpch/plan_sf0.02/customer/12.parquet, /testdata/tpch/plan_sf0.02/customer/13.parquet, /testdata/tpch/plan_sf0.02/customer/14.parquet], [/testdata/tpch/plan_sf0.02/customer/15.parquet, /testdata/tpch/plan_sf0.02/customer/16.parquet, /testdata/tpch/plan_sf0.02/customer/2.parquet, /testdata/tpch/plan_sf0.02/customer/3.parquet, /testdata/tpch/plan_sf0.02/customer/4.parquet, /testdata/tpch/plan_sf0.02/customer/5.parquet], [/testdata/tpch/plan_sf0.02/customer/6.parquet, /testdata/tpch/plan_sf0.02/customer/7.parquet, /testdata/tpch/plan_sf0.02/customer/8.parquet, /testdata/tpch/plan_sf0.02/customer/9.parquet]]}, projection=[c_custkey], file_type=parquet FilterExec: o_comment@2 NOT LIKE %special%requests%, projection=[o_orderkey@0, o_custkey@1] - DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_custkey, o_comment], file_type=parquet, predicate=o_comment@8 NOT LIKE %special%requests% AND DynamicFilter [ empty ] + DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_custkey, o_comment], file_type=parquet, predicate=o_comment@8 NOT LIKE %special%requests% AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible "); Ok(()) } @@ -867,10 +867,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/part/1.parquet:.., /testdata/tpch/plan_sf0.02/part/10.parquet:..], [/testdata/tpch/plan_sf0.02/part/14.parquet:.., /testdata/tpch/plan_sf0.02/part/15.parquet:..], [/testdata/tpch/plan_sf0.02/part/4.parquet:.., /testdata/tpch/plan_sf0.02/part/5.parquet:..]]}, projection=[p_partkey, p_type], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/part/10.parquet:.., /testdata/tpch/plan_sf0.02/part/11.parquet:..], [/testdata/tpch/plan_sf0.02/part/15.parquet:.., /testdata/tpch/plan_sf0.02/part/16.parquet:.., /testdata/tpch/plan_sf0.02/part/2.parquet:..], [/testdata/tpch/plan_sf0.02/part/5.parquet:.., /testdata/tpch/plan_sf0.02/part/6.parquet:.., /testdata/tpch/plan_sf0.02/part/7.parquet:..]]}, projection=[p_partkey, p_type], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/part/11.parquet:.., /testdata/tpch/plan_sf0.02/part/12.parquet:..], [/testdata/tpch/plan_sf0.02/part/2.parquet:.., /testdata/tpch/plan_sf0.02/part/3.parquet:..], [/testdata/tpch/plan_sf0.02/part/7.parquet:.., /testdata/tpch/plan_sf0.02/part/8.parquet:..]]}, projection=[p_partkey, p_type], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/part/12.parquet:.., /testdata/tpch/plan_sf0.02/part/13.parquet:.., /testdata/tpch/plan_sf0.02/part/14.parquet:..], [/testdata/tpch/plan_sf0.02/part/3.parquet:.., /testdata/tpch/plan_sf0.02/part/4.parquet:..], [/testdata/tpch/plan_sf0.02/part/8.parquet:.., /testdata/tpch/plan_sf0.02/part/9.parquet:..]]}, projection=[p_partkey, p_type], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/part/1.parquet:.., /testdata/tpch/plan_sf0.02/part/10.parquet:..], [/testdata/tpch/plan_sf0.02/part/14.parquet:.., /testdata/tpch/plan_sf0.02/part/15.parquet:..], [/testdata/tpch/plan_sf0.02/part/4.parquet:.., /testdata/tpch/plan_sf0.02/part/5.parquet:..]]}, projection=[p_partkey, p_type], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/part/10.parquet:.., /testdata/tpch/plan_sf0.02/part/11.parquet:..], [/testdata/tpch/plan_sf0.02/part/15.parquet:.., /testdata/tpch/plan_sf0.02/part/16.parquet:.., /testdata/tpch/plan_sf0.02/part/2.parquet:..], [/testdata/tpch/plan_sf0.02/part/5.parquet:.., /testdata/tpch/plan_sf0.02/part/6.parquet:.., /testdata/tpch/plan_sf0.02/part/7.parquet:..]]}, projection=[p_partkey, p_type], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/part/11.parquet:.., /testdata/tpch/plan_sf0.02/part/12.parquet:..], [/testdata/tpch/plan_sf0.02/part/2.parquet:.., /testdata/tpch/plan_sf0.02/part/3.parquet:..], [/testdata/tpch/plan_sf0.02/part/7.parquet:.., /testdata/tpch/plan_sf0.02/part/8.parquet:..]]}, projection=[p_partkey, p_type], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/part/12.parquet:.., /testdata/tpch/plan_sf0.02/part/13.parquet:.., /testdata/tpch/plan_sf0.02/part/14.parquet:..], [/testdata/tpch/plan_sf0.02/part/3.parquet:.., /testdata/tpch/plan_sf0.02/part/4.parquet:..], [/testdata/tpch/plan_sf0.02/part/8.parquet:.., /testdata/tpch/plan_sf0.02/part/9.parquet:..]]}, projection=[p_partkey, p_type], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -940,10 +940,10 @@ mod tests { │ AggregateExec: mode=Partial, gby=[l_suppkey@0 as l_suppkey], aggr=[sum(lineitem.l_extendedprice * 1 - lineitem.l_discount) as sum(lineitem.l_extendedprice * Int64(1) - lineitem.l_discount)] │ FilterExec: l_shipdate@3 >= 1996-01-01 AND l_shipdate@3 < 1996-04-01, projection=[l_suppkey@0, l_extendedprice@1, l_discount@2] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1996-01-01 AND l_shipdate@10 < 1996-04-01 AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1996-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1996-04-01, required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1996-01-01 AND l_shipdate@10 < 1996-04-01 AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1996-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1996-04-01, required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1996-01-01 AND l_shipdate@10 < 1996-04-01 AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1996-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1996-04-01, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1996-01-01 AND l_shipdate@10 < 1996-04-01 AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1996-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1996-04-01, required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1996-01-01 AND l_shipdate@10 < 1996-04-01 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1996-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1996-04-01, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1996-01-01 AND l_shipdate@10 < 1996-04-01 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1996-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1996-04-01, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1996-01-01 AND l_shipdate@10 < 1996-04-01 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1996-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1996-04-01, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_suppkey, l_extendedprice, l_discount, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1996-01-01 AND l_shipdate@10 < 1996-04-01 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1996-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1996-04-01, required_guarantees=[] └────────────────────────────────────────────────── "); Ok(()) @@ -979,10 +979,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 2] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/1.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/10.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/15.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/5.parquet:..]]}, projection=[ps_partkey, ps_suppkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/10.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/11.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/15.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/16.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/5.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/6.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/7.parquet:..]]}, projection=[ps_partkey, ps_suppkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/11.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/12.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/16.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/2.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/3.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/7.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/8.parquet:..]]}, projection=[ps_partkey, ps_suppkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/12.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/13.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/3.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/8.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/9.parquet:..]]}, projection=[ps_partkey, ps_suppkey], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/1.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/10.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/15.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/5.parquet:..]]}, projection=[ps_partkey, ps_suppkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/10.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/11.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/15.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/16.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/5.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/6.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/7.parquet:..]]}, projection=[ps_partkey, ps_suppkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/11.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/12.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/16.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/2.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/3.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/7.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/8.parquet:..]]}, projection=[ps_partkey, ps_suppkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/12.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/13.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/3.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/8.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/9.parquet:..]]}, projection=[ps_partkey, ps_suppkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1027,10 +1027,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1045,10 +1045,10 @@ mod tests { │ RepartitionExec: partitioning=Hash([l_partkey@0], 3), input_partitions=3 │ AggregateExec: mode=Partial, gby=[l_partkey@0 as l_partkey], aggr=[avg(lineitem.l_quantity)] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_partkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_partkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_partkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_partkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_partkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_partkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_partkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_partkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -1077,10 +1077,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_orderkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_orderkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_orderkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_orderkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_orderkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_orderkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_quantity], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1103,10 +1103,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:..], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:..], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:..]]}, projection=[o_orderkey, o_custkey, o_totalprice, o_orderdate], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:..], [/testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:..], [/testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:..]]}, projection=[o_orderkey, o_custkey, o_totalprice, o_orderdate], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:..], [/testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:..], [/testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:..]]}, projection=[o_orderkey, o_custkey, o_totalprice, o_orderdate], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_custkey, o_totalprice, o_orderdate], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:..], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:..], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:..]]}, projection=[o_orderkey, o_custkey, o_totalprice, o_orderdate], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:..], [/testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:..], [/testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:..]]}, projection=[o_orderkey, o_custkey, o_totalprice, o_orderdate], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:..], [/testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:..], [/testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:..]]}, projection=[o_orderkey, o_custkey, o_totalprice, o_orderdate], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/13.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/14.parquet:..], [/testdata/tpch/plan_sf0.02/orders/3.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/4.parquet:..], [/testdata/tpch/plan_sf0.02/orders/8.parquet:.., /testdata/tpch/plan_sf0.02/orders/9.parquet:..]]}, projection=[o_orderkey, o_custkey, o_totalprice, o_orderdate], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1137,10 +1137,10 @@ mod tests { │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ FilterExec: (l_shipmode@5 = AIR OR l_shipmode@5 = AIR REG) AND l_shipinstruct@4 = DELIVER IN PERSON AND (l_quantity@1 >= 1.00 AND l_quantity@1 <= 11.00 OR l_quantity@1 >= 10.00 AND l_quantity@1 <= 20.00 OR l_quantity@1 >= 20.00 AND l_quantity@1 <= 30.00), projection=[l_partkey@0, l_quantity@1, l_extendedprice@2, l_discount@3] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice, l_discount, l_shipinstruct, l_shipmode], file_type=parquet, predicate=(l_shipmode@14 = AIR OR l_shipmode@14 = AIR REG) AND l_shipinstruct@13 = DELIVER IN PERSON AND (l_quantity@4 >= 1.00 AND l_quantity@4 <= 11.00 OR l_quantity@4 >= 10.00 AND l_quantity@4 <= 20.00 OR l_quantity@4 >= 20.00 AND l_quantity@4 <= 30.00) AND DynamicFilter [ empty ], pruning_predicate=(l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR AND AIR <= l_shipmode_max@1 OR l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR REG AND AIR REG <= l_shipmode_max@1) AND l_shipinstruct_null_count@6 != row_count@3 AND l_shipinstruct_min@4 <= DELIVER IN PERSON AND DELIVER IN PERSON <= l_shipinstruct_max@5 AND (l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 1.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 11.00 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 10.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 20.00 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 20.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 30.00), required_guarantees=[l_shipinstruct in (DELIVER IN PERSON), l_shipmode in (AIR, AIR REG)] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice, l_discount, l_shipinstruct, l_shipmode], file_type=parquet, predicate=(l_shipmode@14 = AIR OR l_shipmode@14 = AIR REG) AND l_shipinstruct@13 = DELIVER IN PERSON AND (l_quantity@4 >= 1.00 AND l_quantity@4 <= 11.00 OR l_quantity@4 >= 10.00 AND l_quantity@4 <= 20.00 OR l_quantity@4 >= 20.00 AND l_quantity@4 <= 30.00) AND DynamicFilter [ empty ], pruning_predicate=(l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR AND AIR <= l_shipmode_max@1 OR l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR REG AND AIR REG <= l_shipmode_max@1) AND l_shipinstruct_null_count@6 != row_count@3 AND l_shipinstruct_min@4 <= DELIVER IN PERSON AND DELIVER IN PERSON <= l_shipinstruct_max@5 AND (l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 1.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 11.00 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 10.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 20.00 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 20.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 30.00), required_guarantees=[l_shipinstruct in (DELIVER IN PERSON), l_shipmode in (AIR, AIR REG)] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice, l_discount, l_shipinstruct, l_shipmode], file_type=parquet, predicate=(l_shipmode@14 = AIR OR l_shipmode@14 = AIR REG) AND l_shipinstruct@13 = DELIVER IN PERSON AND (l_quantity@4 >= 1.00 AND l_quantity@4 <= 11.00 OR l_quantity@4 >= 10.00 AND l_quantity@4 <= 20.00 OR l_quantity@4 >= 20.00 AND l_quantity@4 <= 30.00) AND DynamicFilter [ empty ], pruning_predicate=(l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR AND AIR <= l_shipmode_max@1 OR l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR REG AND AIR REG <= l_shipmode_max@1) AND l_shipinstruct_null_count@6 != row_count@3 AND l_shipinstruct_min@4 <= DELIVER IN PERSON AND DELIVER IN PERSON <= l_shipinstruct_max@5 AND (l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 1.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 11.00 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 10.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 20.00 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 20.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 30.00), required_guarantees=[l_shipinstruct in (DELIVER IN PERSON), l_shipmode in (AIR, AIR REG)] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice, l_discount, l_shipinstruct, l_shipmode], file_type=parquet, predicate=(l_shipmode@14 = AIR OR l_shipmode@14 = AIR REG) AND l_shipinstruct@13 = DELIVER IN PERSON AND (l_quantity@4 >= 1.00 AND l_quantity@4 <= 11.00 OR l_quantity@4 >= 10.00 AND l_quantity@4 <= 20.00 OR l_quantity@4 >= 20.00 AND l_quantity@4 <= 30.00) AND DynamicFilter [ empty ], pruning_predicate=(l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR AND AIR <= l_shipmode_max@1 OR l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR REG AND AIR REG <= l_shipmode_max@1) AND l_shipinstruct_null_count@6 != row_count@3 AND l_shipinstruct_min@4 <= DELIVER IN PERSON AND DELIVER IN PERSON <= l_shipinstruct_max@5 AND (l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 1.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 11.00 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 10.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 20.00 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 20.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 30.00), required_guarantees=[l_shipinstruct in (DELIVER IN PERSON), l_shipmode in (AIR, AIR REG)] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice, l_discount, l_shipinstruct, l_shipmode], file_type=parquet, predicate=(l_shipmode@14 = AIR OR l_shipmode@14 = AIR REG) AND l_shipinstruct@13 = DELIVER IN PERSON AND (l_quantity@4 >= 1.00 AND l_quantity@4 <= 11.00 OR l_quantity@4 >= 10.00 AND l_quantity@4 <= 20.00 OR l_quantity@4 >= 20.00 AND l_quantity@4 <= 30.00) AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=(l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR AND AIR <= l_shipmode_max@1 OR l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR REG AND AIR REG <= l_shipmode_max@1) AND l_shipinstruct_null_count@6 != row_count@3 AND l_shipinstruct_min@4 <= DELIVER IN PERSON AND DELIVER IN PERSON <= l_shipinstruct_max@5 AND (l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 1.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 11.00 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 10.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 20.00 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 20.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 30.00), required_guarantees=[l_shipinstruct in (DELIVER IN PERSON), l_shipmode in (AIR, AIR REG)] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice, l_discount, l_shipinstruct, l_shipmode], file_type=parquet, predicate=(l_shipmode@14 = AIR OR l_shipmode@14 = AIR REG) AND l_shipinstruct@13 = DELIVER IN PERSON AND (l_quantity@4 >= 1.00 AND l_quantity@4 <= 11.00 OR l_quantity@4 >= 10.00 AND l_quantity@4 <= 20.00 OR l_quantity@4 >= 20.00 AND l_quantity@4 <= 30.00) AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=(l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR AND AIR <= l_shipmode_max@1 OR l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR REG AND AIR REG <= l_shipmode_max@1) AND l_shipinstruct_null_count@6 != row_count@3 AND l_shipinstruct_min@4 <= DELIVER IN PERSON AND DELIVER IN PERSON <= l_shipinstruct_max@5 AND (l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 1.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 11.00 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 10.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 20.00 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 20.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 30.00), required_guarantees=[l_shipinstruct in (DELIVER IN PERSON), l_shipmode in (AIR, AIR REG)] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice, l_discount, l_shipinstruct, l_shipmode], file_type=parquet, predicate=(l_shipmode@14 = AIR OR l_shipmode@14 = AIR REG) AND l_shipinstruct@13 = DELIVER IN PERSON AND (l_quantity@4 >= 1.00 AND l_quantity@4 <= 11.00 OR l_quantity@4 >= 10.00 AND l_quantity@4 <= 20.00 OR l_quantity@4 >= 20.00 AND l_quantity@4 <= 30.00) AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=(l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR AND AIR <= l_shipmode_max@1 OR l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR REG AND AIR REG <= l_shipmode_max@1) AND l_shipinstruct_null_count@6 != row_count@3 AND l_shipinstruct_min@4 <= DELIVER IN PERSON AND DELIVER IN PERSON <= l_shipinstruct_max@5 AND (l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 1.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 11.00 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 10.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 20.00 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 20.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 30.00), required_guarantees=[l_shipinstruct in (DELIVER IN PERSON), l_shipmode in (AIR, AIR REG)] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_partkey, l_quantity, l_extendedprice, l_discount, l_shipinstruct, l_shipmode], file_type=parquet, predicate=(l_shipmode@14 = AIR OR l_shipmode@14 = AIR REG) AND l_shipinstruct@13 = DELIVER IN PERSON AND (l_quantity@4 >= 1.00 AND l_quantity@4 <= 11.00 OR l_quantity@4 >= 10.00 AND l_quantity@4 <= 20.00 OR l_quantity@4 >= 20.00 AND l_quantity@4 <= 30.00) AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=(l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR AND AIR <= l_shipmode_max@1 OR l_shipmode_null_count@2 != row_count@3 AND l_shipmode_min@0 <= AIR REG AND AIR REG <= l_shipmode_max@1) AND l_shipinstruct_null_count@6 != row_count@3 AND l_shipinstruct_min@4 <= DELIVER IN PERSON AND DELIVER IN PERSON <= l_shipinstruct_max@5 AND (l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 1.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 11.00 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 10.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 20.00 OR l_quantity_null_count@8 != row_count@3 AND l_quantity_max@7 >= 20.00 AND l_quantity_null_count@8 != row_count@3 AND l_quantity_min@9 <= 30.00), required_guarantees=[l_shipinstruct in (DELIVER IN PERSON), l_shipmode in (AIR, AIR REG)] └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1177,10 +1177,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 1] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/1.parquet:.., /testdata/tpch/plan_sf0.02/supplier/10.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/14.parquet:.., /testdata/tpch/plan_sf0.02/supplier/15.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/4.parquet:.., /testdata/tpch/plan_sf0.02/supplier/5.parquet:..]]}, projection=[s_suppkey, s_name, s_address, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/10.parquet:.., /testdata/tpch/plan_sf0.02/supplier/11.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/15.parquet:.., /testdata/tpch/plan_sf0.02/supplier/16.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/5.parquet:.., /testdata/tpch/plan_sf0.02/supplier/6.parquet:.., /testdata/tpch/plan_sf0.02/supplier/7.parquet:..]]}, projection=[s_suppkey, s_name, s_address, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/11.parquet:.., /testdata/tpch/plan_sf0.02/supplier/12.parquet:.., /testdata/tpch/plan_sf0.02/supplier/13.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/16.parquet:.., /testdata/tpch/plan_sf0.02/supplier/2.parquet:.., /testdata/tpch/plan_sf0.02/supplier/3.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/7.parquet:.., /testdata/tpch/plan_sf0.02/supplier/8.parquet:..]]}, projection=[s_suppkey, s_name, s_address, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/13.parquet:.., /testdata/tpch/plan_sf0.02/supplier/14.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/3.parquet:.., /testdata/tpch/plan_sf0.02/supplier/4.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/8.parquet:.., /testdata/tpch/plan_sf0.02/supplier/9.parquet:..]]}, projection=[s_suppkey, s_name, s_address, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/1.parquet:.., /testdata/tpch/plan_sf0.02/supplier/10.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/14.parquet:.., /testdata/tpch/plan_sf0.02/supplier/15.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/4.parquet:.., /testdata/tpch/plan_sf0.02/supplier/5.parquet:..]]}, projection=[s_suppkey, s_name, s_address, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/10.parquet:.., /testdata/tpch/plan_sf0.02/supplier/11.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/15.parquet:.., /testdata/tpch/plan_sf0.02/supplier/16.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/5.parquet:.., /testdata/tpch/plan_sf0.02/supplier/6.parquet:.., /testdata/tpch/plan_sf0.02/supplier/7.parquet:..]]}, projection=[s_suppkey, s_name, s_address, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/11.parquet:.., /testdata/tpch/plan_sf0.02/supplier/12.parquet:.., /testdata/tpch/plan_sf0.02/supplier/13.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/16.parquet:.., /testdata/tpch/plan_sf0.02/supplier/2.parquet:.., /testdata/tpch/plan_sf0.02/supplier/3.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/7.parquet:.., /testdata/tpch/plan_sf0.02/supplier/8.parquet:..]]}, projection=[s_suppkey, s_name, s_address, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/13.parquet:.., /testdata/tpch/plan_sf0.02/supplier/14.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/3.parquet:.., /testdata/tpch/plan_sf0.02/supplier/4.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/8.parquet:.., /testdata/tpch/plan_sf0.02/supplier/9.parquet:..]]}, projection=[s_suppkey, s_name, s_address, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 1 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1196,10 +1196,10 @@ mod tests { │ CoalescePartitionsExec │ [Stage 3] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/1.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/10.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/15.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/5.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/10.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/11.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/15.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/16.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/5.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/6.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/7.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/11.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/12.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/16.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/2.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/3.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/7.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/8.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/12.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/13.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/3.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/8.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/9.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/1.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/10.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/15.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/5.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/10.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/11.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/15.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/16.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/5.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/6.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/7.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/11.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/12.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/16.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/2.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/3.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/7.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/8.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/partsupp/12.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/13.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/14.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/3.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/4.parquet:..], [/testdata/tpch/plan_sf0.02/partsupp/8.parquet:.., /testdata/tpch/plan_sf0.02/partsupp/9.parquet:..]]}, projection=[ps_partkey, ps_suppkey, ps_availqty], file_type=parquet, predicate=DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 3 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1215,10 +1215,10 @@ mod tests { │ AggregateExec: mode=Partial, gby=[l_partkey@0 as l_partkey, l_suppkey@1 as l_suppkey], aggr=[sum(lineitem.l_quantity)] │ FilterExec: l_shipdate@3 >= 1994-01-01 AND l_shipdate@3 < 1995-01-01, projection=[l_partkey@0, l_suppkey@1, l_quantity@2] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_partkey, l_suppkey, l_quantity, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1994-01-01 AND l_shipdate@10 < 1995-01-01 AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1994-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1995-01-01, required_guarantees=[] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_partkey, l_suppkey, l_quantity, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1994-01-01 AND l_shipdate@10 < 1995-01-01 AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1994-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1995-01-01, required_guarantees=[] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_partkey, l_suppkey, l_quantity, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1994-01-01 AND l_shipdate@10 < 1995-01-01 AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1994-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1995-01-01, required_guarantees=[] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_partkey, l_suppkey, l_quantity, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1994-01-01 AND l_shipdate@10 < 1995-01-01 AND DynamicFilter [ empty ], pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1994-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1995-01-01, required_guarantees=[] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_partkey, l_suppkey, l_quantity, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1994-01-01 AND l_shipdate@10 < 1995-01-01 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1994-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1995-01-01, required_guarantees=[] + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_partkey, l_suppkey, l_quantity, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1994-01-01 AND l_shipdate@10 < 1995-01-01 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1994-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1995-01-01, required_guarantees=[] + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_partkey, l_suppkey, l_quantity, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1994-01-01 AND l_shipdate@10 < 1995-01-01 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1994-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1995-01-01, required_guarantees=[] + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_partkey, l_suppkey, l_quantity, l_shipdate], file_type=parquet, predicate=l_shipdate@10 >= 1994-01-01 AND l_shipdate@10 < 1995-01-01 AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible, pruning_predicate=l_shipdate_null_count@1 != row_count@2 AND l_shipdate_max@0 >= 1994-01-01 AND l_shipdate_null_count@1 != row_count@2 AND l_shipdate_min@3 < 1995-01-01, required_guarantees=[] └────────────────────────────────────────────────── "); Ok(()) @@ -1260,7 +1260,7 @@ mod tests { │ CoalescePartitionsExec │ [Stage 5] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., ...], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., ...], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., ...]]}, projection=[l_orderkey, l_suppkey], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., ...], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., ...], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., ...]]}, projection=[l_orderkey, l_suppkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 5 ── Tasks: t0:[p0..p2] t1:[p3..p5] t2:[p6..p8] t3:[p9..p11] │ HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(n_nationkey@0, s_nationkey@1)], projection=[s_name@1, l_orderkey@3, l_suppkey@4] @@ -1274,10 +1274,10 @@ mod tests { │ [Stage 4] => NetworkBroadcastExec: partitions_per_consumer=3, stage_partitions=12, input_tasks=4 │ FilterExec: l_receiptdate@3 > l_commitdate@2, projection=[l_orderkey@0, l_suppkey@1] │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_commitdate, l_receiptdate], file_type=parquet, predicate=l_receiptdate@12 > l_commitdate@11 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_commitdate, l_receiptdate], file_type=parquet, predicate=l_receiptdate@12 > l_commitdate@11 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_commitdate, l_receiptdate], file_type=parquet, predicate=l_receiptdate@12 > l_commitdate@11 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_commitdate, l_receiptdate], file_type=parquet, predicate=l_receiptdate@12 > l_commitdate@11 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/1.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/10.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/15.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/5.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_commitdate, l_receiptdate], file_type=parquet, predicate=l_receiptdate@12 > l_commitdate@11 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/10.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/11.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/15.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/16.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/5.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/6.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/7.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_commitdate, l_receiptdate], file_type=parquet, predicate=l_receiptdate@12 > l_commitdate@11 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/11.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/12.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/13.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/16.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/2.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/3.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/7.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/8.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_commitdate, l_receiptdate], file_type=parquet, predicate=l_receiptdate@12 > l_commitdate@11 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/lineitem/13.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/14.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/3.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/4.parquet:..], [/testdata/tpch/plan_sf0.02/lineitem/8.parquet:.., /testdata/tpch/plan_sf0.02/lineitem/9.parquet:..]]}, projection=[l_orderkey, l_suppkey, l_commitdate, l_receiptdate], file_type=parquet, predicate=l_receiptdate@12 > l_commitdate@11 AND DynamicFilter [ empty ] AND DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── ┌───── Stage 2 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 @@ -1300,10 +1300,10 @@ mod tests { ┌───── Stage 4 ── Tasks: t0:[p0..p11] t1:[p12..p23] t2:[p24..p35] t3:[p36..p47] │ BroadcastExec: input_partitions=3, consumer_tasks=4, output_partitions=12 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/1.parquet:.., /testdata/tpch/plan_sf0.02/supplier/10.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/14.parquet:.., /testdata/tpch/plan_sf0.02/supplier/15.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/4.parquet:.., /testdata/tpch/plan_sf0.02/supplier/5.parquet:..]]}, projection=[s_suppkey, s_name, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/10.parquet:.., /testdata/tpch/plan_sf0.02/supplier/11.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/15.parquet:.., /testdata/tpch/plan_sf0.02/supplier/16.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/5.parquet:.., /testdata/tpch/plan_sf0.02/supplier/6.parquet:.., /testdata/tpch/plan_sf0.02/supplier/7.parquet:..]]}, projection=[s_suppkey, s_name, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/11.parquet:.., /testdata/tpch/plan_sf0.02/supplier/12.parquet:.., /testdata/tpch/plan_sf0.02/supplier/13.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/16.parquet:.., /testdata/tpch/plan_sf0.02/supplier/2.parquet:.., /testdata/tpch/plan_sf0.02/supplier/3.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/7.parquet:.., /testdata/tpch/plan_sf0.02/supplier/8.parquet:..]]}, projection=[s_suppkey, s_name, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] - │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/13.parquet:.., /testdata/tpch/plan_sf0.02/supplier/14.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/3.parquet:.., /testdata/tpch/plan_sf0.02/supplier/4.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/8.parquet:.., /testdata/tpch/plan_sf0.02/supplier/9.parquet:..]]}, projection=[s_suppkey, s_name, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/1.parquet:.., /testdata/tpch/plan_sf0.02/supplier/10.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/14.parquet:.., /testdata/tpch/plan_sf0.02/supplier/15.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/4.parquet:.., /testdata/tpch/plan_sf0.02/supplier/5.parquet:..]]}, projection=[s_suppkey, s_name, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t1: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/10.parquet:.., /testdata/tpch/plan_sf0.02/supplier/11.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/15.parquet:.., /testdata/tpch/plan_sf0.02/supplier/16.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/5.parquet:.., /testdata/tpch/plan_sf0.02/supplier/6.parquet:.., /testdata/tpch/plan_sf0.02/supplier/7.parquet:..]]}, projection=[s_suppkey, s_name, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t2: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/11.parquet:.., /testdata/tpch/plan_sf0.02/supplier/12.parquet:.., /testdata/tpch/plan_sf0.02/supplier/13.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/16.parquet:.., /testdata/tpch/plan_sf0.02/supplier/2.parquet:.., /testdata/tpch/plan_sf0.02/supplier/3.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/7.parquet:.., /testdata/tpch/plan_sf0.02/supplier/8.parquet:..]]}, projection=[s_suppkey, s_name, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible + │ t3: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/supplier/13.parquet:.., /testdata/tpch/plan_sf0.02/supplier/14.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/3.parquet:.., /testdata/tpch/plan_sf0.02/supplier/4.parquet:..], [/testdata/tpch/plan_sf0.02/supplier/8.parquet:.., /testdata/tpch/plan_sf0.02/supplier/9.parquet:..]]}, projection=[s_suppkey, s_name, s_nationkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible └────────────────────────────────────────────────── "); Ok(()) @@ -1331,7 +1331,7 @@ mod tests { │ CoalescePartitionsExec │ [Stage 1] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 │ DistributedLeafExec: - │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:.., ...], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:.., ...], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:.., ...]]}, projection=[o_custkey], file_type=parquet, predicate=DynamicFilter [ empty ] + │ t0: DataSourceExec: file_groups={3 groups: [[/testdata/tpch/plan_sf0.02/orders/1.parquet:.., /testdata/tpch/plan_sf0.02/orders/10.parquet:.., /testdata/tpch/plan_sf0.02/orders/11.parquet:.., /testdata/tpch/plan_sf0.02/orders/12.parquet:.., /testdata/tpch/plan_sf0.02/orders/13.parquet:.., ...], [/testdata/tpch/plan_sf0.02/orders/14.parquet:.., /testdata/tpch/plan_sf0.02/orders/15.parquet:.., /testdata/tpch/plan_sf0.02/orders/16.parquet:.., /testdata/tpch/plan_sf0.02/orders/2.parquet:.., /testdata/tpch/plan_sf0.02/orders/3.parquet:.., ...], [/testdata/tpch/plan_sf0.02/orders/4.parquet:.., /testdata/tpch/plan_sf0.02/orders/5.parquet:.., /testdata/tpch/plan_sf0.02/orders/6.parquet:.., /testdata/tpch/plan_sf0.02/orders/7.parquet:.., /testdata/tpch/plan_sf0.02/orders/8.parquet:.., ...]]}, projection=[o_custkey], file_type=parquet, predicate=DynamicFilter [ empty ], dynamic_rg_pruning=eligible │ AggregateExec: mode=Final, gby=[], aggr=[avg(customer.c_acctbal)] │ CoalescePartitionsExec │ [Stage 2] => NetworkCoalesceExec: output_partitions=12, input_tasks=4 @@ -1398,14 +1398,7 @@ mod tests { df.create_physical_plan().await? }; - Ok(normalize_plan_display(display_plan_ascii( - plan.as_ref(), - false, - ))) - } - - fn normalize_plan_display(display: String) -> String { - display.replace(", dynamic_rg_pruning=eligible", "") + Ok(display_plan_ascii(plan.as_ref(), false)) } // OnceCell to ensure TPCH tables are generated only once for tests From 099f264118c3835a64a92759a5acd748adcccb0b Mon Sep 17 00:00:00 2001 From: Jayant Shrivastava Date: Thu, 2 Jul 2026 19:35:43 +0000 Subject: [PATCH 11/12] commentary --- src/distributed_planner/inject_network_boundaries.rs | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/distributed_planner/inject_network_boundaries.rs b/src/distributed_planner/inject_network_boundaries.rs index 22e4f6df..bc7b9ba8 100644 --- a/src/distributed_planner/inject_network_boundaries.rs +++ b/src/distributed_planner/inject_network_boundaries.rs @@ -218,6 +218,7 @@ fn plan_ptr_key(plan: &Arc) -> usize { Arc::as_ptr(plan) as *const () as usize } +/// Returns true if this join cannot be distributed. fn collect_left_hash_join_requires_single_task( plan: &dyn ExecutionPlan, processed_children: &[Arc], @@ -233,6 +234,9 @@ fn collect_left_hash_join_requires_single_task( return true; } + // We expect the distributed query planner to have inserted + // BroadCastExec if this join is safe to distribute. Not all + // collect left hash joins are broadcastable. !processed_children .first() .is_some_and(|child| build_input_is_broadcast(child.as_ref())) @@ -300,9 +304,7 @@ async fn _inject_network_boundaries( &processed_children, broadcast_joins_enabled, ) { - // Only distribute CollectLeft HashJoins when the build side was actually broadcast. - // Enabling broadcast joins is not enough by itself: join types that cannot safely - // broadcast their build side, such as LeftSemi, must keep running in one task. + // Only distribute CollectLeft HashJoins when safe. task_count = Maximum(1); } else { // The task count for this plan is decided by the biggest task count from the children; unless From b95034acc1c0144f1f8ac20a12cc4d403d74cb09 Mon Sep 17 00:00:00 2001 From: Jayant Shrivastava Date: Thu, 2 Jul 2026 19:39:42 +0000 Subject: [PATCH 12/12] Fix stage statistics clippy warning --- src/stage.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/stage.rs b/src/stage.rs index 3ac39e7a..fa12e479 100644 --- a/src/stage.rs +++ b/src/stage.rs @@ -8,7 +8,7 @@ use datafusion::execution::{SendableRecordBatchStream, TaskContext}; use datafusion::physical_plan::display::DisplayableExecutionPlan; use datafusion::physical_plan::metrics::{Label, Metric, MetricsSet}; use datafusion::physical_plan::{ - ColumnStatistics, ExecutionPlan, ExecutionPlanProperties, displayable, + ColumnStatistics, ExecutionPlan, ExecutionPlanProperties, StatisticsArgs, displayable, }; use itertools::Either; use std::collections::VecDeque; @@ -158,7 +158,9 @@ impl Stage { schema: SchemaRef, ) -> Result> { match self { - Stage::Local(local) => local.plan.partition_statistics(partition), + Stage::Local(local) => local + .plan + .statistics_with_args(&StatisticsArgs::new().with_partition(partition)), Stage::Remote(remote) => { let Some(runtime_stats) = &remote.runtime_stats else { return Ok(Arc::new(Statistics::new_unknown(&schema)));