=== Stage 1 ===
SortShuffleWriterExec: partitioning=Hash([n_nationkey@0], 16)
  FilterExec: n_name@1 = CANADA, projection=[n_nationkey@0]
    StatsExec: rows=25

=== Stage 2 ===
ShuffleWriterExec: partitioning: None
  UnresolvedShuffleExec: stage=1, partitioning: Hash([n_nationkey@0], 16)

=== Stage 3 ===
SortShuffleWriterExec: partitioning=Hash([s_nationkey@3], 16)
  StatsExec: rows=1000000

=== Stage 4 ===
SortShuffleWriterExec: partitioning=Hash([s_suppkey@0], 16)
  ProjectionExec: expr=[s_suppkey@0 as s_suppkey, s_name@1 as s_name, s_address@2 as s_address]
    ProjectionExec: expr=[s_suppkey@1 as s_suppkey, s_name@2 as s_name, s_address@3 as s_address, s_nationkey@4 as s_nationkey, n_nationkey@0 as n_nationkey]
      HashJoinExec: mode=CollectLeft, join_type=Inner, on=[(n_nationkey@0, s_nationkey@3)]
        UnresolvedShuffleExec: stage=2, broadcast=true, upstream_partitions: 16
        UnresolvedShuffleExec: stage=3, partitioning: Hash([s_nationkey@3], 16)

=== Stage 5 ===
SortShuffleWriterExec: partitioning=Hash([ps_partkey@0], 16)
  StatsExec: rows=80000000

=== Stage 6 ===
SortShuffleWriterExec: partitioning=Hash([p_partkey@0], 16)
  FilterExec: p_name@1 LIKE forest%, projection=[p_partkey@0]
    StatsExec: rows=20000000

=== Stage 7 ===
SortShuffleWriterExec: partitioning=Hash([ps_partkey@0, ps_suppkey@1], 16)
  SortMergeJoinExec: join_type=LeftSemi, on=[(ps_partkey@0, p_partkey@0)]
    SortExec: expr=[ps_partkey@0 ASC], preserve_partitioning=[true]
      UnresolvedShuffleExec: stage=5, partitioning: Hash([ps_partkey@0], 16)
    SortExec: expr=[p_partkey@0 ASC], preserve_partitioning=[true]
      UnresolvedShuffleExec: stage=6, partitioning: Hash([p_partkey@0], 16)

=== Stage 8 ===
SortShuffleWriterExec: partitioning=Hash([l_partkey@0, l_suppkey@1], 16)
  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]
      StatsExec: rows=600037902

=== Stage 9 ===
SortShuffleWriterExec: partitioning=Hash([ps_suppkey@0], 16)
  ProjectionExec: expr=[ps_suppkey@1 as ps_suppkey]
    SortMergeJoinExec: 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
      SortExec: expr=[ps_partkey@0 ASC, ps_suppkey@1 ASC], preserve_partitioning=[true]
        UnresolvedShuffleExec: stage=7, partitioning: Hash([ps_partkey@0, ps_suppkey@1], 16)
      SortExec: expr=[l_partkey@1 ASC, l_suppkey@2 ASC], preserve_partitioning=[true]
        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)]
            UnresolvedShuffleExec: stage=8, partitioning: Hash([l_partkey@0, l_suppkey@1], 16)

=== Stage 10 ===
ShuffleWriterExec: partitioning: None
  SortExec: expr=[s_name@0 ASC NULLS LAST], preserve_partitioning=[true]
    ProjectionExec: expr=[s_name@1 as s_name, s_address@2 as s_address]
      SortMergeJoinExec: join_type=LeftSemi, on=[(s_suppkey@0, ps_suppkey@0)]
        SortExec: expr=[s_suppkey@0 ASC], preserve_partitioning=[true]
          UnresolvedShuffleExec: stage=4, partitioning: Hash([s_suppkey@0], 16)
        SortExec: expr=[ps_suppkey@0 ASC], preserve_partitioning=[true]
          UnresolvedShuffleExec: stage=9, partitioning: Hash([ps_suppkey@0], 16)

=== Stage 11 ===
ShuffleWriterExec: partitioning: None
  SortPreservingMergeExec: [s_name@0 ASC NULLS LAST]
    UnresolvedShuffleExec: stage=10, partitioning: Hash([s_suppkey@0], 16)
