You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@impala.apache.org by ta...@apache.org on 2019/09/20 22:31:32 UTC

[impala] branch master updated: IMPALA-2138: part 1: initial cleanup

This is an automated email from the ASF dual-hosted git repository.

tarmstrong pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/impala.git


The following commit(s) were added to refs/heads/master by this push:
     new 983e3a6  IMPALA-2138: part 1: initial cleanup
983e3a6 is described below

commit 983e3a66deef5bce52e9ebe74db8e2f86233d036
Author: Tim Armstrong <ta...@cloudera.com>
AuthorDate: Thu Sep 19 10:31:36 2019 -0700

    IMPALA-2138: part 1: initial cleanup
    
    This is a mixed bag of simplifications, debugging improvements
    and test fixes that came up in the projection work.
    
    I had to update some planner tests because some expressions
    now include their arguments. Various things in the planner
    tests were stale, so there are spurious changes in the
    expected output that are ignored by the plan verification.
    
    Change-Id: I75d2c8cab79988300c1a9c6c23d6ccea53da7d23
    Reviewed-on: http://gerrit.cloudera.org:8080/14265
    Reviewed-by: Impala Public Jenkins <im...@cloudera.com>
    Tested-by: Impala Public Jenkins <im...@cloudera.com>
---
 be/src/exprs/slot-ref.cc                           |  10 +-
 .../java/org/apache/impala/analysis/CaseExpr.java  |  11 +
 .../java/org/apache/impala/analysis/SortInfo.java  |   3 +-
 .../impala/analysis/TupleIsNullPredicate.java      |   8 +-
 .../apache/impala/analysis/ValidTupleIdExpr.java   |   3 +-
 .../org/apache/impala/catalog/ColumnStats.java     |   2 +-
 fe/src/main/java/org/apache/impala/common/Id.java  |   7 +-
 .../org/apache/impala/planner/DataPartition.java   |   3 +-
 .../apache/impala/planner/DistributedPlanner.java  |   4 +-
 .../org/apache/impala/planner/ExchangeNode.java    |  36 +--
 .../queries/PlannerTest/analytic-fns.test          | 204 ++++++------
 .../queries/PlannerTest/card-agg.test              |  36 +--
 .../queries/PlannerTest/joins.test                 |   4 +-
 .../PlannerTest/multiple-distinct-limit.test       |  28 +-
 .../multiple-distinct-materialization.test         | 212 ++++++-------
 .../PlannerTest/multiple-distinct-predicates.test  | 152 ++++-----
 .../queries/PlannerTest/multiple-distinct.test     | 352 ++++++++++-----------
 .../PlannerTest/runtime-filter-propagation.test    | 290 ++++++++---------
 .../queries/QueryTest/nested-types-runtime.test    |   2 +-
 19 files changed, 680 insertions(+), 687 deletions(-)

diff --git a/be/src/exprs/slot-ref.cc b/be/src/exprs/slot-ref.cc
index 816e0bc..b5f758f 100644
--- a/be/src/exprs/slot-ref.cc
+++ b/be/src/exprs/slot-ref.cc
@@ -88,12 +88,10 @@ Status SlotRef::Init(
     if (tuple_idx_ == RowDescriptor::INVALID_IDX) {
       TupleDescriptor* d =
           state->desc_tbl().GetTupleDescriptor(slot_desc->parent()->id());
-      LOG(INFO) << "invalid idx: " << slot_desc->DebugString()
-                << "\nparent=" << d->DebugString()
-                << "\nrow=" << row_desc.DebugString();
-      stringstream error;
-      error << "invalid tuple_idx";
-      return Status(error.str());
+      string error = Substitute("invalid tuple_idx: $0\nparent=$1\nrow=$2",
+          slot_desc->DebugString(), d->DebugString(), row_desc.DebugString());
+      LOG(INFO) << error;
+      return Status(error);
     }
     DCHECK(tuple_idx_ != RowDescriptor::INVALID_IDX);
     tuple_is_nullable_ = row_desc.TupleIsNullable(tuple_idx_);
diff --git a/fe/src/main/java/org/apache/impala/analysis/CaseExpr.java b/fe/src/main/java/org/apache/impala/analysis/CaseExpr.java
index 70c5109..7f74955 100644
--- a/fe/src/main/java/org/apache/impala/analysis/CaseExpr.java
+++ b/fe/src/main/java/org/apache/impala/analysis/CaseExpr.java
@@ -31,6 +31,7 @@ import org.apache.impala.thrift.TCaseExpr;
 import org.apache.impala.thrift.TExprNode;
 import org.apache.impala.thrift.TExprNodeType;
 import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Objects;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
@@ -443,5 +444,15 @@ public class CaseExpr extends Expr {
   public boolean hasElseExpr() { return hasElseExpr_; }
 
   @Override
+  public String debugString() {
+    return Objects.toStringHelper(this)
+        .add("decodeExpr_", decodeExpr_ == null ? "null" : decodeExpr_.debugString())
+        .add("hasCaseExpr", hasCaseExpr_)
+        .add("hasElseExpr", hasElseExpr_)
+        .addValue(super.debugString())
+        .toString();
+  }
+
+  @Override
   public Expr clone() { return new CaseExpr(this); }
 }
diff --git a/fe/src/main/java/org/apache/impala/analysis/SortInfo.java b/fe/src/main/java/org/apache/impala/analysis/SortInfo.java
index 1def7e0..abe6bff 100644
--- a/fe/src/main/java/org/apache/impala/analysis/SortInfo.java
+++ b/fe/src/main/java/org/apache/impala/analysis/SortInfo.java
@@ -51,7 +51,8 @@ public class SortInfo {
   private final List<Boolean> isAscOrder_;
   // True if "NULLS FIRST", false if "NULLS LAST", null if not specified.
   private final List<Boolean> nullsFirstParams_;
-  // Descriptor of tuples materialized, sorted, and output by a SortNode/TopNNode.
+  // The single tuple that is materialized, sorted, and output by a sort operator
+  // (i.e. SortNode or TopNNode)
   private TupleDescriptor sortTupleDesc_;
   // List of exprs evaluated against the sort input and materialized into the sort tuple.
   // One expr per slot in 'sortTupleDesc_'.
diff --git a/fe/src/main/java/org/apache/impala/analysis/TupleIsNullPredicate.java b/fe/src/main/java/org/apache/impala/analysis/TupleIsNullPredicate.java
index 1562a15..ec64faa 100644
--- a/fe/src/main/java/org/apache/impala/analysis/TupleIsNullPredicate.java
+++ b/fe/src/main/java/org/apache/impala/analysis/TupleIsNullPredicate.java
@@ -18,6 +18,7 @@
 package org.apache.impala.analysis;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 import java.util.Set;
 
@@ -27,6 +28,7 @@ import org.apache.impala.thrift.TExprNode;
 import org.apache.impala.thrift.TExprNodeType;
 import org.apache.impala.thrift.TTupleIsNullPredicate;
 
+import com.google.common.base.Joiner;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
@@ -49,6 +51,10 @@ public class TupleIsNullPredicate extends Predicate {
     this.tupleIds_ = Sets.newHashSet(tupleIds);
   }
 
+  public TupleIsNullPredicate(TupleId tupleId) {
+    this(Collections.singletonList(tupleId));
+  }
+
   /**
    * Copy c'tor used in clone().
    */
@@ -94,7 +100,7 @@ public class TupleIsNullPredicate extends Predicate {
 
   @Override
   protected String toSqlImpl(ToSqlOptions options) {
-    return "TupleIsNull()";
+    return "TupleIsNull(" + Joiner.on(",").join(tupleIds_) + ")";
   }
 
   public Set<TupleId> getTupleIds() { return tupleIds_; }
diff --git a/fe/src/main/java/org/apache/impala/analysis/ValidTupleIdExpr.java b/fe/src/main/java/org/apache/impala/analysis/ValidTupleIdExpr.java
index 1ca96f9..609ed9a 100644
--- a/fe/src/main/java/org/apache/impala/analysis/ValidTupleIdExpr.java
+++ b/fe/src/main/java/org/apache/impala/analysis/ValidTupleIdExpr.java
@@ -25,6 +25,7 @@ import org.apache.impala.common.AnalysisException;
 import org.apache.impala.thrift.TExprNode;
 import org.apache.impala.thrift.TExprNodeType;
 
+import com.google.common.base.Joiner;
 import com.google.common.base.Preconditions;
 import com.google.common.collect.Sets;
 
@@ -82,7 +83,7 @@ public class ValidTupleIdExpr extends Expr {
 
   @Override
   protected String toSqlImpl(ToSqlOptions options) {
-    return "valid_tid()";
+    return "valid_tid(" + Joiner.on(",").join(tupleIds_) + ")";
   }
 
   @Override
diff --git a/fe/src/main/java/org/apache/impala/catalog/ColumnStats.java b/fe/src/main/java/org/apache/impala/catalog/ColumnStats.java
index 46e5f68..d96d5a8 100644
--- a/fe/src/main/java/org/apache/impala/catalog/ColumnStats.java
+++ b/fe/src/main/java/org/apache/impala/catalog/ColumnStats.java
@@ -125,7 +125,7 @@ public class ColumnStats {
    */
   public static ColumnStats fromExpr(Expr expr) {
     Preconditions.checkNotNull(expr);
-    Preconditions.checkState(expr.getType().isValid());
+    Preconditions.checkState(expr.getType().isValid(), expr);
     Type colType = expr.getType();
     ColumnStats stats = new ColumnStats(colType);
     stats.setNumDistinctValues(expr.getNumDistinctValues());
diff --git a/fe/src/main/java/org/apache/impala/common/Id.java b/fe/src/main/java/org/apache/impala/common/Id.java
index b89b56d..5605fdc 100644
--- a/fe/src/main/java/org/apache/impala/common/Id.java
+++ b/fe/src/main/java/org/apache/impala/common/Id.java
@@ -18,10 +18,9 @@
 package org.apache.impala.common;
 
 import java.util.ArrayList;
-import java.util.List;
+import java.util.Collection;
 
 import com.google.common.base.Joiner;
-import com.google.common.collect.Lists;
 
 /**
  * Integer ids that cannot accidentally be compared with ints.
@@ -62,8 +61,8 @@ public class Id<IdType extends Id<IdType>> implements Comparable<Id<IdType>> {
     return list;
   }
 
-  public static <C extends Id> String printIds(List<C> ids) {
-    ArrayList<String> l = Lists.newArrayList();
+  public static <C extends Id> String printIds(Collection<C> ids) {
+    ArrayList<String> l = new ArrayList<>();
     for (C id: ids) {
       l.add(id.toString());
     }
diff --git a/fe/src/main/java/org/apache/impala/planner/DataPartition.java b/fe/src/main/java/org/apache/impala/planner/DataPartition.java
index 1e3ee1b..b2a3cca 100644
--- a/fe/src/main/java/org/apache/impala/planner/DataPartition.java
+++ b/fe/src/main/java/org/apache/impala/planner/DataPartition.java
@@ -40,7 +40,8 @@ import com.google.common.collect.Lists;
 public class DataPartition {
   private final TPartitionType type_;
 
-  // for hash partition: exprs used to compute hash value
+  // Used for any partitioning that requires computing the partition.
+  // Always non-null.
   private List<Expr> partitionExprs_;
 
   private DataPartition(TPartitionType type, List<Expr> exprs) {
diff --git a/fe/src/main/java/org/apache/impala/planner/DistributedPlanner.java b/fe/src/main/java/org/apache/impala/planner/DistributedPlanner.java
index e2fb906..a9515f5 100644
--- a/fe/src/main/java/org/apache/impala/planner/DistributedPlanner.java
+++ b/fe/src/main/java/org/apache/impala/planner/DistributedPlanner.java
@@ -395,11 +395,11 @@ public class DistributedPlanner {
     // The new fragment is hash-partitioned on the lhs input join exprs.
     ExchangeNode lhsExchange =
         new ExchangeNode(ctx_.getNextNodeId(), leftChildFragment.getPlanRoot());
-    lhsExchange.computeStats(null);
+    lhsExchange.computeStats(ctx_.getRootAnalyzer());
     node.setChild(0, lhsExchange);
     ExchangeNode rhsExchange =
         new ExchangeNode(ctx_.getNextNodeId(), rightChildFragment.getPlanRoot());
-    rhsExchange.computeStats(null);
+    rhsExchange.computeStats(ctx_.getRootAnalyzer());
     node.setChild(1, rhsExchange);
 
     // Connect the child fragments in a new fragment, and set the data partition
diff --git a/fe/src/main/java/org/apache/impala/planner/ExchangeNode.java b/fe/src/main/java/org/apache/impala/planner/ExchangeNode.java
index a140dc2..b8221c7 100644
--- a/fe/src/main/java/org/apache/impala/planner/ExchangeNode.java
+++ b/fe/src/main/java/org/apache/impala/planner/ExchangeNode.java
@@ -17,6 +17,8 @@
 
 package org.apache.impala.planner;
 
+import java.util.List;
+
 import org.apache.impala.analysis.Analyzer;
 import org.apache.impala.analysis.Expr;
 import org.apache.impala.analysis.SortInfo;
@@ -102,37 +104,11 @@ public class ExchangeNode extends PlanNode {
 
   @Override
   public void computeStats(Analyzer analyzer) {
-    Preconditions.checkState(!children_.isEmpty(),
-        "ExchangeNode must have at least one child");
-    cardinality_ = 0;
-    for (PlanNode child: children_) {
-      if (child.getCardinality() == -1) {
-        cardinality_ = -1;
-        break;
-      }
-      cardinality_ = checkedAdd(cardinality_, child.getCardinality());
-    }
-
-    if (hasLimit()) {
-      if (cardinality_ == -1) {
-        cardinality_ = limit_;
-      } else {
-        cardinality_ = Math.min(limit_, cardinality_);
-      }
-    }
-
+    super.computeStats(analyzer);
+    Preconditions.checkState(children_.size() == 1);
+    cardinality_ = capCardinalityAtLimit(children_.get(0).getCardinality());
     // Apply the offset correction if there's a valid cardinality
-    if (cardinality_ > -1) {
-      cardinality_ = Math.max(0, cardinality_ - offset_);
-    }
-
-    // Pick the max numNodes_ and avgRowSize_ of all children.
-    numNodes_ = Integer.MIN_VALUE;
-    avgRowSize_ = Integer.MIN_VALUE;
-    for (PlanNode child: children_) {
-      numNodes_ = Math.max(child.numNodes_, numNodes_);
-      avgRowSize_ = Math.max(child.avgRowSize_, avgRowSize_);
-    }
+    if (cardinality_ > -1) cardinality_ = Math.max(0, cardinality_ - offset_);
   }
 
   /**
diff --git a/testdata/workloads/functional-planner/queries/PlannerTest/analytic-fns.test b/testdata/workloads/functional-planner/queries/PlannerTest/analytic-fns.test
index ee1bead..735dda6 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/analytic-fns.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/analytic-fns.test
@@ -29,7 +29,7 @@ PLAN-ROOT SINK
 |  row-size=5B cardinality=100
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=5B cardinality=7.30K
 ====
 # partition groups are coalesced if the intersection of their partition exprs
@@ -64,7 +64,7 @@ PLAN-ROOT SINK
 05:EXCHANGE [HASH(int_col)]
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=6B cardinality=7.30K
 ====
 # unpartitioned analytics are executed with distributed sorts
@@ -96,7 +96,7 @@ PLAN-ROOT SINK
 |  row-size=4B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=4B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -126,7 +126,7 @@ PLAN-ROOT SINK
 05:EXCHANGE [HASH(int_col)]
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=4B cardinality=7.30K
 ====
 # coalesce sort groups
@@ -191,7 +191,7 @@ PLAN-ROOT SINK
 |  row-size=14B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=14B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -248,7 +248,7 @@ PLAN-ROOT SINK
 09:EXCHANGE [HASH(int_col)]
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=14B cardinality=7.30K
 ====
 # check ordering of partition, sort and window groups
@@ -337,7 +337,7 @@ PLAN-ROOT SINK
 |  row-size=15B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=15B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -408,7 +408,7 @@ PLAN-ROOT SINK
 12:EXCHANGE [HASH(int_col,smallint_col)]
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=15B cardinality=7.30K
 ====
 # basic analytic with default window and no partition/ordering
@@ -421,7 +421,7 @@ PLAN-ROOT SINK
 |  row-size=8B cardinality=11.00K
 |
 00:SCAN HDFS [functional.alltypesagg]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    row-size=0B cardinality=11.00K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -433,7 +433,7 @@ PLAN-ROOT SINK
 02:EXCHANGE [UNPARTITIONED]
 |
 00:SCAN HDFS [functional.alltypesagg]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    row-size=0B cardinality=11.00K
 ====
 # basic analytic with default window and partition
@@ -452,7 +452,7 @@ PLAN-ROOT SINK
 |  row-size=9B cardinality=11.00K
 |
 00:SCAN HDFS [functional.alltypesagg]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    row-size=9B cardinality=11.00K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -471,7 +471,7 @@ PLAN-ROOT SINK
 03:EXCHANGE [HASH(tinyint_col)]
 |
 00:SCAN HDFS [functional.alltypesagg]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    row-size=9B cardinality=11.00K
 ====
 # basic analytic with default window and ordering
@@ -490,7 +490,7 @@ PLAN-ROOT SINK
 |  row-size=4B cardinality=11.00K
 |
 00:SCAN HDFS [functional.alltypesagg]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    row-size=4B cardinality=11.00K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -509,7 +509,7 @@ PLAN-ROOT SINK
 |  row-size=4B cardinality=11.00K
 |
 00:SCAN HDFS [functional.alltypesagg]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    row-size=4B cardinality=11.00K
 ====
 # analytic rows window, partition and ordering using complex expressions, with limit
@@ -534,7 +534,7 @@ PLAN-ROOT SINK
 |  row-size=23B cardinality=11.00K
 |
 00:SCAN HDFS [functional.alltypesagg]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    row-size=23B cardinality=11.00K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -557,7 +557,7 @@ PLAN-ROOT SINK
 03:EXCHANGE [HASH(tinyint_col + 1,double_col / 2)]
 |
 00:SCAN HDFS [functional.alltypesagg]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    row-size=23B cardinality=11.00K
 ====
 # test de-duplication of analytic exprs
@@ -611,7 +611,7 @@ PLAN-ROOT SINK
 |  row-size=21B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=21B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -651,7 +651,7 @@ PLAN-ROOT SINK
 06:EXCHANGE [HASH(bool_col)]
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=21B cardinality=7.30K
 ====
 # analytic on the output of a join with a final order by
@@ -683,11 +683,11 @@ PLAN-ROOT SINK
 |  row-size=21B cardinality=99
 |
 |--01:SCAN HDFS [functional.alltypessmall b]
-|     partitions=4/4 files=4 size=6.32KB
+|     HDFS partitions=4/4 files=4 size=6.32KB
 |     row-size=4B cardinality=100
 |
 00:SCAN HDFS [functional.alltypes a]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    runtime filters: RF000 -> a.id
    row-size=17B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
@@ -721,11 +721,11 @@ PLAN-ROOT SINK
 |--06:EXCHANGE [BROADCAST]
 |  |
 |  01:SCAN HDFS [functional.alltypessmall b]
-|     partitions=4/4 files=4 size=6.32KB
+|     HDFS partitions=4/4 files=4 size=6.32KB
 |     row-size=4B cardinality=100
 |
 00:SCAN HDFS [functional.alltypes a]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    runtime filters: RF000 -> a.id
    row-size=17B cardinality=7.30K
 ====
@@ -778,7 +778,7 @@ PLAN-ROOT SINK
 |  row-size=26B cardinality=2
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=14B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -827,7 +827,7 @@ PLAN-ROOT SINK
 |  row-size=26B cardinality=2
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=14B cardinality=7.30K
 ====
 # grouping of multiple analytic exprs by compatible window/partition/order;
@@ -931,7 +931,7 @@ PLAN-ROOT SINK
 |  row-size=15B cardinality=11.00K
 |
 00:SCAN HDFS [functional.alltypesagg]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    row-size=15B cardinality=11.00K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -1002,7 +1002,7 @@ PLAN-ROOT SINK
 11:EXCHANGE [HASH(tinyint_col)]
 |
 00:SCAN HDFS [functional.alltypesagg]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    row-size=15B cardinality=11.00K
 ====
 # grouping of multiple analytic exprs by compatible window/partition/order
@@ -1062,7 +1062,7 @@ PLAN-ROOT SINK
 |  row-size=23B cardinality=11.00K
 |
 00:SCAN HDFS [functional.alltypesagg]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    row-size=23B cardinality=11.00K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -1112,7 +1112,7 @@ PLAN-ROOT SINK
 08:EXCHANGE [HASH(bigint_col)]
 |
 00:SCAN HDFS [functional.alltypesagg]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    row-size=23B cardinality=11.00K
 ====
 # basic test for analytics and inline views
@@ -1145,7 +1145,7 @@ PLAN-ROOT SINK
 |  row-size=21B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=21B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -1172,7 +1172,7 @@ PLAN-ROOT SINK
 05:EXCHANGE [HASH(functional.alltypes.bool_col)]
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=21B cardinality=7.30K
 ====
 # same as above but using a WITH-clause view
@@ -1206,7 +1206,7 @@ PLAN-ROOT SINK
 |  row-size=21B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=21B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -1233,7 +1233,7 @@ PLAN-ROOT SINK
 05:EXCHANGE [HASH(functional.alltypes.bool_col)]
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=21B cardinality=7.30K
 ====
 # test ignoring of non-materialized analytic exprs
@@ -1275,7 +1275,7 @@ PLAN-ROOT SINK
 |  row-size=26B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=26B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -1311,7 +1311,7 @@ PLAN-ROOT SINK
 06:EXCHANGE [HASH(bigint_col)]
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=26B cardinality=7.30K
 ====
 # basic test for analytics and unions
@@ -1347,7 +1347,7 @@ PLAN-ROOT SINK
 |  |  row-size=16B cardinality=8
 |  |
 |  09:SCAN HDFS [functional.alltypestiny]
-|     partitions=4/4 files=4 size=460B
+|     HDFS partitions=4/4 files=4 size=460B
 |     row-size=16B cardinality=8
 |
 07:AGGREGATE [FINALIZE]
@@ -1367,7 +1367,7 @@ PLAN-ROOT SINK
 |  |  row-size=5B cardinality=100
 |  |
 |  04:SCAN HDFS [functional.alltypessmall]
-|     partitions=4/4 files=4 size=6.32KB
+|     HDFS partitions=4/4 files=4 size=6.32KB
 |     row-size=5B cardinality=100
 |
 03:ANALYTIC
@@ -1380,7 +1380,7 @@ PLAN-ROOT SINK
 |  row-size=8B cardinality=7.30K
 |
 01:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=8B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -1410,7 +1410,7 @@ PLAN-ROOT SINK
 |  17:EXCHANGE [HASH(int_col)]
 |  |
 |  09:SCAN HDFS [functional.alltypestiny]
-|     partitions=4/4 files=4 size=460B
+|     HDFS partitions=4/4 files=4 size=460B
 |     row-size=16B cardinality=8
 |
 16:AGGREGATE [FINALIZE]
@@ -1438,7 +1438,7 @@ PLAN-ROOT SINK
 |  14:EXCHANGE [HASH(bool_col)]
 |  |
 |  04:SCAN HDFS [functional.alltypessmall]
-|     partitions=4/4 files=4 size=6.32KB
+|     HDFS partitions=4/4 files=4 size=6.32KB
 |     row-size=5B cardinality=100
 |
 03:ANALYTIC
@@ -1453,7 +1453,7 @@ PLAN-ROOT SINK
 13:EXCHANGE [HASH(int_col)]
 |
 01:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=8B cardinality=7.30K
 ====
 # analytics in an uncorrelated subquery
@@ -1479,12 +1479,12 @@ PLAN-ROOT SINK
 |  |  row-size=13B cardinality=1
 |  |
 |  01:SCAN HDFS [functional.alltypestiny t2]
-|     partitions=4/4 files=4 size=460B
+|     HDFS partitions=4/4 files=4 size=460B
 |     predicates: t2.id < 10
 |     row-size=13B cardinality=1
 |
 00:SCAN HDFS [functional.alltypessmall t1]
-   partitions=4/4 files=4 size=6.32KB
+   HDFS partitions=4/4 files=4 size=6.32KB
    runtime filters: RF000 -> int_col
    row-size=9B cardinality=100
 ---- DISTRIBUTEDPLAN
@@ -1511,12 +1511,12 @@ PLAN-ROOT SINK
 |  05:EXCHANGE [HASH(bool_col)]
 |  |
 |  01:SCAN HDFS [functional.alltypestiny t2]
-|     partitions=4/4 files=4 size=460B
+|     HDFS partitions=4/4 files=4 size=460B
 |     predicates: t2.id < 10
 |     row-size=13B cardinality=1
 |
 00:SCAN HDFS [functional.alltypessmall t1]
-   partitions=4/4 files=4 size=6.32KB
+   HDFS partitions=4/4 files=4 size=6.32KB
    runtime filters: RF000 -> int_col
    row-size=9B cardinality=100
 ====
@@ -1589,7 +1589,7 @@ PLAN-ROOT SINK
 |  row-size=17B cardinality=730
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    predicates: int_col <= 10, int_col >= 5
    row-size=17B cardinality=730
 ---- DISTRIBUTEDPLAN
@@ -1637,7 +1637,7 @@ PLAN-ROOT SINK
 08:EXCHANGE [HASH(bool_col)]
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    predicates: int_col <= 10, int_col >= 5
    row-size=17B cardinality=730
 ====
@@ -1661,7 +1661,7 @@ PLAN-ROOT SINK
 |  row-size=32B cardinality=730
 |
 |--03:SCAN HDFS [functional.alltypes t2]
-|     partitions=24/24 files=24 size=478.45KB
+|     HDFS partitions=24/24 files=24 size=478.45KB
 |     predicates: t2.id < 10, t2.int_col < 20
 |     row-size=8B cardinality=730
 |
@@ -1677,7 +1677,7 @@ PLAN-ROOT SINK
 |  row-size=16B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=16B cardinality=7.30K
 ====
 # test that predicates are correctly propagated in the presence of outer joins
@@ -1701,7 +1701,7 @@ PLAN-ROOT SINK
 |  row-size=32B cardinality=7.30K
 |
 |--03:SCAN HDFS [functional.alltypes t2]
-|     partitions=24/24 files=24 size=478.45KB
+|     HDFS partitions=24/24 files=24 size=478.45KB
 |     predicates: t2.id < 10, t2.int_col < 20
 |     row-size=8B cardinality=730
 |
@@ -1717,7 +1717,7 @@ PLAN-ROOT SINK
 |  row-size=16B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=16B cardinality=7.30K
 ====
 # test canonical function/window/order: row_number() gets a ROWS window
@@ -1739,7 +1739,7 @@ PLAN-ROOT SINK
 |  row-size=5B cardinality=11.00K
 |
 00:SCAN HDFS [functional.alltypesagg]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    row-size=5B cardinality=11.00K
 ====
 # test canonical function/window/order: lead() and lag() have default
@@ -1810,7 +1810,7 @@ PLAN-ROOT SINK
 |  row-size=11B cardinality=11.00K
 |
 00:SCAN HDFS [functional.alltypesagg]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    row-size=11B cardinality=11.00K
 ====
 # Test canonical function/window/order: Reverse windows ending in UNBOUNDED FOLLOWING
@@ -1883,7 +1883,7 @@ PLAN-ROOT SINK
 |  row-size=18B cardinality=11.00K
 |
 00:SCAN HDFS [functional.alltypesagg]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    row-size=18B cardinality=11.00K
 ====
 # Test canonical function/window/order: Reverse windows ending in UNBOUNDED FOLLOWING
@@ -1963,7 +1963,7 @@ PLAN-ROOT SINK
 |  row-size=18B cardinality=11.00K
 |
 00:SCAN HDFS [functional.alltypesagg]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    row-size=18B cardinality=11.00K
 ====
 # Test canonical function/window/order: Reverse windows ending in UNBOUNDED FOLLOWING
@@ -2035,7 +2035,7 @@ PLAN-ROOT SINK
 |  row-size=18B cardinality=11.00K
 |
 00:SCAN HDFS [functional.alltypesagg]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    row-size=18B cardinality=11.00K
 ====
 # IMPALA-1229
@@ -2059,12 +2059,12 @@ PLAN-ROOT SINK
 |  row-size=4B cardinality=11.00K
 |
 |--01:SCAN HDFS [functional.alltypesagg t1]
-|     partitions=11/11 files=11 size=814.73KB
+|     HDFS partitions=11/11 files=11 size=814.73KB
 |     limit: 1
 |     row-size=0B cardinality=1
 |
 00:SCAN HDFS [functional.alltypesagg t1]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    row-size=4B cardinality=11.00K
 ====
 # IMPALA-1243: the Where clause predicate needs to be evaluated in a Select node
@@ -2102,11 +2102,11 @@ PLAN-ROOT SINK
 |  |  row-size=5B cardinality=7.30K
 |  |
 |  02:SCAN HDFS [functional.alltypes t1]
-|     partitions=24/24 files=24 size=478.45KB
+|     HDFS partitions=24/24 files=24 size=478.45KB
 |     row-size=5B cardinality=7.30K
 |
 01:SCAN HDFS [functional.alltypestiny t1]
-   partitions=4/4 files=4 size=460B
+   HDFS partitions=4/4 files=4 size=460B
    predicates: t1.id IS NULL, t1.tinyint_col != 5
    row-size=5B cardinality=1
 ---- DISTRIBUTEDPLAN
@@ -2145,11 +2145,11 @@ PLAN-ROOT SINK
 |  |  row-size=5B cardinality=7.30K
 |  |
 |  02:SCAN HDFS [functional.alltypes t1]
-|     partitions=24/24 files=24 size=478.45KB
+|     HDFS partitions=24/24 files=24 size=478.45KB
 |     row-size=5B cardinality=7.30K
 |
 01:SCAN HDFS [functional.alltypestiny t1]
-   partitions=4/4 files=4 size=460B
+   HDFS partitions=4/4 files=4 size=460B
    predicates: t1.id IS NULL, t1.tinyint_col != 5
    row-size=5B cardinality=1
 ====
@@ -2181,7 +2181,7 @@ PLAN-ROOT SINK
 |
 00:SCAN HDFS [functional.alltypes]
    partition predicates: functional.alltypes.year = 2009
-   partitions=12/24 files=12 size=238.68KB
+   HDFS partitions=12/24 files=12 size=238.68KB
    row-size=12B cardinality=3.65K
 ====
 # Propagate predicates through an inline view that computes multiple analytic functions
@@ -2247,7 +2247,7 @@ PLAN-ROOT SINK
 |
 00:SCAN HDFS [functional.alltypes]
    partition predicates: functional.alltypes.year = 2009
-   partitions=12/24 files=12 size=238.68KB
+   HDFS partitions=12/24 files=12 size=238.68KB
    row-size=21B cardinality=3.65K
 ====
 # Don't propagate predicates through an inline view with multiple analytic functions
@@ -2300,7 +2300,7 @@ PLAN-ROOT SINK
 |  row-size=17B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=17B cardinality=7.30K
 ====
 # Propagate a predicate generated from equivalence classes
@@ -2330,7 +2330,7 @@ PLAN-ROOT SINK
 |
 00:SCAN HDFS [functional.alltypestiny]
    partition predicates: functional.alltypestiny.month = 1
-   partitions=1/4 files=1 size=115B
+   HDFS partitions=1/4 files=1 size=115B
    predicates: functional.alltypestiny.id = 1, functional.alltypestiny.tinyint_col = 1
    row-size=21B cardinality=1
 ====
@@ -2369,11 +2369,11 @@ PLAN-ROOT SINK
 |  row-size=21B cardinality=7.81K
 |
 |--01:SCAN HDFS [functional.alltypesagg t2]
-|     partitions=11/11 files=11 size=814.73KB
+|     HDFS partitions=11/11 files=11 size=814.73KB
 |     row-size=8B cardinality=11.00K
 |
 00:SCAN HDFS [functional.alltypes t1]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    runtime filters: RF000 -> t1.id
    row-size=13B cardinality=7.30K
 ====
@@ -2406,7 +2406,7 @@ PLAN-ROOT SINK
 |  row-size=16B cardinality=8
 |
 00:SCAN HDFS [functional.alltypestiny]
-   partitions=4/4 files=4 size=460B
+   HDFS partitions=4/4 files=4 size=460B
    row-size=16B cardinality=8
 ====
 # IMPALA-1519: Check that the first analytic sort of a select block
@@ -2433,13 +2433,13 @@ on (t1.id = t2.a + 100)
 PLAN-ROOT SINK
 |
 08:ANALYTIC
-|  functions: avg(if(TupleIsNull(), NULL, coalesce(id + bigint_col, 40)))
-|  order by: if(TupleIsNull(), NULL, coalesce(bigint_col, 30)) ASC
+|  functions: avg(if(TupleIsNull(1), NULL, coalesce(id + bigint_col, 40)))
+|  order by: if(TupleIsNull(1), NULL, coalesce(bigint_col, 30)) ASC
 |  window: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
 |  row-size=58B cardinality=8
 |
 07:SORT
-|  order by: if(TupleIsNull(), NULL, coalesce(bigint_col, 30)) ASC
+|  order by: if(TupleIsNull(1), NULL, coalesce(bigint_col, 30)) ASC
 |  row-size=50B cardinality=8
 |
 06:ANALYTIC
@@ -2467,11 +2467,11 @@ PLAN-ROOT SINK
 |  row-size=25B cardinality=8
 |
 |--00:SCAN HDFS [functional.alltypestiny t1]
-|     partitions=4/4 files=4 size=460B
+|     HDFS partitions=4/4 files=4 size=460B
 |     row-size=9B cardinality=8
 |
 01:SCAN HDFS [functional.alltypestiny]
-   partitions=4/4 files=4 size=460B
+   HDFS partitions=4/4 files=4 size=460B
    runtime filters: RF000 -> id + 100
    row-size=16B cardinality=8
 ====
@@ -2504,17 +2504,17 @@ PLAN-ROOT SINK
 |
 07:AGGREGATE [FINALIZE]
 |  output: avg(sum(t1.id)), sum(avg(g)), count(id)
-|  group by: if(TupleIsNull(), NULL, coalesce(int_col, 20))
+|  group by: if(TupleIsNull(1), NULL, coalesce(int_col, 20))
 |  row-size=28B cardinality=3
 |
 06:ANALYTIC
-|  functions: avg(if(TupleIsNull(), NULL, coalesce(id + bigint_col, 40)))
-|  order by: if(TupleIsNull(), NULL, coalesce(bigint_col, 30)) ASC
+|  functions: avg(if(TupleIsNull(1), NULL, coalesce(id + bigint_col, 40)))
+|  order by: if(TupleIsNull(1), NULL, coalesce(bigint_col, 30)) ASC
 |  window: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
 |  row-size=46B cardinality=8
 |
 05:SORT
-|  order by: if(TupleIsNull(), NULL, coalesce(bigint_col, 30)) ASC
+|  order by: if(TupleIsNull(1), NULL, coalesce(bigint_col, 30)) ASC
 |  row-size=38B cardinality=8
 |
 04:ANALYTIC
@@ -2532,11 +2532,11 @@ PLAN-ROOT SINK
 |  row-size=21B cardinality=8
 |
 |--00:SCAN HDFS [functional.alltypestiny t1]
-|     partitions=4/4 files=4 size=460B
+|     HDFS partitions=4/4 files=4 size=460B
 |     row-size=5B cardinality=8
 |
 01:SCAN HDFS [functional.alltypestiny]
-   partitions=4/4 files=4 size=460B
+   HDFS partitions=4/4 files=4 size=460B
    runtime filters: RF000 -> id + 100
    row-size=16B cardinality=8
 ====
@@ -2584,7 +2584,7 @@ PLAN-ROOT SINK
 |  row-size=100B cardinality=16
 |
 |--13:ANALYTIC
-|  |  functions: sum(if(TupleIsNull(), NULL, ifnull(int_col, 1)))
+|  |  functions: sum(if(TupleIsNull(18,19), NULL, ifnull(int_col, 1)))
 |  |  order by: id ASC
 |  |  window: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
 |  |  row-size=50B cardinality=8
@@ -2598,7 +2598,7 @@ PLAN-ROOT SINK
 |  |  row-size=41B cardinality=8
 |  |
 |  |--07:SCAN HDFS [functional.alltypestiny c]
-|  |     partitions=4/4 files=4 size=460B
+|  |     HDFS partitions=4/4 files=4 size=460B
 |  |     row-size=4B cardinality=8
 |  |
 |  10:ANALYTIC
@@ -2612,11 +2612,11 @@ PLAN-ROOT SINK
 |  |  row-size=29B cardinality=8
 |  |
 |  08:SCAN HDFS [functional.alltypestiny d]
-|     partitions=4/4 files=4 size=460B
+|     HDFS partitions=4/4 files=4 size=460B
 |     row-size=29B cardinality=8
 |
 06:ANALYTIC
-|  functions: sum(if(TupleIsNull(), NULL, ifnull(int_col, 1)))
+|  functions: sum(if(TupleIsNull(12,13), NULL, ifnull(int_col, 1)))
 |  partition by: a.id
 |  row-size=50B cardinality=8
 |
@@ -2629,7 +2629,7 @@ PLAN-ROOT SINK
 |  row-size=41B cardinality=8
 |
 |--00:SCAN HDFS [functional.alltypestiny a]
-|     partitions=4/4 files=4 size=460B
+|     HDFS partitions=4/4 files=4 size=460B
 |     row-size=4B cardinality=8
 |
 03:ANALYTIC
@@ -2642,7 +2642,7 @@ PLAN-ROOT SINK
 |  row-size=29B cardinality=8
 |
 01:SCAN HDFS [functional.alltypestiny b]
-   partitions=4/4 files=4 size=460B
+   HDFS partitions=4/4 files=4 size=460B
    row-size=29B cardinality=8
 ====
 # IMPALA-1946: Check that On-clause predicates of an outer join assigned in a scan
@@ -2668,17 +2668,17 @@ PLAN-ROOT SINK
 |  |  row-size=12B cardinality=1
 |  |
 |  |--01:SCAN HDFS [functional.alltypestiny t1]
-|  |     partitions=4/4 files=4 size=460B
+|  |     HDFS partitions=4/4 files=4 size=460B
 |  |     predicates: ifnull(t1.int_col, 10) < 10
 |  |     row-size=8B cardinality=1
 |  |
 |  02:SCAN HDFS [functional.alltypestiny t2]
-|     partitions=4/4 files=4 size=460B
+|     HDFS partitions=4/4 files=4 size=460B
 |     runtime filters: RF000 -> t2.id
 |     row-size=4B cardinality=8
 |
 00:SCAN HDFS [functional.alltypestiny a]
-   partitions=4/4 files=4 size=460B
+   HDFS partitions=4/4 files=4 size=460B
    row-size=4B cardinality=8
 ====
 # IMPALA-2832: Test proper cloning of analytic function call exprs in a CTAS.
@@ -2701,7 +2701,7 @@ WRITE TO HDFS [default.impala_2832, OVERWRITE=false]
 |  row-size=12B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=12B cardinality=7.30K
 ====
 # For first/last_value(), ranges windows get rewritten as rows windows,
@@ -2725,7 +2725,7 @@ PLAN-ROOT SINK
 |  row-size=12B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=12B cardinality=7.30K
 ====
 # IMPALA-4263: Analytic function needs a hash exchange because the partition exprs
@@ -2758,13 +2758,13 @@ PLAN-ROOT SINK
 |--06:EXCHANGE [HASH(t2.id)]
 |  |
 |  01:SCAN HDFS [functional.alltypessmall t2]
-|     partitions=4/4 files=4 size=6.32KB
+|     HDFS partitions=4/4 files=4 size=6.32KB
 |     row-size=4B cardinality=100
 |
 05:EXCHANGE [HASH(t1.id)]
 |
 00:SCAN HDFS [functional.alltypes t1]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    runtime filters: RF000 -> t1.id
    row-size=4B cardinality=7.30K
 ====
@@ -2781,7 +2781,7 @@ PLAN-ROOT SINK
 02:EXCHANGE [UNPARTITIONED]
 |
 00:SCAN HDFS [functional.alltypesagg]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    row-size=1B cardinality=11.00K
 ====
 # IMPALA-1882: Confirm that last_value function used without a partition by and order
@@ -2797,7 +2797,7 @@ PLAN-ROOT SINK
 02:EXCHANGE [UNPARTITIONED]
 |
 00:SCAN HDFS [functional.alltypesagg]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    row-size=1B cardinality=11.00K
 ====
 # IMPALA-1882: Confirm that first_value function using only a partition by clause
@@ -2821,7 +2821,7 @@ PLAN-ROOT SINK
 03:EXCHANGE [HASH(bool_col)]
 |
 00:SCAN HDFS [functional.alltypessmall]
-   partitions=4/4 files=4 size=6.32KB
+   HDFS partitions=4/4 files=4 size=6.32KB
    row-size=89B cardinality=100
 ====
 # IMPALA-1882: Confirm that last_value function using only a partition by clause
@@ -2845,7 +2845,7 @@ PLAN-ROOT SINK
 03:EXCHANGE [HASH(bool_col)]
 |
 00:SCAN HDFS [functional.alltypessmall]
-   partitions=4/4 files=4 size=6.32KB
+   HDFS partitions=4/4 files=4 size=6.32KB
    row-size=89B cardinality=100
 ====
 # IMPALA-6473: analytic fn where the same expr is in the 'partition by' and the 'order by'
@@ -2871,7 +2871,7 @@ PLAN-ROOT SINK
 03:EXCHANGE [HASH(abs(int_col),string_col)]
 |
 00:SCAN HDFS [functional.alltypestiny]
-   partitions=4/4 files=4 size=460B
+   HDFS partitions=4/4 files=4 size=460B
    row-size=21B cardinality=8
 ====
 # IMPALA-6323 Partition by a constant is equivalent to no partitioning.
@@ -2901,7 +2901,7 @@ PLAN-ROOT SINK
 |  row-size=1B cardinality=8
 |
 00:SCAN HDFS [functional.alltypestiny]
-   partitions=4/4 files=4 size=460B
+   HDFS partitions=4/4 files=4 size=460B
    row-size=0B cardinality=8
 ====
 # Regression test for IMPALA-8069
@@ -2918,7 +2918,7 @@ PLAN-ROOT SINK
 |  row-size=9B cardinality=8
 |
 00:SCAN HDFS [functional.alltypestiny]
-   partitions=4/4 files=4 size=460B
+   HDFS partitions=4/4 files=4 size=460B
    row-size=0B cardinality=8
 ====
 # Regression test for IMPALA-8790
@@ -3042,7 +3042,7 @@ PLAN-ROOT SINK
 |     row-size=0B cardinality=10
 |
 00:SCAN HDFS [tpch_nested_parquet.customer t]
-   HDFS partitions=1/1 files=4 size=292.39MB
+   HDFS partitions=1/1 files=4 size=288.99MB
    row-size=20B cardinality=150.00K
 ====
 # IMPALA-8718: No more collection slots in the output of the inline view of analytics.
@@ -3083,10 +3083,10 @@ PLAN-ROOT SINK
 |  |     row-size=0B cardinality=10
 |  |
 |  01:SCAN HDFS [tpch_nested_parquet.customer t]
-|     HDFS partitions=1/1 files=4 size=289.00MB
+|     HDFS partitions=1/1 files=4 size=288.99MB
 |     row-size=20B cardinality=150.00K
 |
 00:SCAN HDFS [tpch_nested_parquet.customer leftside]
-   HDFS partitions=1/1 files=4 size=289.00MB
+   HDFS partitions=1/1 files=4 size=288.99MB
    row-size=38B cardinality=150.00K
 ====
diff --git a/testdata/workloads/functional-planner/queries/PlannerTest/card-agg.test b/testdata/workloads/functional-planner/queries/PlannerTest/card-agg.test
index 69254da..7576e03 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/card-agg.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/card-agg.test
@@ -148,7 +148,7 @@ from tpch.lineitem
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(l_orderkey)), aggif(valid_tid() = 4, count(l_partkey))
+|  output: aggif(valid_tid(2,4) = 2, count(l_orderkey)), aggif(valid_tid(2,4) = 4, count(l_partkey))
 |  row-size=16B cardinality=1
 |
 02:AGGREGATE [FINALIZE]
@@ -172,7 +172,7 @@ PLAN-ROOT SINK
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(l_orderkey)), aggif(valid_tid() = 4, count(l_partkey))
+|  output: aggif(valid_tid(2,4) = 2, count(l_orderkey)), aggif(valid_tid(2,4) = 4, count(l_partkey))
 |  row-size=16B cardinality=1
 |
 07:AGGREGATE [FINALIZE]
@@ -198,7 +198,7 @@ PLAN-ROOT SINK
 |    group by: l_partkey
 |  row-size=16B cardinality=1.76M
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(l_orderkey) WHEN 3 THEN murmur_hash(l_partkey) END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,3) WHEN 1 THEN murmur_hash(l_orderkey) WHEN 3 THEN murmur_hash(l_partkey) END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -223,8 +223,8 @@ group by l_partkey
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(l_orderkey)), aggif(valid_tid() = 4, count(l_comment)), aggif(valid_tid() = 6, count(l_suppkey))
-|  group by: CASE valid_tid() WHEN 2 THEN l_partkey WHEN 4 THEN l_partkey WHEN 6 THEN l_partkey END
+|  output: aggif(valid_tid(2,4,6) = 2, count(l_orderkey)), aggif(valid_tid(2,4,6) = 4, count(l_comment)), aggif(valid_tid(2,4,6) = 6, count(l_suppkey))
+|  group by: CASE valid_tid(2,4,6) WHEN 2 THEN l_partkey WHEN 4 THEN l_partkey WHEN 6 THEN l_partkey END
 |  row-size=32B cardinality=200.52K
 |
 02:AGGREGATE [FINALIZE]
@@ -257,8 +257,8 @@ PLAN-ROOT SINK
 08:EXCHANGE [UNPARTITIONED]
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(l_orderkey)), aggif(valid_tid() = 4, count(l_comment)), aggif(valid_tid() = 6, count(l_suppkey))
-|  group by: CASE valid_tid() WHEN 2 THEN l_partkey WHEN 4 THEN l_partkey WHEN 6 THEN l_partkey END
+|  output: aggif(valid_tid(2,4,6) = 2, count(l_orderkey)), aggif(valid_tid(2,4,6) = 4, count(l_comment)), aggif(valid_tid(2,4,6) = 6, count(l_suppkey))
+|  group by: CASE valid_tid(2,4,6) WHEN 2 THEN l_partkey WHEN 4 THEN l_partkey WHEN 6 THEN l_partkey END
 |  row-size=32B cardinality=200.52K
 |
 07:AGGREGATE [FINALIZE]
@@ -273,7 +273,7 @@ PLAN-ROOT SINK
 |    group by: l_partkey
 |  row-size=48B cardinality=601.55K
 |
-06:EXCHANGE [HASH(CASE valid_tid() WHEN 2 THEN murmur_hash(l_partkey) WHEN 4 THEN murmur_hash(l_partkey) WHEN 6 THEN murmur_hash(l_partkey) END)]
+06:EXCHANGE [HASH(CASE valid_tid(2,4,6) WHEN 2 THEN murmur_hash(l_partkey) WHEN 4 THEN murmur_hash(l_partkey) WHEN 6 THEN murmur_hash(l_partkey) END)]
 |
 02:AGGREGATE [STREAMING]
 |  Class 0
@@ -296,7 +296,7 @@ PLAN-ROOT SINK
 |    group by: l_partkey, l_suppkey
 |  row-size=78B cardinality=18.00M
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(l_partkey) WHEN 3 THEN murmur_hash(l_partkey) WHEN 5 THEN murmur_hash(l_partkey) END,CASE valid_tid() WHEN 1 THEN murmur_hash(l_orderkey) WHEN 3 THEN murmur_hash(l_comment) WHEN 5 THEN murmur_hash(l_suppkey) END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(l_partkey) WHEN 3 THEN murmur_hash(l_partkey) WHEN 5 THEN murmur_hash(l_partkey) END,CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(l_orderkey) WHEN 3 THEN murmur_hash(l_comment) WHEN 5 THEN murmur_hash(l_suppkey) END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -318,7 +318,7 @@ from functional.alltypes
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(id)), aggif(valid_tid() = 4, count(int_col)), aggif(valid_tid() = 5, count(*))
+|  output: aggif(valid_tid(2,4,5) = 2, count(id)), aggif(valid_tid(2,4,5) = 4, count(int_col)), aggif(valid_tid(2,4,5) = 5, count(*))
 |  row-size=24B cardinality=1
 |
 02:AGGREGATE [FINALIZE]
@@ -346,7 +346,7 @@ PLAN-ROOT SINK
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(id)), aggif(valid_tid() = 4, count(int_col)), aggif(valid_tid() = 5, count(*))
+|  output: aggif(valid_tid(2,4,5) = 2, count(id)), aggif(valid_tid(2,4,5) = 4, count(int_col)), aggif(valid_tid(2,4,5) = 5, count(*))
 |  row-size=24B cardinality=1
 |
 07:AGGREGATE [FINALIZE]
@@ -378,7 +378,7 @@ PLAN-ROOT SINK
 |    output: count:merge(*)
 |  row-size=16B cardinality=7.31K
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(id) WHEN 3 THEN murmur_hash(int_col) WHEN 5 THEN 0 END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(id) WHEN 3 THEN murmur_hash(int_col) WHEN 5 THEN 0 END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -534,8 +534,8 @@ group by t1.ss_sold_time_sk, t1.ss_item_sk, t1.ss_customer_sk,
 PLAN-ROOT SINK
 |
 09:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 5, count(t4.ss_net_profit)), aggif(valid_tid() = 7, count(t4.ss_sold_date_sk))
-|  group by: CASE valid_tid() WHEN 5 THEN t1.ss_sold_time_sk WHEN 7 THEN t1.ss_sold_time_sk END, CASE valid_tid() WHEN 5 THEN t1.ss_item_sk WHEN 7 THEN t1.ss_item_sk END, CASE valid_tid() WHEN 5 THEN t1.ss_customer_sk WHEN 7 THEN t1.ss_customer_sk END, CASE valid_tid() WHEN 5 THEN t1.ss_cdemo_sk WHEN 7 THEN t1.ss_cdemo_sk END, CASE valid_tid() WHEN 5 THEN t1.ss_hdemo_sk WHEN 7 THEN t1.ss_hdemo_sk END, CASE valid_tid() WHEN 5 THEN t1.ss_addr_sk WHEN 7 THEN t1.ss_addr_sk END, CASE valid_ti [...]
+|  output: aggif(valid_tid(5,7) = 5, count(t4.ss_net_profit)), aggif(valid_tid(5,7) = 7, count(t4.ss_sold_date_sk))
+|  group by: CASE valid_tid(5,7) WHEN 5 THEN t1.ss_sold_time_sk WHEN 7 THEN t1.ss_sold_time_sk END, CASE valid_tid(5,7) WHEN 5 THEN t1.ss_item_sk WHEN 7 THEN t1.ss_item_sk END, CASE valid_tid(5,7) WHEN 5 THEN t1.ss_customer_sk WHEN 7 THEN t1.ss_customer_sk END, CASE valid_tid(5,7) WHEN 5 THEN t1.ss_cdemo_sk WHEN 7 THEN t1.ss_cdemo_sk END, CASE valid_tid(5,7) WHEN 5 THEN t1.ss_hdemo_sk WHEN 7 THEN t1.ss_hdemo_sk END, CASE valid_tid(5,7) WHEN 5 THEN t1.ss_addr_sk WHEN 7 THEN t1.ss_addr_sk  [...]
 |  row-size=408B cardinality=9223372.04T
 |
 08:AGGREGATE [FINALIZE]
@@ -584,8 +584,8 @@ PLAN-ROOT SINK
 17:EXCHANGE [UNPARTITIONED]
 |
 09:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 5, count(t4.ss_net_profit)), aggif(valid_tid() = 7, count(t4.ss_sold_date_sk))
-|  group by: CASE valid_tid() WHEN 5 THEN t1.ss_sold_time_sk WHEN 7 THEN t1.ss_sold_time_sk END, CASE valid_tid() WHEN 5 THEN t1.ss_item_sk WHEN 7 THEN t1.ss_item_sk END, CASE valid_tid() WHEN 5 THEN t1.ss_customer_sk WHEN 7 THEN t1.ss_customer_sk END, CASE valid_tid() WHEN 5 THEN t1.ss_cdemo_sk WHEN 7 THEN t1.ss_cdemo_sk END, CASE valid_tid() WHEN 5 THEN t1.ss_hdemo_sk WHEN 7 THEN t1.ss_hdemo_sk END, CASE valid_tid() WHEN 5 THEN t1.ss_addr_sk WHEN 7 THEN t1.ss_addr_sk END, CASE valid_ti [...]
+|  output: aggif(valid_tid(5,7) = 5, count(t4.ss_net_profit)), aggif(valid_tid(5,7) = 7, count(t4.ss_sold_date_sk))
+|  group by: CASE valid_tid(5,7) WHEN 5 THEN t1.ss_sold_time_sk WHEN 7 THEN t1.ss_sold_time_sk END, CASE valid_tid(5,7) WHEN 5 THEN t1.ss_item_sk WHEN 7 THEN t1.ss_item_sk END, CASE valid_tid(5,7) WHEN 5 THEN t1.ss_customer_sk WHEN 7 THEN t1.ss_customer_sk END, CASE valid_tid(5,7) WHEN 5 THEN t1.ss_cdemo_sk WHEN 7 THEN t1.ss_cdemo_sk END, CASE valid_tid(5,7) WHEN 5 THEN t1.ss_hdemo_sk WHEN 7 THEN t1.ss_hdemo_sk END, CASE valid_tid(5,7) WHEN 5 THEN t1.ss_addr_sk WHEN 7 THEN t1.ss_addr_sk  [...]
 |  row-size=408B cardinality=9223372.04T
 |
 16:AGGREGATE [FINALIZE]
@@ -597,7 +597,7 @@ PLAN-ROOT SINK
 |    group by: t1.ss_sold_time_sk, t1.ss_item_sk, t1.ss_customer_sk, t1.ss_cdemo_sk, t1.ss_hdemo_sk, t1.ss_addr_sk, t1.ss_store_sk, t1.ss_promo_sk, t1.ss_ticket_number, t1.ss_quantity, t1.ss_wholesale_cost, t1.ss_list_price, t1.ss_sales_price, t1.ss_ext_discount_amt, t1.ss_ext_sales_price, t1.ss_ext_wholesale_cost, t1.ss_ext_list_price, t1.ss_ext_tax, t1.ss_coupon_amt, t1.ss_net_paid, t1.ss_net_paid_inc_tax, t1.ss_net_profit, t1.ss_sold_date_sk, t2.ss_sold_time_sk, t2.ss_item_sk, t2.ss_c [...]
 |  row-size=800B cardinality=9223372.04T
 |
-15:EXCHANGE [HASH(CASE valid_tid() WHEN 5 THEN murmur_hash(t1.ss_sold_time_sk) WHEN 7 THEN murmur_hash(t1.ss_sold_time_sk) END,CASE valid_tid() WHEN 5 THEN murmur_hash(t1.ss_item_sk) WHEN 7 THEN murmur_hash(t1.ss_item_sk) END,CASE valid_tid() WHEN 5 THEN murmur_hash(t1.ss_customer_sk) WHEN 7 THEN murmur_hash(t1.ss_customer_sk) END,CASE valid_tid() WHEN 5 THEN murmur_hash(t1.ss_cdemo_sk) WHEN 7 THEN murmur_hash(t1.ss_cdemo_sk) END,CASE valid_tid() WHEN 5 THEN murmur_hash(t1.ss_hdemo_sk) W [...]
+15:EXCHANGE [HASH(CASE valid_tid(5,7) WHEN 5 THEN murmur_hash(t1.ss_sold_time_sk) WHEN 7 THEN murmur_hash(t1.ss_sold_time_sk) END,CASE valid_tid(5,7) WHEN 5 THEN murmur_hash(t1.ss_item_sk) WHEN 7 THEN murmur_hash(t1.ss_item_sk) END,CASE valid_tid(5,7) WHEN 5 THEN murmur_hash(t1.ss_customer_sk) WHEN 7 THEN murmur_hash(t1.ss_customer_sk) END,CASE valid_tid(5,7) WHEN 5 THEN murmur_hash(t1.ss_cdemo_sk) WHEN 7 THEN murmur_hash(t1.ss_cdemo_sk) END,CASE valid_tid(5,7) WHEN 5 THEN murmur_hash(t1 [...]
 |
 08:AGGREGATE [STREAMING]
 |  Class 0
@@ -615,7 +615,7 @@ PLAN-ROOT SINK
 |    group by: t1.ss_sold_time_sk, t1.ss_item_sk, t1.ss_customer_sk, t1.ss_cdemo_sk, t1.ss_hdemo_sk, t1.ss_addr_sk, t1.ss_store_sk, t1.ss_promo_sk, t1.ss_ticket_number, t1.ss_quantity, t1.ss_wholesale_cost, t1.ss_list_price, t1.ss_sales_price, t1.ss_ext_discount_amt, t1.ss_ext_sales_price, t1.ss_ext_wholesale_cost, t1.ss_ext_list_price, t1.ss_ext_tax, t1.ss_coupon_amt, t1.ss_net_paid, t1.ss_net_paid_inc_tax, t1.ss_net_profit, t1.ss_sold_date_sk, t2.ss_sold_time_sk, t2.ss_item_sk, t2.ss_c [...]
 |  row-size=792B cardinality=9223372.04T
 |
-13:EXCHANGE [HASH(CASE valid_tid() WHEN 4 THEN murmur_hash(t1.ss_sold_time_sk) WHEN 6 THEN murmur_hash(t1.ss_sold_time_sk) END,CASE valid_tid() WHEN 4 THEN murmur_hash(t1.ss_item_sk) WHEN 6 THEN murmur_hash(t1.ss_item_sk) END,CASE valid_tid() WHEN 4 THEN murmur_hash(t1.ss_customer_sk) WHEN 6 THEN murmur_hash(t1.ss_customer_sk) END,CASE valid_tid() WHEN 4 THEN murmur_hash(t1.ss_cdemo_sk) WHEN 6 THEN murmur_hash(t1.ss_cdemo_sk) END,CASE valid_tid() WHEN 4 THEN murmur_hash(t1.ss_hdemo_sk) W [...]
+13:EXCHANGE [HASH(CASE valid_tid(4,6) WHEN 4 THEN murmur_hash(t1.ss_sold_time_sk) WHEN 6 THEN murmur_hash(t1.ss_sold_time_sk) END,CASE valid_tid(4,6) WHEN 4 THEN murmur_hash(t1.ss_item_sk) WHEN 6 THEN murmur_hash(t1.ss_item_sk) END,CASE valid_tid(4,6) WHEN 4 THEN murmur_hash(t1.ss_customer_sk) WHEN 6 THEN murmur_hash(t1.ss_customer_sk) END,CASE valid_tid(4,6) WHEN 4 THEN murmur_hash(t1.ss_cdemo_sk) WHEN 6 THEN murmur_hash(t1.ss_cdemo_sk) END,CASE valid_tid(4,6) WHEN 4 THEN murmur_hash(t1 [...]
 |
 07:AGGREGATE [STREAMING]
 |  Class 0
diff --git a/testdata/workloads/functional-planner/queries/PlannerTest/joins.test b/testdata/workloads/functional-planner/queries/PlannerTest/joins.test
index ac21f45..721b2ab 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/joins.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/joins.test
@@ -2616,8 +2616,8 @@ PLAN-ROOT SINK
 |  row-size=8B cardinality=1
 |
 02:HASH JOIN [LEFT OUTER JOIN]
-|  hash predicates: t1.id = if(TupleIsNull(), NULL, 1)
-|  other predicates: if(TupleIsNull(), NULL, 1) IN (if(TupleIsNull(), NULL, 1), 10)
+|  hash predicates: t1.id = if(TupleIsNull(1), NULL, 1)
+|  other predicates: if(TupleIsNull(1), NULL, 1) IN (if(TupleIsNull(1), NULL, 1), 10)
 |  row-size=4B cardinality=8
 |
 |--01:SCAN HDFS [functional.alltypessmall]
diff --git a/testdata/workloads/functional-planner/queries/PlannerTest/multiple-distinct-limit.test b/testdata/workloads/functional-planner/queries/PlannerTest/multiple-distinct-limit.test
index bb9ee16..44cae21 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/multiple-distinct-limit.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/multiple-distinct-limit.test
@@ -7,7 +7,7 @@ limit 10
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 5, min(timestamp_col)), aggif(valid_tid() = 5, max(timestamp_col))
+|  output: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)), aggif(valid_tid(2,4,5) = 4, count(smallint_col)), aggif(valid_tid(2,4,5) = 5, min(timestamp_col)), aggif(valid_tid(2,4,5) = 5, max(timestamp_col))
 |  limit: 10
 |  row-size=48B cardinality=1
 |
@@ -27,16 +27,16 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: min(timestamp_col), max(timestamp_col)
-|  row-size=35B cardinality=31
+|  row-size=35B cardinality=21
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=19B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 5, min(timestamp_col)), aggif(valid_tid() = 5, max(timestamp_col))
+|  output: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)), aggif(valid_tid(2,4,5) = 4, count(smallint_col)), aggif(valid_tid(2,4,5) = 5, min(timestamp_col)), aggif(valid_tid(2,4,5) = 5, max(timestamp_col))
 |  limit: 10
 |  row-size=48B cardinality=1
 |
@@ -67,9 +67,9 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: min:merge(timestamp_col), max:merge(timestamp_col)
-|  row-size=35B cardinality=31
+|  row-size=35B cardinality=21
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(smallint_col) WHEN 5 THEN 0 END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(smallint_col) WHEN 5 THEN 0 END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -78,10 +78,10 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: min(timestamp_col), max(timestamp_col)
-|  row-size=35B cardinality=31
+|  row-size=35B cardinality=21
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=19B cardinality=7.30K
 ====
 # Test correct placement of limit. Simplifies to a single class with one distinct agg.
@@ -99,7 +99,7 @@ PLAN-ROOT SINK
 |  row-size=16B cardinality=1
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=16B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -116,7 +116,7 @@ PLAN-ROOT SINK
 |  row-size=16B cardinality=1
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=16B cardinality=7.30K
 ====
 # Test correct placement of limit. Simplifies to a single class with a non-distinct agg.
@@ -134,7 +134,7 @@ PLAN-ROOT SINK
 |  row-size=16B cardinality=1
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=16B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -151,7 +151,7 @@ PLAN-ROOT SINK
 |  row-size=16B cardinality=1
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=16B cardinality=7.30K
 ====
 # Test correct placement of limit. Simplifies to a single class with distinct
@@ -175,7 +175,7 @@ PLAN-ROOT SINK
 |  row-size=18B cardinality=10
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=18B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -204,6 +204,6 @@ PLAN-ROOT SINK
 |  row-size=18B cardinality=10
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=18B cardinality=7.30K
 ====
diff --git a/testdata/workloads/functional-planner/queries/PlannerTest/multiple-distinct-materialization.test b/testdata/workloads/functional-planner/queries/PlannerTest/multiple-distinct-materialization.test
index 8b294ed..e60c0f8 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/multiple-distinct-materialization.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/multiple-distinct-materialization.test
@@ -8,7 +8,7 @@ select a, c, e1, e2, e3 from
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 7, count(int_col)), aggif(valid_tid() = 11, min(float_col)), aggif(valid_tid() = 11, max(float_col)), aggif(valid_tid() = 11, sum(double_col))
+|  output: aggif(valid_tid(2,5,7,10,11) = 2, count(tinyint_col)), aggif(valid_tid(2,5,7,10,11) = 7, count(int_col)), aggif(valid_tid(2,5,7,10,11) = 11, min(float_col)), aggif(valid_tid(2,5,7,10,11) = 11, max(float_col)), aggif(valid_tid(2,5,7,10,11) = 11, sum(double_col))
 |  row-size=32B cardinality=1
 |
 02:AGGREGATE [FINALIZE]
@@ -27,16 +27,16 @@ PLAN-ROOT SINK
 |    group by: int_col
 |  Class 2
 |    output: min(float_col), max(float_col), sum(double_col)
-|  row-size=21B cardinality=31
+|  row-size=21B cardinality=21
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=17B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 7, count(int_col)), aggif(valid_tid() = 11, min(float_col)), aggif(valid_tid() = 11, max(float_col)), aggif(valid_tid() = 11, sum(double_col))
+|  output: aggif(valid_tid(2,5,7,10,11) = 2, count(tinyint_col)), aggif(valid_tid(2,5,7,10,11) = 7, count(int_col)), aggif(valid_tid(2,5,7,10,11) = 11, min(float_col)), aggif(valid_tid(2,5,7,10,11) = 11, max(float_col)), aggif(valid_tid(2,5,7,10,11) = 11, sum(double_col))
 |  row-size=32B cardinality=1
 |
 07:AGGREGATE [FINALIZE]
@@ -66,9 +66,9 @@ PLAN-ROOT SINK
 |    group by: int_col
 |  Class 2
 |    output: min:merge(float_col), max:merge(float_col), sum:merge(double_col)
-|  row-size=21B cardinality=31
+|  row-size=21B cardinality=21
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 6 THEN murmur_hash(int_col) WHEN 11 THEN 0 END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,6,11) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 6 THEN murmur_hash(int_col) WHEN 11 THEN 0 END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -77,10 +77,10 @@ PLAN-ROOT SINK
 |    group by: int_col
 |  Class 2
 |    output: min(float_col), max(float_col), sum(double_col)
-|  row-size=21B cardinality=31
+|  row-size=21B cardinality=21
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=17B cardinality=7.30K
 ====
 # A subset of aggregation classes are materialized. A subset of aggregation functions
@@ -96,7 +96,7 @@ select a1, c2, e2 from
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 3, count(tinyint_col)), aggif(valid_tid() = 9, avg(int_col)), aggif(valid_tid() = 13, max(float_col))
+|  output: aggif(valid_tid(3,6,9,12,13) = 3, count(tinyint_col)), aggif(valid_tid(3,6,9,12,13) = 9, avg(int_col)), aggif(valid_tid(3,6,9,12,13) = 13, max(float_col))
 |  row-size=20B cardinality=1
 |
 02:AGGREGATE [FINALIZE]
@@ -115,16 +115,16 @@ PLAN-ROOT SINK
 |    group by: int_col
 |  Class 2
 |    output: max(float_col)
-|  row-size=9B cardinality=31
+|  row-size=9B cardinality=21
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=9B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 3, count(tinyint_col)), aggif(valid_tid() = 9, avg(int_col)), aggif(valid_tid() = 13, max(float_col))
+|  output: aggif(valid_tid(3,6,9,12,13) = 3, count(tinyint_col)), aggif(valid_tid(3,6,9,12,13) = 9, avg(int_col)), aggif(valid_tid(3,6,9,12,13) = 13, max(float_col))
 |  row-size=20B cardinality=1
 |
 07:AGGREGATE [FINALIZE]
@@ -154,9 +154,9 @@ PLAN-ROOT SINK
 |    group by: int_col
 |  Class 2
 |    output: max:merge(float_col)
-|  row-size=9B cardinality=31
+|  row-size=9B cardinality=21
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 7 THEN murmur_hash(int_col) WHEN 13 THEN 0 END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,7,13) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 7 THEN murmur_hash(int_col) WHEN 13 THEN 0 END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -165,10 +165,10 @@ PLAN-ROOT SINK
 |    group by: int_col
 |  Class 2
 |    output: max(float_col)
-|  row-size=9B cardinality=31
+|  row-size=9B cardinality=21
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=9B cardinality=7.30K
 ====
 # A subset of aggregation classes are materialized. With group by.
@@ -183,9 +183,9 @@ select a, c, e1, e2, e3, gby2 from
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 7, count(int_col)), aggif(valid_tid() = 11, min(float_col)), aggif(valid_tid() = 11, max(float_col)), aggif(valid_tid() = 11, sum(double_col))
-|  group by: CASE valid_tid() WHEN 2 THEN string_col WHEN 7 THEN string_col WHEN 11 THEN string_col END, CASE valid_tid() WHEN 2 THEN date_string_col WHEN 7 THEN date_string_col WHEN 11 THEN date_string_col END
-|  row-size=56B cardinality=7.30K
+|  output: aggif(valid_tid(2,5,7,10,11) = 2, count(tinyint_col)), aggif(valid_tid(2,5,7,10,11) = 7, count(int_col)), aggif(valid_tid(2,5,7,10,11) = 11, min(float_col)), aggif(valid_tid(2,5,7,10,11) = 11, max(float_col)), aggif(valid_tid(2,5,7,10,11) = 11, sum(double_col))
+|  group by: CASE valid_tid(2,7,11) WHEN 2 THEN string_col WHEN 7 THEN string_col WHEN 11 THEN string_col END, CASE valid_tid(2,7,11) WHEN 2 THEN date_string_col WHEN 7 THEN date_string_col WHEN 11 THEN date_string_col END
+|  row-size=56B cardinality=8.11K
 |
 02:AGGREGATE [FINALIZE]
 |  Class 0
@@ -197,7 +197,7 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: min:merge(float_col), max:merge(float_col), sum:merge(double_col)
 |    group by: string_col, date_string_col
-|  row-size=131B cardinality=7.30K
+|  row-size=131B cardinality=22.08K
 |
 01:AGGREGATE
 |  Class 0
@@ -207,10 +207,10 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: min(float_col), max(float_col), sum(double_col)
 |    group by: string_col, date_string_col
-|  row-size=120B cardinality=7.30K
+|  row-size=120B cardinality=21.90K
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=50B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -218,9 +218,9 @@ PLAN-ROOT SINK
 08:EXCHANGE [UNPARTITIONED]
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 7, count(int_col)), aggif(valid_tid() = 11, min(float_col)), aggif(valid_tid() = 11, max(float_col)), aggif(valid_tid() = 11, sum(double_col))
-|  group by: CASE valid_tid() WHEN 2 THEN string_col WHEN 7 THEN string_col WHEN 11 THEN string_col END, CASE valid_tid() WHEN 2 THEN date_string_col WHEN 7 THEN date_string_col WHEN 11 THEN date_string_col END
-|  row-size=56B cardinality=7.30K
+|  output: aggif(valid_tid(2,5,7,10,11) = 2, count(tinyint_col)), aggif(valid_tid(2,5,7,10,11) = 7, count(int_col)), aggif(valid_tid(2,5,7,10,11) = 11, min(float_col)), aggif(valid_tid(2,5,7,10,11) = 11, max(float_col)), aggif(valid_tid(2,5,7,10,11) = 11, sum(double_col))
+|  group by: CASE valid_tid(2,7,11) WHEN 2 THEN string_col WHEN 7 THEN string_col WHEN 11 THEN string_col END, CASE valid_tid(2,7,11) WHEN 2 THEN date_string_col WHEN 7 THEN date_string_col WHEN 11 THEN date_string_col END
+|  row-size=56B cardinality=8.11K
 |
 07:AGGREGATE [FINALIZE]
 |  Class 0
@@ -232,9 +232,9 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: min:merge(float_col), max:merge(float_col), sum:merge(double_col)
 |    group by: string_col, date_string_col
-|  row-size=131B cardinality=7.30K
+|  row-size=131B cardinality=22.08K
 |
-06:EXCHANGE [HASH(CASE valid_tid() WHEN 2 THEN murmur_hash(string_col) WHEN 7 THEN murmur_hash(string_col) WHEN 11 THEN murmur_hash(string_col) END,CASE valid_tid() WHEN 2 THEN murmur_hash(date_string_col) WHEN 7 THEN murmur_hash(date_string_col) WHEN 11 THEN murmur_hash(date_string_col) END)]
+06:EXCHANGE [HASH(CASE valid_tid(2,7,11) WHEN 2 THEN murmur_hash(string_col) WHEN 7 THEN murmur_hash(string_col) WHEN 11 THEN murmur_hash(string_col) END,CASE valid_tid(2,7,11) WHEN 2 THEN murmur_hash(date_string_col) WHEN 7 THEN murmur_hash(date_string_col) WHEN 11 THEN murmur_hash(date_string_col) END)]
 |
 02:AGGREGATE [STREAMING]
 |  Class 0
@@ -246,7 +246,7 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: min:merge(float_col), max:merge(float_col), sum:merge(double_col)
 |    group by: string_col, date_string_col
-|  row-size=131B cardinality=7.30K
+|  row-size=131B cardinality=22.08K
 |
 05:AGGREGATE
 |  Class 0
@@ -256,9 +256,9 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: min:merge(float_col), max:merge(float_col), sum:merge(double_col)
 |    group by: string_col, date_string_col
-|  row-size=120B cardinality=7.30K
+|  row-size=120B cardinality=21.90K
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(string_col) WHEN 6 THEN murmur_hash(string_col) WHEN 11 THEN murmur_hash(string_col) END,CASE valid_tid() WHEN 1 THEN murmur_hash(date_string_col) WHEN 6 THEN murmur_hash(date_string_col) WHEN 11 THEN murmur_hash(date_string_col) END,CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 6 THEN murmur_hash(int_col) WHEN 11 THEN 0 END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,6,11) WHEN 1 THEN murmur_hash(string_col) WHEN 6 THEN murmur_hash(string_col) WHEN 11 THEN murmur_hash(string_col) END,CASE valid_tid(1,6,11) WHEN 1 THEN murmur_hash(date_string_col) WHEN 6 THEN murmur_hash(date_string_col) WHEN 11 THEN murmur_hash(date_string_col) END,CASE valid_tid(1,6,11) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 6 THEN murmur_hash(int_col) WHEN 11 THEN 0 END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -268,10 +268,10 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: min(float_col), max(float_col), sum(double_col)
 |    group by: string_col, date_string_col
-|  row-size=120B cardinality=7.30K
+|  row-size=120B cardinality=21.90K
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=50B cardinality=7.30K
 ====
 # A subset of aggregation classes are materialized. A subset of aggregation functions
@@ -289,9 +289,9 @@ select a1, c2, e2, gby1 from
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 3, count(tinyint_col)), aggif(valid_tid() = 9, avg(int_col)), aggif(valid_tid() = 13, max(float_col))
-|  group by: CASE valid_tid() WHEN 3 THEN string_col WHEN 9 THEN string_col WHEN 13 THEN string_col END, CASE valid_tid() WHEN 3 THEN date_string_col WHEN 9 THEN date_string_col WHEN 13 THEN date_string_col END
-|  row-size=44B cardinality=7.30K
+|  output: aggif(valid_tid(3,6,9,12,13) = 3, count(tinyint_col)), aggif(valid_tid(3,6,9,12,13) = 9, avg(int_col)), aggif(valid_tid(3,6,9,12,13) = 13, max(float_col))
+|  group by: CASE valid_tid(3,9,13) WHEN 3 THEN string_col WHEN 9 THEN string_col WHEN 13 THEN string_col END, CASE valid_tid(3,9,13) WHEN 3 THEN date_string_col WHEN 9 THEN date_string_col WHEN 13 THEN date_string_col END
+|  row-size=44B cardinality=8.11K
 |
 02:AGGREGATE [FINALIZE]
 |  Class 0
@@ -303,7 +303,7 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: max:merge(float_col)
 |    group by: string_col, date_string_col
-|  row-size=119B cardinality=7.30K
+|  row-size=119B cardinality=22.08K
 |
 01:AGGREGATE
 |  Class 0
@@ -313,10 +313,10 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: max(float_col)
 |    group by: string_col, date_string_col
-|  row-size=108B cardinality=7.30K
+|  row-size=108B cardinality=21.90K
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=42B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -324,9 +324,9 @@ PLAN-ROOT SINK
 08:EXCHANGE [UNPARTITIONED]
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 3, count(tinyint_col)), aggif(valid_tid() = 9, avg(int_col)), aggif(valid_tid() = 13, max(float_col))
-|  group by: CASE valid_tid() WHEN 3 THEN string_col WHEN 9 THEN string_col WHEN 13 THEN string_col END, CASE valid_tid() WHEN 3 THEN date_string_col WHEN 9 THEN date_string_col WHEN 13 THEN date_string_col END
-|  row-size=44B cardinality=7.30K
+|  output: aggif(valid_tid(3,6,9,12,13) = 3, count(tinyint_col)), aggif(valid_tid(3,6,9,12,13) = 9, avg(int_col)), aggif(valid_tid(3,6,9,12,13) = 13, max(float_col))
+|  group by: CASE valid_tid(3,9,13) WHEN 3 THEN string_col WHEN 9 THEN string_col WHEN 13 THEN string_col END, CASE valid_tid(3,9,13) WHEN 3 THEN date_string_col WHEN 9 THEN date_string_col WHEN 13 THEN date_string_col END
+|  row-size=44B cardinality=8.11K
 |
 07:AGGREGATE [FINALIZE]
 |  Class 0
@@ -338,9 +338,9 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: max:merge(float_col)
 |    group by: string_col, date_string_col
-|  row-size=119B cardinality=7.30K
+|  row-size=119B cardinality=22.08K
 |
-06:EXCHANGE [HASH(CASE valid_tid() WHEN 2 THEN murmur_hash(string_col) WHEN 8 THEN murmur_hash(string_col) WHEN 13 THEN murmur_hash(string_col) END,CASE valid_tid() WHEN 2 THEN murmur_hash(date_string_col) WHEN 8 THEN murmur_hash(date_string_col) WHEN 13 THEN murmur_hash(date_string_col) END)]
+06:EXCHANGE [HASH(CASE valid_tid(2,8,13) WHEN 2 THEN murmur_hash(string_col) WHEN 8 THEN murmur_hash(string_col) WHEN 13 THEN murmur_hash(string_col) END,CASE valid_tid(2,8,13) WHEN 2 THEN murmur_hash(date_string_col) WHEN 8 THEN murmur_hash(date_string_col) WHEN 13 THEN murmur_hash(date_string_col) END)]
 |
 02:AGGREGATE [STREAMING]
 |  Class 0
@@ -352,7 +352,7 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: max:merge(float_col)
 |    group by: string_col, date_string_col
-|  row-size=119B cardinality=7.30K
+|  row-size=119B cardinality=22.08K
 |
 05:AGGREGATE
 |  Class 0
@@ -362,9 +362,9 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: max:merge(float_col)
 |    group by: string_col, date_string_col
-|  row-size=108B cardinality=7.30K
+|  row-size=108B cardinality=21.90K
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(string_col) WHEN 7 THEN murmur_hash(string_col) WHEN 13 THEN murmur_hash(string_col) END,CASE valid_tid() WHEN 1 THEN murmur_hash(date_string_col) WHEN 7 THEN murmur_hash(date_string_col) WHEN 13 THEN murmur_hash(date_string_col) END,CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 7 THEN murmur_hash(int_col) WHEN 13 THEN 0 END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,7,13) WHEN 1 THEN murmur_hash(string_col) WHEN 7 THEN murmur_hash(string_col) WHEN 13 THEN murmur_hash(string_col) END,CASE valid_tid(1,7,13) WHEN 1 THEN murmur_hash(date_string_col) WHEN 7 THEN murmur_hash(date_string_col) WHEN 13 THEN murmur_hash(date_string_col) END,CASE valid_tid(1,7,13) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 7 THEN murmur_hash(int_col) WHEN 13 THEN 0 END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -374,10 +374,10 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: max(float_col)
 |    group by: string_col, date_string_col
-|  row-size=108B cardinality=7.30K
+|  row-size=108B cardinality=21.90K
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=42B cardinality=7.30K
 ====
 # Simplifies to a single aggrgeation class. Only first distinct agg is materialized.
@@ -396,7 +396,7 @@ PLAN-ROOT SINK
 |  row-size=1B cardinality=10
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=1B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -422,7 +422,7 @@ PLAN-ROOT SINK
 |  row-size=1B cardinality=10
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=1B cardinality=7.30K
 ====
 # Simplifies to a single aggrgeation class. Only second distinct agg is materialized.
@@ -441,7 +441,7 @@ PLAN-ROOT SINK
 |  row-size=2B cardinality=10
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=2B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -467,7 +467,7 @@ PLAN-ROOT SINK
 |  row-size=2B cardinality=10
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=2B cardinality=7.30K
 ====
 # Some aggs only referenced in HAVING clause.
@@ -477,8 +477,8 @@ having count(distinct smallint_col) < 10 and max(date_string_col) = 'test'
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 5, min(timestamp_col)), aggif(valid_tid() = 5, max(date_string_col))
-|  having: aggif(valid_tid() = 4, count(smallint_col)) < 10, aggif(valid_tid() = 5, max(date_string_col)) = 'test'
+|  output: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)), aggif(valid_tid(2,4,5) = 4, count(smallint_col)), aggif(valid_tid(2,4,5) = 5, min(timestamp_col)), aggif(valid_tid(2,4,5) = 5, max(date_string_col))
+|  having: aggif(valid_tid(2,4,5) = 4, count(smallint_col)) < 10, aggif(valid_tid(2,4,5) = 5, max(date_string_col)) = 'test'
 |  row-size=44B cardinality=0
 |
 02:AGGREGATE [FINALIZE]
@@ -497,17 +497,17 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: min(timestamp_col), max(date_string_col)
-|  row-size=31B cardinality=31
+|  row-size=31B cardinality=21
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=39B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 5, min(timestamp_col)), aggif(valid_tid() = 5, max(date_string_col))
-|  having: aggif(valid_tid() = 4, count(smallint_col)) < 10, aggif(valid_tid() = 5, max(date_string_col)) = 'test'
+|  output: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)), aggif(valid_tid(2,4,5) = 4, count(smallint_col)), aggif(valid_tid(2,4,5) = 5, min(timestamp_col)), aggif(valid_tid(2,4,5) = 5, max(date_string_col))
+|  having: aggif(valid_tid(2,4,5) = 4, count(smallint_col)) < 10, aggif(valid_tid(2,4,5) = 5, max(date_string_col)) = 'test'
 |  row-size=44B cardinality=0
 |
 07:AGGREGATE [FINALIZE]
@@ -537,9 +537,9 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: min:merge(timestamp_col), max:merge(date_string_col)
-|  row-size=31B cardinality=31
+|  row-size=31B cardinality=21
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(smallint_col) WHEN 5 THEN 0 END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(smallint_col) WHEN 5 THEN 0 END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -548,10 +548,10 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: min(timestamp_col), max(date_string_col)
-|  row-size=31B cardinality=31
+|  row-size=31B cardinality=21
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=39B cardinality=7.30K
 ====
 # Some aggs only referenced in ORDER BY clause.
@@ -562,12 +562,12 @@ order by count(distinct smallint_col), max(date_string_col)
 PLAN-ROOT SINK
 |
 04:SORT
-|  order by: aggif(valid_tid() = 4, count(smallint_col)) ASC, aggif(valid_tid() = 5, max(date_string_col)) ASC
+|  order by: aggif(valid_tid(2,4,5) = 4, count(smallint_col)) ASC, aggif(valid_tid(2,4,5) = 5, max(date_string_col)) ASC
 |  row-size=44B cardinality=11
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 5, min(timestamp_col)), aggif(valid_tid() = 5, max(date_string_col))
-|  group by: CASE valid_tid() WHEN 2 THEN bigint_col WHEN 4 THEN bigint_col WHEN 5 THEN bigint_col END
+|  output: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)), aggif(valid_tid(2,4,5) = 4, count(smallint_col)), aggif(valid_tid(2,4,5) = 5, min(timestamp_col)), aggif(valid_tid(2,4,5) = 5, max(date_string_col))
+|  group by: CASE valid_tid(2,4,5) WHEN 2 THEN bigint_col WHEN 4 THEN bigint_col WHEN 5 THEN bigint_col END
 |  row-size=52B cardinality=11
 |
 02:AGGREGATE [FINALIZE]
@@ -580,7 +580,7 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: min:merge(timestamp_col), max:merge(date_string_col)
 |    group by: bigint_col
-|  row-size=68B cardinality=70
+|  row-size=68B cardinality=30
 |
 01:AGGREGATE
 |  Class 0
@@ -590,24 +590,24 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: min(timestamp_col), max(date_string_col)
 |    group by: bigint_col
-|  row-size=55B cardinality=610
+|  row-size=55B cardinality=210
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=47B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 09:MERGING-EXCHANGE [UNPARTITIONED]
-|  order by: aggif(valid_tid() = 4, count(smallint_col)) ASC, aggif(valid_tid() = 5, max(date_string_col)) ASC
+|  order by: aggif(valid_tid(2,4,5) = 4, count(smallint_col)) ASC, aggif(valid_tid(2,4,5) = 5, max(date_string_col)) ASC
 |
 04:SORT
-|  order by: aggif(valid_tid() = 4, count(smallint_col)) ASC, aggif(valid_tid() = 5, max(date_string_col)) ASC
+|  order by: aggif(valid_tid(2,4,5) = 4, count(smallint_col)) ASC, aggif(valid_tid(2,4,5) = 5, max(date_string_col)) ASC
 |  row-size=44B cardinality=11
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 5, min(timestamp_col)), aggif(valid_tid() = 5, max(date_string_col))
-|  group by: CASE valid_tid() WHEN 2 THEN bigint_col WHEN 4 THEN bigint_col WHEN 5 THEN bigint_col END
+|  output: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)), aggif(valid_tid(2,4,5) = 4, count(smallint_col)), aggif(valid_tid(2,4,5) = 5, min(timestamp_col)), aggif(valid_tid(2,4,5) = 5, max(date_string_col))
+|  group by: CASE valid_tid(2,4,5) WHEN 2 THEN bigint_col WHEN 4 THEN bigint_col WHEN 5 THEN bigint_col END
 |  row-size=52B cardinality=11
 |
 08:AGGREGATE [FINALIZE]
@@ -620,9 +620,9 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: min:merge(timestamp_col), max:merge(date_string_col)
 |    group by: bigint_col
-|  row-size=68B cardinality=70
+|  row-size=68B cardinality=30
 |
-07:EXCHANGE [HASH(CASE valid_tid() WHEN 2 THEN murmur_hash(bigint_col) WHEN 4 THEN murmur_hash(bigint_col) WHEN 5 THEN murmur_hash(bigint_col) END)]
+07:EXCHANGE [HASH(CASE valid_tid(2,4,5) WHEN 2 THEN murmur_hash(bigint_col) WHEN 4 THEN murmur_hash(bigint_col) WHEN 5 THEN murmur_hash(bigint_col) END)]
 |
 02:AGGREGATE [STREAMING]
 |  Class 0
@@ -634,7 +634,7 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: min:merge(timestamp_col), max:merge(date_string_col)
 |    group by: bigint_col
-|  row-size=68B cardinality=70
+|  row-size=68B cardinality=30
 |
 06:AGGREGATE
 |  Class 0
@@ -644,9 +644,9 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: min:merge(timestamp_col), max:merge(date_string_col)
 |    group by: bigint_col
-|  row-size=55B cardinality=610
+|  row-size=55B cardinality=210
 |
-05:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(bigint_col) WHEN 3 THEN murmur_hash(bigint_col) WHEN 5 THEN murmur_hash(bigint_col) END,CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(smallint_col) WHEN 5 THEN 0 END)]
+05:EXCHANGE [HASH(CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(bigint_col) WHEN 3 THEN murmur_hash(bigint_col) WHEN 5 THEN murmur_hash(bigint_col) END,CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(smallint_col) WHEN 5 THEN 0 END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -656,10 +656,10 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: min(timestamp_col), max(date_string_col)
 |    group by: bigint_col
-|  row-size=55B cardinality=610
+|  row-size=55B cardinality=210
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=47B cardinality=7.30K
 ====
 # Mixed distinct and non-distinct aggs. No materialized aggregations. No group by.
@@ -674,7 +674,7 @@ PLAN-ROOT SINK
 |  row-size=0B cardinality=1
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=0B cardinality=7.30K
 ====
 # Mixed distinct and non-distinct aggs. No materialized aggregations. With group by.
@@ -692,7 +692,7 @@ PLAN-ROOT SINK
 |  row-size=33B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=33B cardinality=7.30K
 ====
 # Only distinct aggs. No materialized aggregations. No group by.
@@ -710,7 +710,7 @@ PLAN-ROOT SINK
 |  row-size=2B cardinality=10
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=2B cardinality=7.30K
 ====
 # Only distinct aggs. No materialized aggregations. With group by.
@@ -731,7 +731,7 @@ PLAN-ROOT SINK
 |  row-size=35B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=35B cardinality=7.30K
 ====
 # Simplifies to a single aggregation class. Only first distinct agg is materialized.
@@ -754,7 +754,7 @@ PLAN-ROOT SINK
 |  row-size=1B cardinality=10
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=1B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -762,7 +762,7 @@ PLAN-ROOT SINK
 07:AGGREGATE [FINALIZE]
 |  output: count:merge(tinyint_col)
 |  having: count(tinyint_col) < 9
-|  row-size=8B cardinality=0
+|  row-size=8B cardinality=1
 |
 06:EXCHANGE [UNPARTITIONED]
 |
@@ -781,7 +781,7 @@ PLAN-ROOT SINK
 |  row-size=1B cardinality=10
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=1B cardinality=7.30K
 ====
 # Simplifies to a single aggregation class. Only second distinct agg is materialized.
@@ -804,7 +804,7 @@ PLAN-ROOT SINK
 |  row-size=2B cardinality=10
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=2B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -812,7 +812,7 @@ PLAN-ROOT SINK
 07:AGGREGATE [FINALIZE]
 |  output: count:merge(smallint_col)
 |  having: count(smallint_col) < 9
-|  row-size=8B cardinality=0
+|  row-size=8B cardinality=1
 |
 06:EXCHANGE [UNPARTITIONED]
 |
@@ -831,7 +831,7 @@ PLAN-ROOT SINK
 |  row-size=2B cardinality=10
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=2B cardinality=7.30K
 ====
 # Simplifies to a single aggregation class. Only non-distinct aggs remain.
@@ -851,7 +851,7 @@ PLAN-ROOT SINK
 |  row-size=24B cardinality=0
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=13B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -868,7 +868,7 @@ PLAN-ROOT SINK
 |  row-size=24B cardinality=1
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=13B cardinality=7.30K
 ====
 # Simplifies to a single aggregation class with distinct and non-distinct aggs.
@@ -893,7 +893,7 @@ PLAN-ROOT SINK
 |  row-size=25B cardinality=10
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=14B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -901,7 +901,7 @@ PLAN-ROOT SINK
 07:AGGREGATE [FINALIZE]
 |  output: count:merge(tinyint_col), min:merge(string_col), max:merge(string_col)
 |  having: count(tinyint_col) = 10, max(string_col) > '0', min(string_col) < '9', max(string_col) < min(string_col)
-|  row-size=32B cardinality=0
+|  row-size=32B cardinality=1
 |
 06:EXCHANGE [UNPARTITIONED]
 |
@@ -922,7 +922,7 @@ PLAN-ROOT SINK
 |  row-size=25B cardinality=10
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=14B cardinality=7.30K
 ====
 # Simplifies to a single aggregation class with one distinct agg.
@@ -942,14 +942,14 @@ PLAN-ROOT SINK
 |  output: count(tinyint_col)
 |  group by: date_string_col, timestamp_col
 |  having: count(tinyint_col) < 10
-|  row-size=44B cardinality=10
+|  row-size=44B cardinality=1
 |
 01:AGGREGATE
 |  group by: date_string_col, timestamp_col, tinyint_col
 |  row-size=37B cardinality=10
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    predicates: functional.alltypes.date_string_col = 'test1'
    row-size=37B cardinality=10
 ---- DISTRIBUTEDPLAN
@@ -968,7 +968,7 @@ PLAN-ROOT SINK
 02:AGGREGATE [STREAMING]
 |  output: count(tinyint_col)
 |  group by: date_string_col, timestamp_col
-|  row-size=44B cardinality=10
+|  row-size=44B cardinality=1
 |
 05:AGGREGATE
 |  group by: date_string_col, timestamp_col, tinyint_col
@@ -981,7 +981,7 @@ PLAN-ROOT SINK
 |  row-size=37B cardinality=10
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    predicates: functional.alltypes.date_string_col = 'test1'
    row-size=37B cardinality=10
 ====
@@ -1002,7 +1002,7 @@ PLAN-ROOT SINK
 |  output: count(tinyint_col), min:merge(string_col), max:merge(string_col)
 |  group by: date_string_col, timestamp_col
 |  having: count(tinyint_col) < 10, date_string_col < timestamp_col
-|  row-size=68B cardinality=3
+|  row-size=68B cardinality=0
 |
 01:AGGREGATE
 |  output: min(string_col), max(string_col)
@@ -1010,7 +1010,7 @@ PLAN-ROOT SINK
 |  row-size=61B cardinality=3
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    predicates: functional.alltypes.timestamp_col > NULL, functional.alltypes.date_string_col = 'test1'
    row-size=50B cardinality=3
 ---- DISTRIBUTEDPLAN
@@ -1029,7 +1029,7 @@ PLAN-ROOT SINK
 02:AGGREGATE [STREAMING]
 |  output: count(tinyint_col), min:merge(string_col), max:merge(string_col)
 |  group by: date_string_col, timestamp_col
-|  row-size=68B cardinality=3
+|  row-size=68B cardinality=0
 |
 05:AGGREGATE
 |  output: min:merge(string_col), max:merge(string_col)
@@ -1044,7 +1044,7 @@ PLAN-ROOT SINK
 |  row-size=61B cardinality=3
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    predicates: functional.alltypes.timestamp_col > NULL, functional.alltypes.date_string_col = 'test1'
    row-size=50B cardinality=3
 ====
@@ -1065,7 +1065,7 @@ PLAN-ROOT SINK
 |  output: count(smallint_col), max:merge(string_col)
 |  group by: date_string_col, timestamp_col
 |  having: count(smallint_col) < 20, date_string_col < timestamp_col
-|  row-size=56B cardinality=3
+|  row-size=56B cardinality=0
 |
 01:AGGREGATE
 |  output: max(string_col)
@@ -1073,7 +1073,7 @@ PLAN-ROOT SINK
 |  row-size=50B cardinality=3
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    predicates: functional.alltypes.timestamp_col > NULL, functional.alltypes.date_string_col = 'test1'
    row-size=51B cardinality=3
 ---- DISTRIBUTEDPLAN
@@ -1092,7 +1092,7 @@ PLAN-ROOT SINK
 02:AGGREGATE [STREAMING]
 |  output: count(smallint_col), max:merge(string_col)
 |  group by: date_string_col, timestamp_col
-|  row-size=56B cardinality=3
+|  row-size=56B cardinality=0
 |
 05:AGGREGATE
 |  output: max:merge(string_col)
@@ -1107,7 +1107,7 @@ PLAN-ROOT SINK
 |  row-size=50B cardinality=3
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    predicates: functional.alltypes.timestamp_col > NULL, functional.alltypes.date_string_col = 'test1'
    row-size=51B cardinality=3
 ====
diff --git a/testdata/workloads/functional-planner/queries/PlannerTest/multiple-distinct-predicates.test b/testdata/workloads/functional-planner/queries/PlannerTest/multiple-distinct-predicates.test
index d9aea35..8cb72f4 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/multiple-distinct-predicates.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/multiple-distinct-predicates.test
@@ -8,8 +8,8 @@ having count(distinct tinyint_col) < 10
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 5, max(string_col))
-|  having: aggif(valid_tid() = 2, count(tinyint_col)) < 10, aggif(valid_tid() = 4, count(smallint_col)) <= 30, aggif(valid_tid() = 4, count(smallint_col)) >= 20, aggif(valid_tid() = 5, max(string_col)) = 'test'
+|  output: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)), aggif(valid_tid(2,4,5) = 4, count(smallint_col)), aggif(valid_tid(2,4,5) = 5, max(string_col))
+|  having: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)) < 10, aggif(valid_tid(2,4,5) = 4, count(smallint_col)) <= 30, aggif(valid_tid(2,4,5) = 4, count(smallint_col)) >= 20, aggif(valid_tid(2,4,5) = 5, max(string_col)) = 'test'
 |  row-size=28B cardinality=0
 |
 02:AGGREGATE [FINALIZE]
@@ -28,17 +28,17 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: max(string_col)
-|  row-size=15B cardinality=31
+|  row-size=15B cardinality=21
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=16B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 5, max(string_col))
-|  having: aggif(valid_tid() = 2, count(tinyint_col)) < 10, aggif(valid_tid() = 4, count(smallint_col)) <= 30, aggif(valid_tid() = 4, count(smallint_col)) >= 20, aggif(valid_tid() = 5, max(string_col)) = 'test'
+|  output: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)), aggif(valid_tid(2,4,5) = 4, count(smallint_col)), aggif(valid_tid(2,4,5) = 5, max(string_col))
+|  having: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)) < 10, aggif(valid_tid(2,4,5) = 4, count(smallint_col)) <= 30, aggif(valid_tid(2,4,5) = 4, count(smallint_col)) >= 20, aggif(valid_tid(2,4,5) = 5, max(string_col)) = 'test'
 |  row-size=28B cardinality=0
 |
 07:AGGREGATE [FINALIZE]
@@ -68,9 +68,9 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: max:merge(string_col)
-|  row-size=15B cardinality=31
+|  row-size=15B cardinality=21
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(smallint_col) WHEN 5 THEN 0 END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(smallint_col) WHEN 5 THEN 0 END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -79,10 +79,10 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: max(string_col)
-|  row-size=15B cardinality=31
+|  row-size=15B cardinality=21
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=16B cardinality=7.30K
 ====
 # HAVING predicate references multiple aggregates. No group by.
@@ -93,8 +93,8 @@ having count(distinct tinyint_col) < count(distinct smallint_col)
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 5, max(string_col))
-|  having: aggif(valid_tid() = 2, count(tinyint_col)) < aggif(valid_tid() = 4, count(smallint_col))
+|  output: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)), aggif(valid_tid(2,4,5) = 4, count(smallint_col)), aggif(valid_tid(2,4,5) = 5, max(string_col))
+|  having: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)) < aggif(valid_tid(2,4,5) = 4, count(smallint_col))
 |  row-size=28B cardinality=0
 |
 02:AGGREGATE [FINALIZE]
@@ -113,17 +113,17 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: max(string_col)
-|  row-size=15B cardinality=31
+|  row-size=15B cardinality=21
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=16B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 5, max(string_col))
-|  having: aggif(valid_tid() = 2, count(tinyint_col)) < aggif(valid_tid() = 4, count(smallint_col))
+|  output: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)), aggif(valid_tid(2,4,5) = 4, count(smallint_col)), aggif(valid_tid(2,4,5) = 5, max(string_col))
+|  having: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)) < aggif(valid_tid(2,4,5) = 4, count(smallint_col))
 |  row-size=28B cardinality=0
 |
 07:AGGREGATE [FINALIZE]
@@ -153,9 +153,9 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: max:merge(string_col)
-|  row-size=15B cardinality=31
+|  row-size=15B cardinality=21
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(smallint_col) WHEN 5 THEN 0 END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(smallint_col) WHEN 5 THEN 0 END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -164,10 +164,10 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: max(string_col)
-|  row-size=15B cardinality=31
+|  row-size=15B cardinality=21
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=16B cardinality=7.30K
 ====
 # Predicates assigned through inline view. No group by.
@@ -179,8 +179,8 @@ where a < b and b between 20 and 30 and c = 'test'
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 5, max(string_col))
-|  having: aggif(valid_tid() = 2, count(tinyint_col)) < aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 4, count(smallint_col)) <= 30, aggif(valid_tid() = 4, count(smallint_col)) >= 20, aggif(valid_tid() = 5, max(string_col)) = 'test'
+|  output: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)), aggif(valid_tid(2,4,5) = 4, count(smallint_col)), aggif(valid_tid(2,4,5) = 5, max(string_col))
+|  having: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)) < aggif(valid_tid(2,4,5) = 4, count(smallint_col)), aggif(valid_tid(2,4,5) = 4, count(smallint_col)) <= 30, aggif(valid_tid(2,4,5) = 4, count(smallint_col)) >= 20, aggif(valid_tid(2,4,5) = 5, max(string_col)) = 'test'
 |  row-size=28B cardinality=0
 |
 02:AGGREGATE [FINALIZE]
@@ -199,17 +199,17 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: max(string_col)
-|  row-size=15B cardinality=31
+|  row-size=15B cardinality=21
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=16B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 5, max(string_col))
-|  having: aggif(valid_tid() = 2, count(tinyint_col)) < aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 4, count(smallint_col)) <= 30, aggif(valid_tid() = 4, count(smallint_col)) >= 20, aggif(valid_tid() = 5, max(string_col)) = 'test'
+|  output: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)), aggif(valid_tid(2,4,5) = 4, count(smallint_col)), aggif(valid_tid(2,4,5) = 5, max(string_col))
+|  having: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)) < aggif(valid_tid(2,4,5) = 4, count(smallint_col)), aggif(valid_tid(2,4,5) = 4, count(smallint_col)) <= 30, aggif(valid_tid(2,4,5) = 4, count(smallint_col)) >= 20, aggif(valid_tid(2,4,5) = 5, max(string_col)) = 'test'
 |  row-size=28B cardinality=0
 |
 07:AGGREGATE [FINALIZE]
@@ -239,9 +239,9 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: max:merge(string_col)
-|  row-size=15B cardinality=31
+|  row-size=15B cardinality=21
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(smallint_col) WHEN 5 THEN 0 END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(smallint_col) WHEN 5 THEN 0 END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -250,10 +250,10 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: max(string_col)
-|  row-size=15B cardinality=31
+|  row-size=15B cardinality=21
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=16B cardinality=7.30K
 ====
 # Predicates assigned through inline view. No group by.
@@ -265,8 +265,8 @@ where a < b and b between 20 and 30 and c = 'test'
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 5, max(string_col))
-|  having: aggif(valid_tid() = 2, count(tinyint_col)) < aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 4, count(smallint_col)) <= 30, aggif(valid_tid() = 4, count(smallint_col)) >= 20, aggif(valid_tid() = 5, max(string_col)) = 'test'
+|  output: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)), aggif(valid_tid(2,4,5) = 4, count(smallint_col)), aggif(valid_tid(2,4,5) = 5, max(string_col))
+|  having: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)) < aggif(valid_tid(2,4,5) = 4, count(smallint_col)), aggif(valid_tid(2,4,5) = 4, count(smallint_col)) <= 30, aggif(valid_tid(2,4,5) = 4, count(smallint_col)) >= 20, aggif(valid_tid(2,4,5) = 5, max(string_col)) = 'test'
 |  row-size=28B cardinality=0
 |
 02:AGGREGATE [FINALIZE]
@@ -285,17 +285,17 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: max(string_col)
-|  row-size=15B cardinality=31
+|  row-size=15B cardinality=21
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=16B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 5, max(string_col))
-|  having: aggif(valid_tid() = 2, count(tinyint_col)) < aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 4, count(smallint_col)) <= 30, aggif(valid_tid() = 4, count(smallint_col)) >= 20, aggif(valid_tid() = 5, max(string_col)) = 'test'
+|  output: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)), aggif(valid_tid(2,4,5) = 4, count(smallint_col)), aggif(valid_tid(2,4,5) = 5, max(string_col))
+|  having: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)) < aggif(valid_tid(2,4,5) = 4, count(smallint_col)), aggif(valid_tid(2,4,5) = 4, count(smallint_col)) <= 30, aggif(valid_tid(2,4,5) = 4, count(smallint_col)) >= 20, aggif(valid_tid(2,4,5) = 5, max(string_col)) = 'test'
 |  row-size=28B cardinality=0
 |
 07:AGGREGATE [FINALIZE]
@@ -325,9 +325,9 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: max:merge(string_col)
-|  row-size=15B cardinality=31
+|  row-size=15B cardinality=21
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(smallint_col) WHEN 5 THEN 0 END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(smallint_col) WHEN 5 THEN 0 END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -336,10 +336,10 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: max(string_col)
-|  row-size=15B cardinality=31
+|  row-size=15B cardinality=21
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=16B cardinality=7.30K
 ====
 # HAVING predicate assignment. With group by.
@@ -354,10 +354,10 @@ having count(distinct tinyint_col) < 10
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 5, max(string_col))
-|  group by: CASE valid_tid() WHEN 2 THEN date_string_col WHEN 4 THEN date_string_col WHEN 5 THEN date_string_col END, CASE valid_tid() WHEN 2 THEN timestamp_col WHEN 4 THEN timestamp_col WHEN 5 THEN timestamp_col END
-|  having: aggif(valid_tid() = 2, count(tinyint_col)) < 10, CAST(CASE valid_tid() WHEN 2 THEN timestamp_col WHEN 4 THEN timestamp_col WHEN 5 THEN timestamp_col END AS BIGINT) = aggif(valid_tid() = 2, count(tinyint_col)), CAST(CASE valid_tid() WHEN 2 THEN timestamp_col WHEN 4 THEN timestamp_col WHEN 5 THEN timestamp_col END AS STRING) < CASE valid_tid() WHEN 2 THEN date_string_col WHEN 4 THEN date_string_col WHEN 5 THEN date_string_col END
-|  row-size=56B cardinality=730
+|  output: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)), aggif(valid_tid(2,4,5) = 4, count(smallint_col)), aggif(valid_tid(2,4,5) = 5, max(string_col))
+|  group by: CASE valid_tid(2,4,5) WHEN 2 THEN date_string_col WHEN 4 THEN date_string_col WHEN 5 THEN date_string_col END, CASE valid_tid(2,4,5) WHEN 2 THEN timestamp_col WHEN 4 THEN timestamp_col WHEN 5 THEN timestamp_col END
+|  having: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)) < 10, CAST(CASE valid_tid(2,4,5) WHEN 2 THEN timestamp_col WHEN 4 THEN timestamp_col WHEN 5 THEN timestamp_col END AS BIGINT) = aggif(valid_tid(2,4,5) = 2, count(tinyint_col)), CAST(CASE valid_tid(2,4,5) WHEN 2 THEN timestamp_col WHEN 4 THEN timestamp_col WHEN 5 THEN timestamp_col END AS STRING) < CASE valid_tid(2,4,5) WHEN 2 THEN date_string_col WHEN 4 THEN date_string_col WHEN 5 THEN date_string_col END
+|  row-size=56B cardinality=657
 |
 02:AGGREGATE [FINALIZE]
 |  Class 0
@@ -369,7 +369,7 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: max:merge(string_col)
 |    group by: date_string_col, timestamp_col
-|  row-size=136B cardinality=730
+|  row-size=136B cardinality=6.57K
 |
 01:AGGREGATE
 |  Class 0
@@ -379,10 +379,10 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: max(string_col)
 |    group by: date_string_col, timestamp_col
-|  row-size=123B cardinality=730
+|  row-size=123B cardinality=2.19K
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    predicates: functional.alltypes.date_string_col <= 'test2', functional.alltypes.date_string_col >= 'test1', CAST(functional.alltypes.timestamp_col AS STRING) < functional.alltypes.date_string_col
    row-size=52B cardinality=730
 ---- DISTRIBUTEDPLAN
@@ -391,10 +391,10 @@ PLAN-ROOT SINK
 08:EXCHANGE [UNPARTITIONED]
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 5, max(string_col))
-|  group by: CASE valid_tid() WHEN 2 THEN date_string_col WHEN 4 THEN date_string_col WHEN 5 THEN date_string_col END, CASE valid_tid() WHEN 2 THEN timestamp_col WHEN 4 THEN timestamp_col WHEN 5 THEN timestamp_col END
-|  having: aggif(valid_tid() = 2, count(tinyint_col)) < 10, CAST(CASE valid_tid() WHEN 2 THEN timestamp_col WHEN 4 THEN timestamp_col WHEN 5 THEN timestamp_col END AS BIGINT) = aggif(valid_tid() = 2, count(tinyint_col)), CAST(CASE valid_tid() WHEN 2 THEN timestamp_col WHEN 4 THEN timestamp_col WHEN 5 THEN timestamp_col END AS STRING) < CASE valid_tid() WHEN 2 THEN date_string_col WHEN 4 THEN date_string_col WHEN 5 THEN date_string_col END
-|  row-size=56B cardinality=730
+|  output: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)), aggif(valid_tid(2,4,5) = 4, count(smallint_col)), aggif(valid_tid(2,4,5) = 5, max(string_col))
+|  group by: CASE valid_tid(2,4,5) WHEN 2 THEN date_string_col WHEN 4 THEN date_string_col WHEN 5 THEN date_string_col END, CASE valid_tid(2,4,5) WHEN 2 THEN timestamp_col WHEN 4 THEN timestamp_col WHEN 5 THEN timestamp_col END
+|  having: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)) < 10, CAST(CASE valid_tid(2,4,5) WHEN 2 THEN timestamp_col WHEN 4 THEN timestamp_col WHEN 5 THEN timestamp_col END AS BIGINT) = aggif(valid_tid(2,4,5) = 2, count(tinyint_col)), CAST(CASE valid_tid(2,4,5) WHEN 2 THEN timestamp_col WHEN 4 THEN timestamp_col WHEN 5 THEN timestamp_col END AS STRING) < CASE valid_tid(2,4,5) WHEN 2 THEN date_string_col WHEN 4 THEN date_string_col WHEN 5 THEN date_string_col END
+|  row-size=56B cardinality=657
 |
 07:AGGREGATE [FINALIZE]
 |  Class 0
@@ -406,9 +406,9 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: max:merge(string_col)
 |    group by: date_string_col, timestamp_col
-|  row-size=136B cardinality=730
+|  row-size=136B cardinality=6.57K
 |
-06:EXCHANGE [HASH(CASE valid_tid() WHEN 2 THEN murmur_hash(date_string_col) WHEN 4 THEN murmur_hash(date_string_col) WHEN 5 THEN murmur_hash(date_string_col) END,CASE valid_tid() WHEN 2 THEN murmur_hash(timestamp_col) WHEN 4 THEN murmur_hash(timestamp_col) WHEN 5 THEN murmur_hash(timestamp_col) END)]
+06:EXCHANGE [HASH(CASE valid_tid(2,4,5) WHEN 2 THEN murmur_hash(date_string_col) WHEN 4 THEN murmur_hash(date_string_col) WHEN 5 THEN murmur_hash(date_string_col) END,CASE valid_tid(2,4,5) WHEN 2 THEN murmur_hash(timestamp_col) WHEN 4 THEN murmur_hash(timestamp_col) WHEN 5 THEN murmur_hash(timestamp_col) END)]
 |
 02:AGGREGATE [STREAMING]
 |  Class 0
@@ -420,7 +420,7 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: max:merge(string_col)
 |    group by: date_string_col, timestamp_col
-|  row-size=136B cardinality=730
+|  row-size=136B cardinality=6.57K
 |
 05:AGGREGATE
 |  Class 0
@@ -430,9 +430,9 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: max:merge(string_col)
 |    group by: date_string_col, timestamp_col
-|  row-size=123B cardinality=730
+|  row-size=123B cardinality=2.19K
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(date_string_col) WHEN 3 THEN murmur_hash(date_string_col) WHEN 5 THEN murmur_hash(date_string_col) END,CASE valid_tid() WHEN 1 THEN murmur_hash(timestamp_col) WHEN 3 THEN murmur_hash(timestamp_col) WHEN 5 THEN murmur_hash(timestamp_col) END,CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(smallint_col) WHEN 5 THEN 0 END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(date_string_col) WHEN 3 THEN murmur_hash(date_string_col) WHEN 5 THEN murmur_hash(date_string_col) END,CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(timestamp_col) WHEN 3 THEN murmur_hash(timestamp_col) WHEN 5 THEN murmur_hash(timestamp_col) END,CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(smallint_col) WHEN 5 THEN 0 END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -442,10 +442,10 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: max(string_col)
 |    group by: date_string_col, timestamp_col
-|  row-size=123B cardinality=730
+|  row-size=123B cardinality=2.19K
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    predicates: functional.alltypes.date_string_col <= 'test2', functional.alltypes.date_string_col >= 'test1', CAST(functional.alltypes.timestamp_col AS STRING) < functional.alltypes.date_string_col
    row-size=52B cardinality=730
 ====
@@ -461,10 +461,10 @@ where a < 10 and gby1 between 'test1' and 'test2' and cast(gby2 as string) < gby
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 5, max(string_col))
-|  group by: CASE valid_tid() WHEN 2 THEN date_string_col WHEN 4 THEN date_string_col WHEN 5 THEN date_string_col END, CASE valid_tid() WHEN 2 THEN timestamp_col WHEN 4 THEN timestamp_col WHEN 5 THEN timestamp_col END
-|  having: aggif(valid_tid() = 2, count(tinyint_col)) < 10, CAST(CASE valid_tid() WHEN 2 THEN timestamp_col WHEN 4 THEN timestamp_col WHEN 5 THEN timestamp_col END AS BIGINT) = aggif(valid_tid() = 2, count(tinyint_col)), CAST(CASE valid_tid() WHEN 2 THEN timestamp_col WHEN 4 THEN timestamp_col WHEN 5 THEN timestamp_col END AS STRING) < CASE valid_tid() WHEN 2 THEN date_string_col WHEN 4 THEN date_string_col WHEN 5 THEN date_string_col END
-|  row-size=56B cardinality=730
+|  output: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)), aggif(valid_tid(2,4,5) = 4, count(smallint_col)), aggif(valid_tid(2,4,5) = 5, max(string_col))
+|  group by: CASE valid_tid(2,4,5) WHEN 2 THEN date_string_col WHEN 4 THEN date_string_col WHEN 5 THEN date_string_col END, CASE valid_tid(2,4,5) WHEN 2 THEN timestamp_col WHEN 4 THEN timestamp_col WHEN 5 THEN timestamp_col END
+|  having: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)) < 10, CAST(CASE valid_tid(2,4,5) WHEN 2 THEN timestamp_col WHEN 4 THEN timestamp_col WHEN 5 THEN timestamp_col END AS BIGINT) = aggif(valid_tid(2,4,5) = 2, count(tinyint_col)), CAST(CASE valid_tid(2,4,5) WHEN 2 THEN timestamp_col WHEN 4 THEN timestamp_col WHEN 5 THEN timestamp_col END AS STRING) < CASE valid_tid(2,4,5) WHEN 2 THEN date_string_col WHEN 4 THEN date_string_col WHEN 5 THEN date_string_col END
+|  row-size=56B cardinality=657
 |
 02:AGGREGATE [FINALIZE]
 |  Class 0
@@ -476,7 +476,7 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: max:merge(string_col)
 |    group by: date_string_col, timestamp_col
-|  row-size=136B cardinality=730
+|  row-size=136B cardinality=6.57K
 |
 01:AGGREGATE
 |  Class 0
@@ -486,10 +486,10 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: max(string_col)
 |    group by: date_string_col, timestamp_col
-|  row-size=123B cardinality=730
+|  row-size=123B cardinality=2.19K
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    predicates: functional.alltypes.date_string_col <= 'test2', functional.alltypes.date_string_col >= 'test1', CAST(functional.alltypes.timestamp_col AS STRING) < functional.alltypes.date_string_col
    row-size=52B cardinality=730
 ---- DISTRIBUTEDPLAN
@@ -498,10 +498,10 @@ PLAN-ROOT SINK
 08:EXCHANGE [UNPARTITIONED]
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 5, max(string_col))
-|  group by: CASE valid_tid() WHEN 2 THEN date_string_col WHEN 4 THEN date_string_col WHEN 5 THEN date_string_col END, CASE valid_tid() WHEN 2 THEN timestamp_col WHEN 4 THEN timestamp_col WHEN 5 THEN timestamp_col END
-|  having: aggif(valid_tid() = 2, count(tinyint_col)) < 10, CAST(CASE valid_tid() WHEN 2 THEN timestamp_col WHEN 4 THEN timestamp_col WHEN 5 THEN timestamp_col END AS BIGINT) = aggif(valid_tid() = 2, count(tinyint_col)), CAST(CASE valid_tid() WHEN 2 THEN timestamp_col WHEN 4 THEN timestamp_col WHEN 5 THEN timestamp_col END AS STRING) < CASE valid_tid() WHEN 2 THEN date_string_col WHEN 4 THEN date_string_col WHEN 5 THEN date_string_col END
-|  row-size=56B cardinality=730
+|  output: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)), aggif(valid_tid(2,4,5) = 4, count(smallint_col)), aggif(valid_tid(2,4,5) = 5, max(string_col))
+|  group by: CASE valid_tid(2,4,5) WHEN 2 THEN date_string_col WHEN 4 THEN date_string_col WHEN 5 THEN date_string_col END, CASE valid_tid(2,4,5) WHEN 2 THEN timestamp_col WHEN 4 THEN timestamp_col WHEN 5 THEN timestamp_col END
+|  having: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)) < 10, CAST(CASE valid_tid(2,4,5) WHEN 2 THEN timestamp_col WHEN 4 THEN timestamp_col WHEN 5 THEN timestamp_col END AS BIGINT) = aggif(valid_tid(2,4,5) = 2, count(tinyint_col)), CAST(CASE valid_tid(2,4,5) WHEN 2 THEN timestamp_col WHEN 4 THEN timestamp_col WHEN 5 THEN timestamp_col END AS STRING) < CASE valid_tid(2,4,5) WHEN 2 THEN date_string_col WHEN 4 THEN date_string_col WHEN 5 THEN date_string_col END
+|  row-size=56B cardinality=657
 |
 07:AGGREGATE [FINALIZE]
 |  Class 0
@@ -513,9 +513,9 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: max:merge(string_col)
 |    group by: date_string_col, timestamp_col
-|  row-size=136B cardinality=730
+|  row-size=136B cardinality=6.57K
 |
-06:EXCHANGE [HASH(CASE valid_tid() WHEN 2 THEN murmur_hash(date_string_col) WHEN 4 THEN murmur_hash(date_string_col) WHEN 5 THEN murmur_hash(date_string_col) END,CASE valid_tid() WHEN 2 THEN murmur_hash(timestamp_col) WHEN 4 THEN murmur_hash(timestamp_col) WHEN 5 THEN murmur_hash(timestamp_col) END)]
+06:EXCHANGE [HASH(CASE valid_tid(2,4,5) WHEN 2 THEN murmur_hash(date_string_col) WHEN 4 THEN murmur_hash(date_string_col) WHEN 5 THEN murmur_hash(date_string_col) END,CASE valid_tid(2,4,5) WHEN 2 THEN murmur_hash(timestamp_col) WHEN 4 THEN murmur_hash(timestamp_col) WHEN 5 THEN murmur_hash(timestamp_col) END)]
 |
 02:AGGREGATE [STREAMING]
 |  Class 0
@@ -527,7 +527,7 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: max:merge(string_col)
 |    group by: date_string_col, timestamp_col
-|  row-size=136B cardinality=730
+|  row-size=136B cardinality=6.57K
 |
 05:AGGREGATE
 |  Class 0
@@ -537,9 +537,9 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: max:merge(string_col)
 |    group by: date_string_col, timestamp_col
-|  row-size=123B cardinality=730
+|  row-size=123B cardinality=2.19K
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(date_string_col) WHEN 3 THEN murmur_hash(date_string_col) WHEN 5 THEN murmur_hash(date_string_col) END,CASE valid_tid() WHEN 1 THEN murmur_hash(timestamp_col) WHEN 3 THEN murmur_hash(timestamp_col) WHEN 5 THEN murmur_hash(timestamp_col) END,CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(smallint_col) WHEN 5 THEN 0 END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(date_string_col) WHEN 3 THEN murmur_hash(date_string_col) WHEN 5 THEN murmur_hash(date_string_col) END,CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(timestamp_col) WHEN 3 THEN murmur_hash(timestamp_col) WHEN 5 THEN murmur_hash(timestamp_col) END,CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(smallint_col) WHEN 5 THEN 0 END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -549,10 +549,10 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: max(string_col)
 |    group by: date_string_col, timestamp_col
-|  row-size=123B cardinality=730
+|  row-size=123B cardinality=2.19K
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    predicates: functional.alltypes.date_string_col <= 'test2', functional.alltypes.date_string_col >= 'test1', CAST(functional.alltypes.timestamp_col AS STRING) < functional.alltypes.date_string_col
    row-size=52B cardinality=730
 ====
diff --git a/testdata/workloads/functional-planner/queries/PlannerTest/multiple-distinct.test b/testdata/workloads/functional-planner/queries/PlannerTest/multiple-distinct.test
index 026840f..b95b1f2 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/multiple-distinct.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/multiple-distinct.test
@@ -5,7 +5,7 @@ from functional.alltypes
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, sum(int_col)), aggif(valid_tid() = 6, count(smallint_col))
+|  output: aggif(valid_tid(2,4,6) = 2, count(tinyint_col)), aggif(valid_tid(2,4,6) = 4, sum(int_col)), aggif(valid_tid(2,4,6) = 6, count(smallint_col))
 |  row-size=24B cardinality=1
 |
 02:AGGREGATE [FINALIZE]
@@ -24,16 +24,16 @@ PLAN-ROOT SINK
 |    group by: int_col
 |  Class 2
 |    group by: smallint_col
-|  row-size=7B cardinality=70
+|  row-size=7B cardinality=30
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=7B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, sum(int_col)), aggif(valid_tid() = 6, count(smallint_col))
+|  output: aggif(valid_tid(2,4,6) = 2, count(tinyint_col)), aggif(valid_tid(2,4,6) = 4, sum(int_col)), aggif(valid_tid(2,4,6) = 6, count(smallint_col))
 |  row-size=24B cardinality=1
 |
 07:AGGREGATE [FINALIZE]
@@ -63,9 +63,9 @@ PLAN-ROOT SINK
 |    group by: int_col
 |  Class 2
 |    group by: smallint_col
-|  row-size=7B cardinality=70
+|  row-size=7B cardinality=30
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(int_col) WHEN 5 THEN murmur_hash(smallint_col) END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(int_col) WHEN 5 THEN murmur_hash(smallint_col) END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -74,10 +74,10 @@ PLAN-ROOT SINK
 |    group by: int_col
 |  Class 2
 |    group by: smallint_col
-|  row-size=7B cardinality=70
+|  row-size=7B cardinality=30
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=7B cardinality=7.30K
 ====
 # Multiple distinct without grouping. First needs intermediate tuple.
@@ -87,7 +87,7 @@ from functional.alltypes
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 3, avg(tinyint_col)), aggif(valid_tid() = 5, sum(int_col)), aggif(valid_tid() = 7, count(smallint_col))
+|  output: aggif(valid_tid(3,5,7) = 3, avg(tinyint_col)), aggif(valid_tid(3,5,7) = 5, sum(int_col)), aggif(valid_tid(3,5,7) = 7, count(smallint_col))
 |  row-size=24B cardinality=1
 |
 02:AGGREGATE [FINALIZE]
@@ -106,16 +106,16 @@ PLAN-ROOT SINK
 |    group by: int_col
 |  Class 2
 |    group by: smallint_col
-|  row-size=7B cardinality=70
+|  row-size=7B cardinality=30
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=7B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 3, avg(tinyint_col)), aggif(valid_tid() = 5, sum(int_col)), aggif(valid_tid() = 7, count(smallint_col))
+|  output: aggif(valid_tid(3,5,7) = 3, avg(tinyint_col)), aggif(valid_tid(3,5,7) = 5, sum(int_col)), aggif(valid_tid(3,5,7) = 7, count(smallint_col))
 |  row-size=24B cardinality=1
 |
 07:AGGREGATE [FINALIZE]
@@ -145,9 +145,9 @@ PLAN-ROOT SINK
 |    group by: int_col
 |  Class 2
 |    group by: smallint_col
-|  row-size=7B cardinality=70
+|  row-size=7B cardinality=30
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 4 THEN murmur_hash(int_col) WHEN 6 THEN murmur_hash(smallint_col) END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,4,6) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 4 THEN murmur_hash(int_col) WHEN 6 THEN murmur_hash(smallint_col) END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -156,10 +156,10 @@ PLAN-ROOT SINK
 |    group by: int_col
 |  Class 2
 |    group by: smallint_col
-|  row-size=7B cardinality=70
+|  row-size=7B cardinality=30
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=7B cardinality=7.30K
 ====
 # Multiple distinct without grouping. Last needs intermediate tuple.
@@ -169,7 +169,7 @@ from functional.alltypes
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, sum(int_col)), aggif(valid_tid() = 7, avg(smallint_col))
+|  output: aggif(valid_tid(2,4,7) = 2, count(tinyint_col)), aggif(valid_tid(2,4,7) = 4, sum(int_col)), aggif(valid_tid(2,4,7) = 7, avg(smallint_col))
 |  row-size=24B cardinality=1
 |
 02:AGGREGATE [FINALIZE]
@@ -188,16 +188,16 @@ PLAN-ROOT SINK
 |    group by: int_col
 |  Class 2
 |    group by: smallint_col
-|  row-size=7B cardinality=70
+|  row-size=7B cardinality=30
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=7B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, sum(int_col)), aggif(valid_tid() = 7, avg(smallint_col))
+|  output: aggif(valid_tid(2,4,7) = 2, count(tinyint_col)), aggif(valid_tid(2,4,7) = 4, sum(int_col)), aggif(valid_tid(2,4,7) = 7, avg(smallint_col))
 |  row-size=24B cardinality=1
 |
 07:AGGREGATE [FINALIZE]
@@ -227,9 +227,9 @@ PLAN-ROOT SINK
 |    group by: int_col
 |  Class 2
 |    group by: smallint_col
-|  row-size=7B cardinality=70
+|  row-size=7B cardinality=30
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(int_col) WHEN 5 THEN murmur_hash(smallint_col) END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(int_col) WHEN 5 THEN murmur_hash(smallint_col) END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -238,10 +238,10 @@ PLAN-ROOT SINK
 |    group by: int_col
 |  Class 2
 |    group by: smallint_col
-|  row-size=7B cardinality=70
+|  row-size=7B cardinality=30
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=7B cardinality=7.30K
 ====
 # Multiple distinct without grouping. All need intermediate tuples
@@ -251,7 +251,7 @@ from functional.alltypes
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 3, avg(tinyint_col)), aggif(valid_tid() = 6, avg(int_col)), aggif(valid_tid() = 9, avg(smallint_col))
+|  output: aggif(valid_tid(3,6,9) = 3, avg(tinyint_col)), aggif(valid_tid(3,6,9) = 6, avg(int_col)), aggif(valid_tid(3,6,9) = 9, avg(smallint_col))
 |  row-size=24B cardinality=1
 |
 02:AGGREGATE [FINALIZE]
@@ -270,16 +270,16 @@ PLAN-ROOT SINK
 |    group by: int_col
 |  Class 2
 |    group by: smallint_col
-|  row-size=7B cardinality=70
+|  row-size=7B cardinality=30
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=7B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 3, avg(tinyint_col)), aggif(valid_tid() = 6, avg(int_col)), aggif(valid_tid() = 9, avg(smallint_col))
+|  output: aggif(valid_tid(3,6,9) = 3, avg(tinyint_col)), aggif(valid_tid(3,6,9) = 6, avg(int_col)), aggif(valid_tid(3,6,9) = 9, avg(smallint_col))
 |  row-size=24B cardinality=1
 |
 07:AGGREGATE [FINALIZE]
@@ -309,9 +309,9 @@ PLAN-ROOT SINK
 |    group by: int_col
 |  Class 2
 |    group by: smallint_col
-|  row-size=7B cardinality=70
+|  row-size=7B cardinality=30
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 4 THEN murmur_hash(int_col) WHEN 7 THEN murmur_hash(smallint_col) END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,4,7) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 4 THEN murmur_hash(int_col) WHEN 7 THEN murmur_hash(smallint_col) END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -320,10 +320,10 @@ PLAN-ROOT SINK
 |    group by: int_col
 |  Class 2
 |    group by: smallint_col
-|  row-size=7B cardinality=70
+|  row-size=7B cardinality=30
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=7B cardinality=7.30K
 ====
 # Multiple distinct with grouping.
@@ -334,8 +334,8 @@ from functional.alltypes group by bigint_col
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, sum(int_col)), aggif(valid_tid() = 6, count(smallint_col))
-|  group by: CASE valid_tid() WHEN 2 THEN bigint_col WHEN 4 THEN bigint_col WHEN 6 THEN bigint_col END
+|  output: aggif(valid_tid(2,4,6) = 2, count(tinyint_col)), aggif(valid_tid(2,4,6) = 4, sum(int_col)), aggif(valid_tid(2,4,6) = 6, count(smallint_col))
+|  group by: CASE valid_tid(2,4,6) WHEN 2 THEN bigint_col WHEN 4 THEN bigint_col WHEN 6 THEN bigint_col END
 |  row-size=32B cardinality=11
 |
 02:AGGREGATE [FINALIZE]
@@ -348,7 +348,7 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: count(smallint_col)
 |    group by: bigint_col
-|  row-size=48B cardinality=70
+|  row-size=48B cardinality=30
 |
 01:AGGREGATE
 |  Class 0
@@ -357,10 +357,10 @@ PLAN-ROOT SINK
 |    group by: bigint_col, int_col
 |  Class 2
 |    group by: bigint_col, smallint_col
-|  row-size=31B cardinality=700
+|  row-size=31B cardinality=300
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=15B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -368,8 +368,8 @@ PLAN-ROOT SINK
 08:EXCHANGE [UNPARTITIONED]
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, sum(int_col)), aggif(valid_tid() = 6, count(smallint_col))
-|  group by: CASE valid_tid() WHEN 2 THEN bigint_col WHEN 4 THEN bigint_col WHEN 6 THEN bigint_col END
+|  output: aggif(valid_tid(2,4,6) = 2, count(tinyint_col)), aggif(valid_tid(2,4,6) = 4, sum(int_col)), aggif(valid_tid(2,4,6) = 6, count(smallint_col))
+|  group by: CASE valid_tid(2,4,6) WHEN 2 THEN bigint_col WHEN 4 THEN bigint_col WHEN 6 THEN bigint_col END
 |  row-size=32B cardinality=11
 |
 07:AGGREGATE [FINALIZE]
@@ -382,9 +382,9 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: count:merge(smallint_col)
 |    group by: bigint_col
-|  row-size=48B cardinality=70
+|  row-size=48B cardinality=30
 |
-06:EXCHANGE [HASH(CASE valid_tid() WHEN 2 THEN murmur_hash(bigint_col) WHEN 4 THEN murmur_hash(bigint_col) WHEN 6 THEN murmur_hash(bigint_col) END)]
+06:EXCHANGE [HASH(CASE valid_tid(2,4,6) WHEN 2 THEN murmur_hash(bigint_col) WHEN 4 THEN murmur_hash(bigint_col) WHEN 6 THEN murmur_hash(bigint_col) END)]
 |
 02:AGGREGATE [STREAMING]
 |  Class 0
@@ -396,7 +396,7 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: count(smallint_col)
 |    group by: bigint_col
-|  row-size=48B cardinality=70
+|  row-size=48B cardinality=30
 |
 05:AGGREGATE
 |  Class 0
@@ -405,9 +405,9 @@ PLAN-ROOT SINK
 |    group by: bigint_col, int_col
 |  Class 2
 |    group by: bigint_col, smallint_col
-|  row-size=31B cardinality=700
+|  row-size=31B cardinality=300
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(bigint_col) WHEN 3 THEN murmur_hash(bigint_col) WHEN 5 THEN murmur_hash(bigint_col) END,CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(int_col) WHEN 5 THEN murmur_hash(smallint_col) END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(bigint_col) WHEN 3 THEN murmur_hash(bigint_col) WHEN 5 THEN murmur_hash(bigint_col) END,CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(int_col) WHEN 5 THEN murmur_hash(smallint_col) END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -416,10 +416,10 @@ PLAN-ROOT SINK
 |    group by: bigint_col, int_col
 |  Class 2
 |    group by: bigint_col, smallint_col
-|  row-size=31B cardinality=700
+|  row-size=31B cardinality=300
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=15B cardinality=7.30K
 ====
 # Multiple distinct with grouping. First needs intermediate tuple.
@@ -430,8 +430,8 @@ from functional.alltypes group by bigint_col
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 3, avg(tinyint_col)), aggif(valid_tid() = 5, sum(int_col)), aggif(valid_tid() = 7, count(smallint_col))
-|  group by: CASE valid_tid() WHEN 3 THEN bigint_col WHEN 5 THEN bigint_col WHEN 7 THEN bigint_col END
+|  output: aggif(valid_tid(3,5,7) = 3, avg(tinyint_col)), aggif(valid_tid(3,5,7) = 5, sum(int_col)), aggif(valid_tid(3,5,7) = 7, count(smallint_col))
+|  group by: CASE valid_tid(3,5,7) WHEN 3 THEN bigint_col WHEN 5 THEN bigint_col WHEN 7 THEN bigint_col END
 |  row-size=32B cardinality=11
 |
 02:AGGREGATE [FINALIZE]
@@ -444,7 +444,7 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: count(smallint_col)
 |    group by: bigint_col
-|  row-size=48B cardinality=70
+|  row-size=48B cardinality=30
 |
 01:AGGREGATE
 |  Class 0
@@ -453,10 +453,10 @@ PLAN-ROOT SINK
 |    group by: bigint_col, int_col
 |  Class 2
 |    group by: bigint_col, smallint_col
-|  row-size=31B cardinality=700
+|  row-size=31B cardinality=300
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=15B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -464,8 +464,8 @@ PLAN-ROOT SINK
 08:EXCHANGE [UNPARTITIONED]
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 3, avg(tinyint_col)), aggif(valid_tid() = 5, sum(int_col)), aggif(valid_tid() = 7, count(smallint_col))
-|  group by: CASE valid_tid() WHEN 3 THEN bigint_col WHEN 5 THEN bigint_col WHEN 7 THEN bigint_col END
+|  output: aggif(valid_tid(3,5,7) = 3, avg(tinyint_col)), aggif(valid_tid(3,5,7) = 5, sum(int_col)), aggif(valid_tid(3,5,7) = 7, count(smallint_col))
+|  group by: CASE valid_tid(3,5,7) WHEN 3 THEN bigint_col WHEN 5 THEN bigint_col WHEN 7 THEN bigint_col END
 |  row-size=32B cardinality=11
 |
 07:AGGREGATE [FINALIZE]
@@ -478,9 +478,9 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: count:merge(smallint_col)
 |    group by: bigint_col
-|  row-size=48B cardinality=70
+|  row-size=48B cardinality=30
 |
-06:EXCHANGE [HASH(CASE valid_tid() WHEN 2 THEN murmur_hash(bigint_col) WHEN 5 THEN murmur_hash(bigint_col) WHEN 7 THEN murmur_hash(bigint_col) END)]
+06:EXCHANGE [HASH(CASE valid_tid(2,5,7) WHEN 2 THEN murmur_hash(bigint_col) WHEN 5 THEN murmur_hash(bigint_col) WHEN 7 THEN murmur_hash(bigint_col) END)]
 |
 02:AGGREGATE [STREAMING]
 |  Class 0
@@ -492,7 +492,7 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: count(smallint_col)
 |    group by: bigint_col
-|  row-size=48B cardinality=70
+|  row-size=48B cardinality=30
 |
 05:AGGREGATE
 |  Class 0
@@ -501,9 +501,9 @@ PLAN-ROOT SINK
 |    group by: bigint_col, int_col
 |  Class 2
 |    group by: bigint_col, smallint_col
-|  row-size=31B cardinality=700
+|  row-size=31B cardinality=300
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(bigint_col) WHEN 4 THEN murmur_hash(bigint_col) WHEN 6 THEN murmur_hash(bigint_col) END,CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 4 THEN murmur_hash(int_col) WHEN 6 THEN murmur_hash(smallint_col) END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,4,6) WHEN 1 THEN murmur_hash(bigint_col) WHEN 4 THEN murmur_hash(bigint_col) WHEN 6 THEN murmur_hash(bigint_col) END,CASE valid_tid(1,4,6) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 4 THEN murmur_hash(int_col) WHEN 6 THEN murmur_hash(smallint_col) END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -512,10 +512,10 @@ PLAN-ROOT SINK
 |    group by: bigint_col, int_col
 |  Class 2
 |    group by: bigint_col, smallint_col
-|  row-size=31B cardinality=700
+|  row-size=31B cardinality=300
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=15B cardinality=7.30K
 ====
 # Multiple distinct with grouping. Last needs intermediate tuple.
@@ -526,8 +526,8 @@ from functional.alltypes group by bigint_col
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, sum(int_col)), aggif(valid_tid() = 7, avg(smallint_col))
-|  group by: CASE valid_tid() WHEN 2 THEN bigint_col WHEN 4 THEN bigint_col WHEN 7 THEN bigint_col END
+|  output: aggif(valid_tid(2,4,7) = 2, count(tinyint_col)), aggif(valid_tid(2,4,7) = 4, sum(int_col)), aggif(valid_tid(2,4,7) = 7, avg(smallint_col))
+|  group by: CASE valid_tid(2,4,7) WHEN 2 THEN bigint_col WHEN 4 THEN bigint_col WHEN 7 THEN bigint_col END
 |  row-size=32B cardinality=11
 |
 02:AGGREGATE [FINALIZE]
@@ -540,7 +540,7 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: avg(smallint_col)
 |    group by: bigint_col
-|  row-size=48B cardinality=70
+|  row-size=48B cardinality=30
 |
 01:AGGREGATE
 |  Class 0
@@ -549,10 +549,10 @@ PLAN-ROOT SINK
 |    group by: bigint_col, int_col
 |  Class 2
 |    group by: bigint_col, smallint_col
-|  row-size=31B cardinality=700
+|  row-size=31B cardinality=300
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=15B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -560,8 +560,8 @@ PLAN-ROOT SINK
 08:EXCHANGE [UNPARTITIONED]
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, sum(int_col)), aggif(valid_tid() = 7, avg(smallint_col))
-|  group by: CASE valid_tid() WHEN 2 THEN bigint_col WHEN 4 THEN bigint_col WHEN 7 THEN bigint_col END
+|  output: aggif(valid_tid(2,4,7) = 2, count(tinyint_col)), aggif(valid_tid(2,4,7) = 4, sum(int_col)), aggif(valid_tid(2,4,7) = 7, avg(smallint_col))
+|  group by: CASE valid_tid(2,4,7) WHEN 2 THEN bigint_col WHEN 4 THEN bigint_col WHEN 7 THEN bigint_col END
 |  row-size=32B cardinality=11
 |
 07:AGGREGATE [FINALIZE]
@@ -574,9 +574,9 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: avg:merge(smallint_col)
 |    group by: bigint_col
-|  row-size=48B cardinality=70
+|  row-size=48B cardinality=30
 |
-06:EXCHANGE [HASH(CASE valid_tid() WHEN 2 THEN murmur_hash(bigint_col) WHEN 4 THEN murmur_hash(bigint_col) WHEN 6 THEN murmur_hash(bigint_col) END)]
+06:EXCHANGE [HASH(CASE valid_tid(2,4,6) WHEN 2 THEN murmur_hash(bigint_col) WHEN 4 THEN murmur_hash(bigint_col) WHEN 6 THEN murmur_hash(bigint_col) END)]
 |
 02:AGGREGATE [STREAMING]
 |  Class 0
@@ -588,7 +588,7 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: avg(smallint_col)
 |    group by: bigint_col
-|  row-size=48B cardinality=70
+|  row-size=48B cardinality=30
 |
 05:AGGREGATE
 |  Class 0
@@ -597,9 +597,9 @@ PLAN-ROOT SINK
 |    group by: bigint_col, int_col
 |  Class 2
 |    group by: bigint_col, smallint_col
-|  row-size=31B cardinality=700
+|  row-size=31B cardinality=300
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(bigint_col) WHEN 3 THEN murmur_hash(bigint_col) WHEN 5 THEN murmur_hash(bigint_col) END,CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(int_col) WHEN 5 THEN murmur_hash(smallint_col) END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(bigint_col) WHEN 3 THEN murmur_hash(bigint_col) WHEN 5 THEN murmur_hash(bigint_col) END,CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(int_col) WHEN 5 THEN murmur_hash(smallint_col) END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -608,10 +608,10 @@ PLAN-ROOT SINK
 |    group by: bigint_col, int_col
 |  Class 2
 |    group by: bigint_col, smallint_col
-|  row-size=31B cardinality=700
+|  row-size=31B cardinality=300
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=15B cardinality=7.30K
 ====
 # Multiple distinct with grouping. All need intermediate tuples
@@ -622,8 +622,8 @@ from functional.alltypes group by bigint_col
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 3, avg(tinyint_col)), aggif(valid_tid() = 6, avg(int_col)), aggif(valid_tid() = 9, avg(smallint_col))
-|  group by: CASE valid_tid() WHEN 3 THEN bigint_col WHEN 6 THEN bigint_col WHEN 9 THEN bigint_col END
+|  output: aggif(valid_tid(3,6,9) = 3, avg(tinyint_col)), aggif(valid_tid(3,6,9) = 6, avg(int_col)), aggif(valid_tid(3,6,9) = 9, avg(smallint_col))
+|  group by: CASE valid_tid(3,6,9) WHEN 3 THEN bigint_col WHEN 6 THEN bigint_col WHEN 9 THEN bigint_col END
 |  row-size=32B cardinality=11
 |
 02:AGGREGATE [FINALIZE]
@@ -636,7 +636,7 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: avg(smallint_col)
 |    group by: bigint_col
-|  row-size=48B cardinality=70
+|  row-size=48B cardinality=30
 |
 01:AGGREGATE
 |  Class 0
@@ -645,10 +645,10 @@ PLAN-ROOT SINK
 |    group by: bigint_col, int_col
 |  Class 2
 |    group by: bigint_col, smallint_col
-|  row-size=31B cardinality=700
+|  row-size=31B cardinality=300
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=15B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -656,8 +656,8 @@ PLAN-ROOT SINK
 08:EXCHANGE [UNPARTITIONED]
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 3, avg(tinyint_col)), aggif(valid_tid() = 6, avg(int_col)), aggif(valid_tid() = 9, avg(smallint_col))
-|  group by: CASE valid_tid() WHEN 3 THEN bigint_col WHEN 6 THEN bigint_col WHEN 9 THEN bigint_col END
+|  output: aggif(valid_tid(3,6,9) = 3, avg(tinyint_col)), aggif(valid_tid(3,6,9) = 6, avg(int_col)), aggif(valid_tid(3,6,9) = 9, avg(smallint_col))
+|  group by: CASE valid_tid(3,6,9) WHEN 3 THEN bigint_col WHEN 6 THEN bigint_col WHEN 9 THEN bigint_col END
 |  row-size=32B cardinality=11
 |
 07:AGGREGATE [FINALIZE]
@@ -670,9 +670,9 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: avg:merge(smallint_col)
 |    group by: bigint_col
-|  row-size=48B cardinality=70
+|  row-size=48B cardinality=30
 |
-06:EXCHANGE [HASH(CASE valid_tid() WHEN 2 THEN murmur_hash(bigint_col) WHEN 5 THEN murmur_hash(bigint_col) WHEN 8 THEN murmur_hash(bigint_col) END)]
+06:EXCHANGE [HASH(CASE valid_tid(2,5,8) WHEN 2 THEN murmur_hash(bigint_col) WHEN 5 THEN murmur_hash(bigint_col) WHEN 8 THEN murmur_hash(bigint_col) END)]
 |
 02:AGGREGATE [STREAMING]
 |  Class 0
@@ -684,7 +684,7 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: avg(smallint_col)
 |    group by: bigint_col
-|  row-size=48B cardinality=70
+|  row-size=48B cardinality=30
 |
 05:AGGREGATE
 |  Class 0
@@ -693,9 +693,9 @@ PLAN-ROOT SINK
 |    group by: bigint_col, int_col
 |  Class 2
 |    group by: bigint_col, smallint_col
-|  row-size=31B cardinality=700
+|  row-size=31B cardinality=300
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(bigint_col) WHEN 4 THEN murmur_hash(bigint_col) WHEN 7 THEN murmur_hash(bigint_col) END,CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 4 THEN murmur_hash(int_col) WHEN 7 THEN murmur_hash(smallint_col) END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,4,7) WHEN 1 THEN murmur_hash(bigint_col) WHEN 4 THEN murmur_hash(bigint_col) WHEN 7 THEN murmur_hash(bigint_col) END,CASE valid_tid(1,4,7) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 4 THEN murmur_hash(int_col) WHEN 7 THEN murmur_hash(smallint_col) END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -704,10 +704,10 @@ PLAN-ROOT SINK
 |    group by: bigint_col, int_col
 |  Class 2
 |    group by: bigint_col, smallint_col
-|  row-size=31B cardinality=700
+|  row-size=31B cardinality=300
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=15B cardinality=7.30K
 ====
 # Multiple distinct and non-distinct without grouping.
@@ -717,7 +717,7 @@ from functional.alltypes
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 5, count(int_col))
+|  output: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)), aggif(valid_tid(2,4,5) = 4, count(smallint_col)), aggif(valid_tid(2,4,5) = 5, count(int_col))
 |  row-size=24B cardinality=1
 |
 02:AGGREGATE [FINALIZE]
@@ -736,16 +736,16 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: count(int_col)
-|  row-size=11B cardinality=31
+|  row-size=11B cardinality=21
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=7B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 5, count(int_col))
+|  output: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)), aggif(valid_tid(2,4,5) = 4, count(smallint_col)), aggif(valid_tid(2,4,5) = 5, count(int_col))
 |  row-size=24B cardinality=1
 |
 07:AGGREGATE [FINALIZE]
@@ -775,9 +775,9 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: count:merge(int_col)
-|  row-size=11B cardinality=31
+|  row-size=11B cardinality=21
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(smallint_col) WHEN 5 THEN 0 END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(smallint_col) WHEN 5 THEN 0 END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -786,10 +786,10 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: count(int_col)
-|  row-size=11B cardinality=31
+|  row-size=11B cardinality=21
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=7B cardinality=7.30K
 ====
 # Multiple distinct and non-distinct without grouping. First distinct needs
@@ -800,7 +800,7 @@ from functional.alltypes
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 3, avg(tinyint_col)), aggif(valid_tid() = 5, count(smallint_col)), aggif(valid_tid() = 6, count(int_col))
+|  output: aggif(valid_tid(3,5,6) = 3, avg(tinyint_col)), aggif(valid_tid(3,5,6) = 5, count(smallint_col)), aggif(valid_tid(3,5,6) = 6, count(int_col))
 |  row-size=24B cardinality=1
 |
 02:AGGREGATE [FINALIZE]
@@ -819,16 +819,16 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: count(int_col)
-|  row-size=11B cardinality=31
+|  row-size=11B cardinality=21
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=7B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 3, avg(tinyint_col)), aggif(valid_tid() = 5, count(smallint_col)), aggif(valid_tid() = 6, count(int_col))
+|  output: aggif(valid_tid(3,5,6) = 3, avg(tinyint_col)), aggif(valid_tid(3,5,6) = 5, count(smallint_col)), aggif(valid_tid(3,5,6) = 6, count(int_col))
 |  row-size=24B cardinality=1
 |
 07:AGGREGATE [FINALIZE]
@@ -858,9 +858,9 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: count:merge(int_col)
-|  row-size=11B cardinality=31
+|  row-size=11B cardinality=21
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 4 THEN murmur_hash(smallint_col) WHEN 6 THEN 0 END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,4,6) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 4 THEN murmur_hash(smallint_col) WHEN 6 THEN 0 END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -869,10 +869,10 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: count(int_col)
-|  row-size=11B cardinality=31
+|  row-size=11B cardinality=21
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=7B cardinality=7.30K
 ====
 # Multiple distinct and non-distinct without grouping. Non-distinct needs
@@ -883,7 +883,7 @@ from functional.alltypes
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 6, avg(int_col))
+|  output: aggif(valid_tid(2,4,6) = 2, count(tinyint_col)), aggif(valid_tid(2,4,6) = 4, count(smallint_col)), aggif(valid_tid(2,4,6) = 6, avg(int_col))
 |  row-size=24B cardinality=1
 |
 02:AGGREGATE [FINALIZE]
@@ -902,16 +902,16 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: avg(int_col)
-|  row-size=11B cardinality=31
+|  row-size=11B cardinality=21
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=7B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 6, avg(int_col))
+|  output: aggif(valid_tid(2,4,6) = 2, count(tinyint_col)), aggif(valid_tid(2,4,6) = 4, count(smallint_col)), aggif(valid_tid(2,4,6) = 6, avg(int_col))
 |  row-size=24B cardinality=1
 |
 07:AGGREGATE [FINALIZE]
@@ -941,9 +941,9 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: avg:merge(int_col)
-|  row-size=11B cardinality=31
+|  row-size=11B cardinality=21
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(smallint_col) WHEN 5 THEN 0 END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(smallint_col) WHEN 5 THEN 0 END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -952,10 +952,10 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: avg(int_col)
-|  row-size=11B cardinality=31
+|  row-size=11B cardinality=21
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=7B cardinality=7.30K
 ====
 # Multiple distinct and non-distinct without grouping. All need intermediate agg tuples.
@@ -965,7 +965,7 @@ from functional.alltypes
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 3, avg(tinyint_col)), aggif(valid_tid() = 6, avg(smallint_col)), aggif(valid_tid() = 8, avg(int_col))
+|  output: aggif(valid_tid(3,6,8) = 3, avg(tinyint_col)), aggif(valid_tid(3,6,8) = 6, avg(smallint_col)), aggif(valid_tid(3,6,8) = 8, avg(int_col))
 |  row-size=24B cardinality=1
 |
 02:AGGREGATE [FINALIZE]
@@ -984,16 +984,16 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: avg(int_col)
-|  row-size=11B cardinality=31
+|  row-size=11B cardinality=21
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=7B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 3, avg(tinyint_col)), aggif(valid_tid() = 6, avg(smallint_col)), aggif(valid_tid() = 8, avg(int_col))
+|  output: aggif(valid_tid(3,6,8) = 3, avg(tinyint_col)), aggif(valid_tid(3,6,8) = 6, avg(smallint_col)), aggif(valid_tid(3,6,8) = 8, avg(int_col))
 |  row-size=24B cardinality=1
 |
 07:AGGREGATE [FINALIZE]
@@ -1023,9 +1023,9 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: avg:merge(int_col)
-|  row-size=11B cardinality=31
+|  row-size=11B cardinality=21
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 4 THEN murmur_hash(smallint_col) WHEN 7 THEN 0 END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,4,7) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 4 THEN murmur_hash(smallint_col) WHEN 7 THEN 0 END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -1034,10 +1034,10 @@ PLAN-ROOT SINK
 |    group by: smallint_col
 |  Class 2
 |    output: avg(int_col)
-|  row-size=11B cardinality=31
+|  row-size=11B cardinality=21
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=7B cardinality=7.30K
 ====
 # Multiple distinct and non-distinct with grouping.
@@ -1048,8 +1048,8 @@ from functional.alltypes group by bigint_col
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 5, count(int_col))
-|  group by: CASE valid_tid() WHEN 2 THEN bigint_col WHEN 4 THEN bigint_col WHEN 5 THEN bigint_col END
+|  output: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)), aggif(valid_tid(2,4,5) = 4, count(smallint_col)), aggif(valid_tid(2,4,5) = 5, count(int_col))
+|  group by: CASE valid_tid(2,4,5) WHEN 2 THEN bigint_col WHEN 4 THEN bigint_col WHEN 5 THEN bigint_col END
 |  row-size=32B cardinality=11
 |
 02:AGGREGATE [FINALIZE]
@@ -1062,7 +1062,7 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: count:merge(int_col)
 |    group by: bigint_col
-|  row-size=48B cardinality=70
+|  row-size=48B cardinality=30
 |
 01:AGGREGATE
 |  Class 0
@@ -1072,10 +1072,10 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: count(int_col)
 |    group by: bigint_col
-|  row-size=35B cardinality=610
+|  row-size=35B cardinality=210
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=15B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -1083,8 +1083,8 @@ PLAN-ROOT SINK
 08:EXCHANGE [UNPARTITIONED]
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 5, count(int_col))
-|  group by: CASE valid_tid() WHEN 2 THEN bigint_col WHEN 4 THEN bigint_col WHEN 5 THEN bigint_col END
+|  output: aggif(valid_tid(2,4,5) = 2, count(tinyint_col)), aggif(valid_tid(2,4,5) = 4, count(smallint_col)), aggif(valid_tid(2,4,5) = 5, count(int_col))
+|  group by: CASE valid_tid(2,4,5) WHEN 2 THEN bigint_col WHEN 4 THEN bigint_col WHEN 5 THEN bigint_col END
 |  row-size=32B cardinality=11
 |
 07:AGGREGATE [FINALIZE]
@@ -1097,9 +1097,9 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: count:merge(int_col)
 |    group by: bigint_col
-|  row-size=48B cardinality=70
+|  row-size=48B cardinality=30
 |
-06:EXCHANGE [HASH(CASE valid_tid() WHEN 2 THEN murmur_hash(bigint_col) WHEN 4 THEN murmur_hash(bigint_col) WHEN 5 THEN murmur_hash(bigint_col) END)]
+06:EXCHANGE [HASH(CASE valid_tid(2,4,5) WHEN 2 THEN murmur_hash(bigint_col) WHEN 4 THEN murmur_hash(bigint_col) WHEN 5 THEN murmur_hash(bigint_col) END)]
 |
 02:AGGREGATE [STREAMING]
 |  Class 0
@@ -1111,7 +1111,7 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: count:merge(int_col)
 |    group by: bigint_col
-|  row-size=48B cardinality=70
+|  row-size=48B cardinality=30
 |
 05:AGGREGATE
 |  Class 0
@@ -1121,9 +1121,9 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: count:merge(int_col)
 |    group by: bigint_col
-|  row-size=35B cardinality=610
+|  row-size=35B cardinality=210
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(bigint_col) WHEN 3 THEN murmur_hash(bigint_col) WHEN 5 THEN murmur_hash(bigint_col) END,CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(smallint_col) WHEN 5 THEN 0 END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(bigint_col) WHEN 3 THEN murmur_hash(bigint_col) WHEN 5 THEN murmur_hash(bigint_col) END,CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(smallint_col) WHEN 5 THEN 0 END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -1133,10 +1133,10 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: count(int_col)
 |    group by: bigint_col
-|  row-size=35B cardinality=610
+|  row-size=35B cardinality=210
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=15B cardinality=7.30K
 ====
 # Multiple distinct and non-distinct without grouping. First distinct needs
@@ -1148,8 +1148,8 @@ from functional.alltypes group by bigint_col
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 3, avg(tinyint_col)), aggif(valid_tid() = 5, count(smallint_col)), aggif(valid_tid() = 6, count(int_col))
-|  group by: CASE valid_tid() WHEN 3 THEN bigint_col WHEN 5 THEN bigint_col WHEN 6 THEN bigint_col END
+|  output: aggif(valid_tid(3,5,6) = 3, avg(tinyint_col)), aggif(valid_tid(3,5,6) = 5, count(smallint_col)), aggif(valid_tid(3,5,6) = 6, count(int_col))
+|  group by: CASE valid_tid(3,5,6) WHEN 3 THEN bigint_col WHEN 5 THEN bigint_col WHEN 6 THEN bigint_col END
 |  row-size=32B cardinality=11
 |
 02:AGGREGATE [FINALIZE]
@@ -1162,7 +1162,7 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: count:merge(int_col)
 |    group by: bigint_col
-|  row-size=48B cardinality=70
+|  row-size=48B cardinality=30
 |
 01:AGGREGATE
 |  Class 0
@@ -1172,10 +1172,10 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: count(int_col)
 |    group by: bigint_col
-|  row-size=35B cardinality=610
+|  row-size=35B cardinality=210
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=15B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -1183,8 +1183,8 @@ PLAN-ROOT SINK
 08:EXCHANGE [UNPARTITIONED]
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 3, avg(tinyint_col)), aggif(valid_tid() = 5, count(smallint_col)), aggif(valid_tid() = 6, count(int_col))
-|  group by: CASE valid_tid() WHEN 3 THEN bigint_col WHEN 5 THEN bigint_col WHEN 6 THEN bigint_col END
+|  output: aggif(valid_tid(3,5,6) = 3, avg(tinyint_col)), aggif(valid_tid(3,5,6) = 5, count(smallint_col)), aggif(valid_tid(3,5,6) = 6, count(int_col))
+|  group by: CASE valid_tid(3,5,6) WHEN 3 THEN bigint_col WHEN 5 THEN bigint_col WHEN 6 THEN bigint_col END
 |  row-size=32B cardinality=11
 |
 07:AGGREGATE [FINALIZE]
@@ -1197,9 +1197,9 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: count:merge(int_col)
 |    group by: bigint_col
-|  row-size=48B cardinality=70
+|  row-size=48B cardinality=30
 |
-06:EXCHANGE [HASH(CASE valid_tid() WHEN 2 THEN murmur_hash(bigint_col) WHEN 5 THEN murmur_hash(bigint_col) WHEN 6 THEN murmur_hash(bigint_col) END)]
+06:EXCHANGE [HASH(CASE valid_tid(2,5,6) WHEN 2 THEN murmur_hash(bigint_col) WHEN 5 THEN murmur_hash(bigint_col) WHEN 6 THEN murmur_hash(bigint_col) END)]
 |
 02:AGGREGATE [STREAMING]
 |  Class 0
@@ -1211,7 +1211,7 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: count:merge(int_col)
 |    group by: bigint_col
-|  row-size=48B cardinality=70
+|  row-size=48B cardinality=30
 |
 05:AGGREGATE
 |  Class 0
@@ -1221,9 +1221,9 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: count:merge(int_col)
 |    group by: bigint_col
-|  row-size=35B cardinality=610
+|  row-size=35B cardinality=210
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(bigint_col) WHEN 4 THEN murmur_hash(bigint_col) WHEN 6 THEN murmur_hash(bigint_col) END,CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 4 THEN murmur_hash(smallint_col) WHEN 6 THEN 0 END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,4,6) WHEN 1 THEN murmur_hash(bigint_col) WHEN 4 THEN murmur_hash(bigint_col) WHEN 6 THEN murmur_hash(bigint_col) END,CASE valid_tid(1,4,6) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 4 THEN murmur_hash(smallint_col) WHEN 6 THEN 0 END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -1233,10 +1233,10 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: count(int_col)
 |    group by: bigint_col
-|  row-size=35B cardinality=610
+|  row-size=35B cardinality=210
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=15B cardinality=7.30K
 ====
 # Multiple distinct and non-distinct without grouping. Non-distinct needs
@@ -1248,8 +1248,8 @@ from functional.alltypes group by bigint_col
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 6, avg(int_col))
-|  group by: CASE valid_tid() WHEN 2 THEN bigint_col WHEN 4 THEN bigint_col WHEN 6 THEN bigint_col END
+|  output: aggif(valid_tid(2,4,6) = 2, count(tinyint_col)), aggif(valid_tid(2,4,6) = 4, count(smallint_col)), aggif(valid_tid(2,4,6) = 6, avg(int_col))
+|  group by: CASE valid_tid(2,4,6) WHEN 2 THEN bigint_col WHEN 4 THEN bigint_col WHEN 6 THEN bigint_col END
 |  row-size=32B cardinality=11
 |
 02:AGGREGATE [FINALIZE]
@@ -1262,7 +1262,7 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: avg:merge(int_col)
 |    group by: bigint_col
-|  row-size=48B cardinality=70
+|  row-size=48B cardinality=30
 |
 01:AGGREGATE
 |  Class 0
@@ -1272,10 +1272,10 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: avg(int_col)
 |    group by: bigint_col
-|  row-size=35B cardinality=610
+|  row-size=35B cardinality=210
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=15B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -1283,8 +1283,8 @@ PLAN-ROOT SINK
 08:EXCHANGE [UNPARTITIONED]
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 2, count(tinyint_col)), aggif(valid_tid() = 4, count(smallint_col)), aggif(valid_tid() = 6, avg(int_col))
-|  group by: CASE valid_tid() WHEN 2 THEN bigint_col WHEN 4 THEN bigint_col WHEN 6 THEN bigint_col END
+|  output: aggif(valid_tid(2,4,6) = 2, count(tinyint_col)), aggif(valid_tid(2,4,6) = 4, count(smallint_col)), aggif(valid_tid(2,4,6) = 6, avg(int_col))
+|  group by: CASE valid_tid(2,4,6) WHEN 2 THEN bigint_col WHEN 4 THEN bigint_col WHEN 6 THEN bigint_col END
 |  row-size=32B cardinality=11
 |
 07:AGGREGATE [FINALIZE]
@@ -1297,9 +1297,9 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: avg:merge(int_col)
 |    group by: bigint_col
-|  row-size=48B cardinality=70
+|  row-size=48B cardinality=30
 |
-06:EXCHANGE [HASH(CASE valid_tid() WHEN 2 THEN murmur_hash(bigint_col) WHEN 4 THEN murmur_hash(bigint_col) WHEN 5 THEN murmur_hash(bigint_col) END)]
+06:EXCHANGE [HASH(CASE valid_tid(2,4,5) WHEN 2 THEN murmur_hash(bigint_col) WHEN 4 THEN murmur_hash(bigint_col) WHEN 5 THEN murmur_hash(bigint_col) END)]
 |
 02:AGGREGATE [STREAMING]
 |  Class 0
@@ -1311,7 +1311,7 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: avg:merge(int_col)
 |    group by: bigint_col
-|  row-size=48B cardinality=70
+|  row-size=48B cardinality=30
 |
 05:AGGREGATE
 |  Class 0
@@ -1321,9 +1321,9 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: avg:merge(int_col)
 |    group by: bigint_col
-|  row-size=35B cardinality=610
+|  row-size=35B cardinality=210
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(bigint_col) WHEN 3 THEN murmur_hash(bigint_col) WHEN 5 THEN murmur_hash(bigint_col) END,CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(smallint_col) WHEN 5 THEN 0 END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(bigint_col) WHEN 3 THEN murmur_hash(bigint_col) WHEN 5 THEN murmur_hash(bigint_col) END,CASE valid_tid(1,3,5) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 3 THEN murmur_hash(smallint_col) WHEN 5 THEN 0 END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -1333,10 +1333,10 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: avg(int_col)
 |    group by: bigint_col
-|  row-size=35B cardinality=610
+|  row-size=35B cardinality=210
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=15B cardinality=7.30K
 ====
 # Multiple distinct and non-distinct without grouping. All need intermediate agg tuples.
@@ -1347,8 +1347,8 @@ from functional.alltypes group by bigint_col
 PLAN-ROOT SINK
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 3, avg(tinyint_col)), aggif(valid_tid() = 6, avg(smallint_col)), aggif(valid_tid() = 8, avg(int_col))
-|  group by: CASE valid_tid() WHEN 3 THEN bigint_col WHEN 6 THEN bigint_col WHEN 8 THEN bigint_col END
+|  output: aggif(valid_tid(3,6,8) = 3, avg(tinyint_col)), aggif(valid_tid(3,6,8) = 6, avg(smallint_col)), aggif(valid_tid(3,6,8) = 8, avg(int_col))
+|  group by: CASE valid_tid(3,6,8) WHEN 3 THEN bigint_col WHEN 6 THEN bigint_col WHEN 8 THEN bigint_col END
 |  row-size=32B cardinality=11
 |
 02:AGGREGATE [FINALIZE]
@@ -1361,7 +1361,7 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: avg:merge(int_col)
 |    group by: bigint_col
-|  row-size=48B cardinality=70
+|  row-size=48B cardinality=30
 |
 01:AGGREGATE
 |  Class 0
@@ -1371,10 +1371,10 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: avg(int_col)
 |    group by: bigint_col
-|  row-size=35B cardinality=610
+|  row-size=35B cardinality=210
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=15B cardinality=7.30K
 ---- DISTRIBUTEDPLAN
 PLAN-ROOT SINK
@@ -1382,8 +1382,8 @@ PLAN-ROOT SINK
 08:EXCHANGE [UNPARTITIONED]
 |
 03:AGGREGATE [FINALIZE]
-|  output: aggif(valid_tid() = 3, avg(tinyint_col)), aggif(valid_tid() = 6, avg(smallint_col)), aggif(valid_tid() = 8, avg(int_col))
-|  group by: CASE valid_tid() WHEN 3 THEN bigint_col WHEN 6 THEN bigint_col WHEN 8 THEN bigint_col END
+|  output: aggif(valid_tid(3,6,8) = 3, avg(tinyint_col)), aggif(valid_tid(3,6,8) = 6, avg(smallint_col)), aggif(valid_tid(3,6,8) = 8, avg(int_col))
+|  group by: CASE valid_tid(3,6,8) WHEN 3 THEN bigint_col WHEN 6 THEN bigint_col WHEN 8 THEN bigint_col END
 |  row-size=32B cardinality=11
 |
 07:AGGREGATE [FINALIZE]
@@ -1396,9 +1396,9 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: avg:merge(int_col)
 |    group by: bigint_col
-|  row-size=48B cardinality=70
+|  row-size=48B cardinality=30
 |
-06:EXCHANGE [HASH(CASE valid_tid() WHEN 2 THEN murmur_hash(bigint_col) WHEN 5 THEN murmur_hash(bigint_col) WHEN 7 THEN murmur_hash(bigint_col) END)]
+06:EXCHANGE [HASH(CASE valid_tid(2,5,7) WHEN 2 THEN murmur_hash(bigint_col) WHEN 5 THEN murmur_hash(bigint_col) WHEN 7 THEN murmur_hash(bigint_col) END)]
 |
 02:AGGREGATE [STREAMING]
 |  Class 0
@@ -1410,7 +1410,7 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: avg:merge(int_col)
 |    group by: bigint_col
-|  row-size=48B cardinality=70
+|  row-size=48B cardinality=30
 |
 05:AGGREGATE
 |  Class 0
@@ -1420,9 +1420,9 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: avg:merge(int_col)
 |    group by: bigint_col
-|  row-size=35B cardinality=610
+|  row-size=35B cardinality=210
 |
-04:EXCHANGE [HASH(CASE valid_tid() WHEN 1 THEN murmur_hash(bigint_col) WHEN 4 THEN murmur_hash(bigint_col) WHEN 7 THEN murmur_hash(bigint_col) END,CASE valid_tid() WHEN 1 THEN murmur_hash(tinyint_col) WHEN 4 THEN murmur_hash(smallint_col) WHEN 7 THEN 0 END)]
+04:EXCHANGE [HASH(CASE valid_tid(1,4,7) WHEN 1 THEN murmur_hash(bigint_col) WHEN 4 THEN murmur_hash(bigint_col) WHEN 7 THEN murmur_hash(bigint_col) END,CASE valid_tid(1,4,7) WHEN 1 THEN murmur_hash(tinyint_col) WHEN 4 THEN murmur_hash(smallint_col) WHEN 7 THEN 0 END)]
 |
 01:AGGREGATE [STREAMING]
 |  Class 0
@@ -1432,9 +1432,9 @@ PLAN-ROOT SINK
 |  Class 2
 |    output: avg(int_col)
 |    group by: bigint_col
-|  row-size=35B cardinality=610
+|  row-size=35B cardinality=210
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=15B cardinality=7.30K
 ====
diff --git a/testdata/workloads/functional-planner/queries/PlannerTest/runtime-filter-propagation.test b/testdata/workloads/functional-planner/queries/PlannerTest/runtime-filter-propagation.test
index 7ceb039..15e01d9 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/runtime-filter-propagation.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/runtime-filter-propagation.test
@@ -10,12 +10,12 @@ PLAN-ROOT SINK
 |  row-size=167B cardinality=1
 |
 |--01:SCAN HDFS [functional.alltypesnopart t2]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: t2.id < 10
 |     row-size=72B cardinality=0
 |
 00:SCAN HDFS [functional.alltypesagg t1]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    predicates: t1.id = 10
    runtime filters: RF000 -> t1.`year`
    row-size=95B cardinality=1
@@ -32,12 +32,12 @@ PLAN-ROOT SINK
 |--03:EXCHANGE [BROADCAST]
 |  |
 |  01:SCAN HDFS [functional.alltypesnopart t2]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: t2.id < 10
 |     row-size=72B cardinality=0
 |
 00:SCAN HDFS [functional.alltypesagg t1]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    predicates: t1.id = 10
    runtime filters: RF000 -> t1.`year`
    row-size=95B cardinality=1
@@ -56,7 +56,7 @@ PLAN-ROOT SINK
 |  row-size=345B cardinality=9
 |
 |--03:SCAN HDFS [functional.alltypesnopart t4]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: t4.bigint_col < 10
 |     row-size=72B cardinality=0
 |
@@ -66,7 +66,7 @@ PLAN-ROOT SINK
 |  row-size=273B cardinality=9
 |
 |--02:SCAN HDFS [functional.alltypestiny t3]
-|     partitions=4/4 files=4 size=460B
+|     HDFS partitions=4/4 files=4 size=460B
 |     runtime filters: RF000 -> t3.`month`
 |     row-size=89B cardinality=8
 |
@@ -76,13 +76,13 @@ PLAN-ROOT SINK
 |  row-size=184B cardinality=92
 |
 |--01:SCAN HDFS [functional.alltypesagg t2]
-|     partitions=11/11 files=11 size=814.73KB
+|     HDFS partitions=11/11 files=11 size=814.73KB
 |     predicates: t2.bool_col = TRUE
 |     runtime filters: RF002 -> t2.id
 |     row-size=95B cardinality=5.50K
 |
 00:SCAN HDFS [functional.alltypestiny t1]
-   partitions=4/4 files=4 size=460B
+   HDFS partitions=4/4 files=4 size=460B
    runtime filters: RF004 -> t1.`year`
    row-size=89B cardinality=8
 ====
@@ -98,12 +98,12 @@ PLAN-ROOT SINK
 |  row-size=167B cardinality=11.00K
 |
 |--01:SCAN HDFS [functional.alltypesnopart t2]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: t2.id = 10
 |     row-size=72B cardinality=0
 |
 00:SCAN HDFS [functional.alltypesagg t1]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    runtime filters: RF000 -> t1.`year`, RF001 -> t1.`month`
    row-size=95B cardinality=11.00K
 ====
@@ -120,12 +120,12 @@ PLAN-ROOT SINK
 |  row-size=167B cardinality=11.00K
 |
 |--01:SCAN HDFS [functional.alltypesnopart t2]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: t2.id = 1
 |     row-size=72B cardinality=0
 |
 00:SCAN HDFS [functional.alltypesagg t1]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    runtime filters: RF000 -> t1.`year`
    row-size=95B cardinality=11.00K
 ====
@@ -144,12 +144,12 @@ PLAN-ROOT SINK
 |  row-size=111B cardinality=11.00K
 |
 |--01:SCAN HDFS [functional.alltypesnopart t2]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: t2.bigint_col < 10
 |     row-size=16B cardinality=0
 |
 00:SCAN HDFS [functional.alltypesagg t1]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    runtime filters: RF000 -> t1.`year`
    row-size=95B cardinality=11.00K
 ====
@@ -165,12 +165,12 @@ PLAN-ROOT SINK
 |  row-size=167B cardinality=11.00K
 |
 |--01:SCAN HDFS [functional.alltypesnopart t2]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: t2.int_col < 10
 |     row-size=72B cardinality=0
 |
 00:SCAN HDFS [functional.alltypesagg t1]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    runtime filters: RF000 -> t1.`year` + 1
    row-size=95B cardinality=11.00K
 ====
@@ -189,12 +189,12 @@ PLAN-ROOT SINK
 |  row-size=167B cardinality=11
 |
 |--01:SCAN HDFS [functional.alltypesnopart t2]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: t2.bigint_col = 1
 |     row-size=72B cardinality=0
 |
 00:SCAN HDFS [functional.alltypesagg t1]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    predicates: t1.int_col = 1
    runtime filters: RF000 -> t1.id
    row-size=95B cardinality=11
@@ -213,12 +213,12 @@ PLAN-ROOT SINK
 |  row-size=167B cardinality=11.00K
 |
 |--01:SCAN HDFS [functional.alltypesnopart t2]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: t2.bool_col = FALSE
 |     row-size=72B cardinality=0
 |
 00:SCAN HDFS [functional.alltypesagg t1]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    runtime filters: RF000 -> t1.`year` + t1.`month`, RF001 -> t1.int_col * 100, RF002 -> t1.int_col + 1 - t1.tinyint_col
    row-size=95B cardinality=11.00K
 ====
@@ -238,7 +238,7 @@ PLAN-ROOT SINK
 |  row-size=88B cardinality=7.81K
 |
 |--03:SCAN HDFS [functional.alltypesnopart t3]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: t3.bool_col = TRUE
 |     row-size=72B cardinality=0
 |
@@ -248,11 +248,11 @@ PLAN-ROOT SINK
 |  row-size=16B cardinality=7.81K
 |
 |--01:SCAN HDFS [functional.alltypes t2]
-|     partitions=24/24 files=24 size=478.45KB
+|     HDFS partitions=24/24 files=24 size=478.45KB
 |     row-size=8B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypesagg t1]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    runtime filters: RF000 -> t1.id
    row-size=8B cardinality=11.00K
 ====
@@ -277,7 +277,7 @@ PLAN-ROOT SINK
 |  |  row-size=12B cardinality=0
 |  |
 |  01:SCAN HDFS [functional.alltypesnopart t2]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     row-size=8B cardinality=0
 |
 00:SCAN HDFS [functional.alltypesagg t1]
@@ -306,16 +306,16 @@ PLAN-ROOT SINK
 |  |  row-size=17B cardinality=0
 |  |
 |  |--02:SCAN HDFS [functional.alltypesnopart t3]
-|  |     partitions=1/1 files=0 size=0B
+|  |     HDFS partitions=1/1 files=0 size=0B
 |  |     row-size=9B cardinality=0
 |  |
 |  01:SCAN HDFS [functional.alltypesnopart t2]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     runtime filters: RF004 -> t2.int_col
 |     row-size=8B cardinality=0
 |
 00:SCAN HDFS [functional.alltypesagg t1]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    runtime filters: RF000 -> t1.`month`, RF001 -> t1.`year`
    row-size=95B cardinality=11.00K
 ====
@@ -340,7 +340,7 @@ PLAN-ROOT SINK
 |  |  row-size=22B cardinality=0
 |  |
 |  |--03:SCAN HDFS [functional.alltypesnopart t4]
-|  |     partitions=1/1 files=0 size=0B
+|  |     HDFS partitions=1/1 files=0 size=0B
 |  |     row-size=5B cardinality=0
 |  |
 |  04:HASH JOIN [INNER JOIN]
@@ -349,18 +349,18 @@ PLAN-ROOT SINK
 |  |  row-size=17B cardinality=0
 |  |
 |  |--02:SCAN HDFS [functional.alltypesnopart t3]
-|  |     partitions=1/1 files=0 size=0B
+|  |     HDFS partitions=1/1 files=0 size=0B
 |  |     runtime filters: RF005 -> t3.int_col
 |  |     row-size=8B cardinality=0
 |  |
 |  01:SCAN HDFS [functional.alltypesnopart t2]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: t2.int_col = t2.id
 |     runtime filters: RF004 -> t2.tinyint_col, RF008 -> t2.id
 |     row-size=9B cardinality=0
 |
 00:SCAN HDFS [functional.alltypesagg t1]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    runtime filters: RF000 -> t1.`year`, RF001 -> t1.`month`
    row-size=95B cardinality=11.00K
 ====
@@ -378,7 +378,7 @@ PLAN-ROOT SINK
 |  row-size=311B cardinality=11.00K
 |
 |--03:SCAN HDFS [functional.alltypesnopart t4]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: t4.bigint_col IN (1, 2)
 |     row-size=72B cardinality=0
 |
@@ -388,7 +388,7 @@ PLAN-ROOT SINK
 |  row-size=239B cardinality=11.00K
 |
 |--02:SCAN HDFS [functional.alltypesnopart t3]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: t3.bool_col = TRUE
 |     runtime filters: RF000 -> t3.int_col
 |     row-size=72B cardinality=0
@@ -399,13 +399,13 @@ PLAN-ROOT SINK
 |  row-size=167B cardinality=11.00K
 |
 |--01:SCAN HDFS [functional.alltypesnopart t2]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: t2.bool_col = FALSE
 |     runtime filters: RF000 -> t2.id, RF002 -> t2.id
 |     row-size=72B cardinality=0
 |
 00:SCAN HDFS [functional.alltypesagg t1]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    runtime filters: RF000 -> t1.`year`, RF002 -> t1.`year`, RF004 -> t1.`year`
    row-size=95B cardinality=11.00K
 ====
@@ -423,7 +423,7 @@ PLAN-ROOT SINK
 |  row-size=400B cardinality=11.00K
 |
 |--04:SCAN HDFS [functional.alltypesnopart t5]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     row-size=72B cardinality=0
 |
 07:HASH JOIN [INNER JOIN]
@@ -432,7 +432,7 @@ PLAN-ROOT SINK
 |  row-size=328B cardinality=11.00K
 |
 |--03:SCAN HDFS [functional.alltypesnopart t4]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     runtime filters: RF001 -> t4.smallint_col
 |     row-size=72B cardinality=0
 |
@@ -442,7 +442,7 @@ PLAN-ROOT SINK
 |  row-size=256B cardinality=11.00K
 |
 |--02:SCAN HDFS [functional.alltypessmall t3]
-|     partitions=4/4 files=4 size=6.32KB
+|     HDFS partitions=4/4 files=4 size=6.32KB
 |     runtime filters: RF004 -> t3.`month`
 |     row-size=89B cardinality=100
 |
@@ -452,12 +452,12 @@ PLAN-ROOT SINK
 |  row-size=167B cardinality=11.00K
 |
 |--01:SCAN HDFS [functional.alltypesnopart t2]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     runtime filters: RF006 -> t2.int_col
 |     row-size=72B cardinality=0
 |
 00:SCAN HDFS [functional.alltypesagg t1]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    runtime filters: RF000 -> t1.`month`, RF008 -> t1.`year`
    row-size=95B cardinality=11.00K
 ====
@@ -475,12 +475,12 @@ PLAN-ROOT SINK
 |  row-size=167B cardinality=11.00K
 |
 |--01:SCAN HDFS [functional.alltypesnopart t2]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: t2.id = 1
 |     row-size=72B cardinality=0
 |
 00:SCAN HDFS [functional.alltypesagg t1]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    row-size=95B cardinality=11.00K
 ====
 # Two-way left outer join query where not all equi-join predicates should
@@ -498,12 +498,12 @@ PLAN-ROOT SINK
 |  row-size=167B cardinality=11.00K
 |
 |--01:SCAN HDFS [functional.alltypesnopart t2]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: t2.id = 2
 |     row-size=72B cardinality=0
 |
 00:SCAN HDFS [functional.alltypesagg t1]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    runtime filters: RF000 -> t1.`month`
    row-size=95B cardinality=11.00K
 ====
@@ -524,7 +524,7 @@ PLAN-ROOT SINK
 |  row-size=383B cardinality=11.00K
 |
 |--04:SCAN HDFS [functional.alltypesnopart t5]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: t5.bool_col = FALSE
 |     row-size=72B cardinality=0
 |
@@ -533,7 +533,7 @@ PLAN-ROOT SINK
 |  row-size=311B cardinality=11.00K
 |
 |--03:SCAN HDFS [functional.alltypesnopart t4]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: t4.bool_col = TRUE
 |     row-size=72B cardinality=0
 |
@@ -542,7 +542,7 @@ PLAN-ROOT SINK
 |  row-size=239B cardinality=11.00K
 |
 |--02:SCAN HDFS [functional.alltypesnopart t3]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: t3.int_col = 1
 |     runtime filters: RF000 -> t3.id
 |     row-size=72B cardinality=0
@@ -552,13 +552,13 @@ PLAN-ROOT SINK
 |  row-size=167B cardinality=11.00K
 |
 |--01:SCAN HDFS [functional.alltypesnopart t2]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: t2.id = 1
 |     runtime filters: RF000 -> t2.int_col
 |     row-size=72B cardinality=0
 |
 00:SCAN HDFS [functional.alltypesagg t1]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    runtime filters: RF000 -> t1.`year`
    row-size=95B cardinality=11.00K
 ====
@@ -579,7 +579,7 @@ PLAN-ROOT SINK
 |  row-size=167B cardinality=0
 |
 |--01:SCAN HDFS [functional.alltypesnopart t2]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: t2.id = 10
 |     row-size=72B cardinality=0
 |
@@ -604,7 +604,7 @@ PLAN-ROOT SINK
 |  row-size=72B cardinality=0
 |
 |--02:SCAN HDFS [functional.alltypesnopart t3]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: t3.id = 1
 |     row-size=72B cardinality=0
 |
@@ -614,11 +614,11 @@ PLAN-ROOT SINK
 |  row-size=95B cardinality=11.00K
 |
 |--01:SCAN HDFS [functional.alltypesnopart t2]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     row-size=4B cardinality=0
 |
 00:SCAN HDFS [functional.alltypesagg t1]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    runtime filters: RF000 -> t1.`month`, RF002 -> t1.`year`
    row-size=95B cardinality=11.00K
 ====
@@ -634,12 +634,12 @@ PLAN-ROOT SINK
 |  row-size=95B cardinality=1.10K
 |
 |--01:SCAN HDFS [functional.alltypesnopart]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: int_col = 10
 |     row-size=8B cardinality=0
 |
 00:SCAN HDFS [functional.alltypesagg t1]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    predicates: t1.int_col < 10
    row-size=95B cardinality=1.10K
 ====
@@ -658,7 +658,7 @@ PLAN-ROOT SINK
 |  row-size=21B cardinality=1
 |
 |--02:SCAN HDFS [functional.alltypesnopart]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: tinyint_col < 10
 |     row-size=9B cardinality=0
 |
@@ -668,7 +668,7 @@ PLAN-ROOT SINK
 |  row-size=12B cardinality=1
 |
 00:SCAN HDFS [functional.alltypesagg t1]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    runtime filters: RF000 -> t1.year
    row-size=4B cardinality=11.00K
 ====
@@ -686,7 +686,7 @@ PLAN-ROOT SINK
 |  row-size=101B cardinality=1
 |
 |--02:SCAN HDFS [functional.alltypes t2]
-|     partitions=24/24 files=24 size=478.45KB
+|     HDFS partitions=24/24 files=24 size=478.45KB
 |     predicates: t2.int_col = 1
 |     row-size=89B cardinality=730
 |
@@ -696,7 +696,7 @@ PLAN-ROOT SINK
 |  row-size=12B cardinality=1
 |
 00:SCAN HDFS [functional.alltypesagg t1]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    row-size=4B cardinality=11.00K
 ====
 # Two-way join query with multiple nested inline views in the probe side of the join
@@ -717,7 +717,7 @@ PLAN-ROOT SINK
 |  row-size=88B cardinality=1
 |
 |--05:SCAN HDFS [functional.alltypesnopart t3]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: t3.id = 1
 |     row-size=72B cardinality=0
 |
@@ -732,7 +732,7 @@ PLAN-ROOT SINK
 |  row-size=12B cardinality=1
 |
 |--02:SCAN HDFS [functional.alltypesnopart t2]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     row-size=4B cardinality=0
 |
 01:AGGREGATE [FINALIZE]
@@ -740,7 +740,7 @@ PLAN-ROOT SINK
 |  row-size=8B cardinality=1
 |
 00:SCAN HDFS [functional.alltypesagg t1]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    runtime filters: RF000 -> t1.year, RF002 -> t1.month
    row-size=8B cardinality=11.00K
 ====
@@ -760,7 +760,7 @@ PLAN-ROOT SINK
 |  row-size=28B cardinality=58.40K
 |
 |--04:SCAN HDFS [functional.alltypestiny c]
-|     partitions=4/4 files=4 size=460B
+|     HDFS partitions=4/4 files=4 size=460B
 |     row-size=4B cardinality=8
 |
 06:HASH JOIN [INNER JOIN]
@@ -769,7 +769,7 @@ PLAN-ROOT SINK
 |  row-size=24B cardinality=14.60K
 |
 |--03:SCAN HDFS [functional.alltypestiny b]
-|     partitions=4/4 files=4 size=460B
+|     HDFS partitions=4/4 files=4 size=460B
 |     predicates: b.int_col < 10
 |     runtime filters: RF000 -> b.year
 |     row-size=8B cardinality=1
@@ -780,7 +780,7 @@ PLAN-ROOT SINK
 |  row-size=16B cardinality=29.20K
 |
 |--02:SCAN HDFS [functional.alltypestiny a]
-|     partitions=4/4 files=4 size=460B
+|     HDFS partitions=4/4 files=4 size=460B
 |     runtime filters: RF000 -> a.year, RF002 -> a.year
 |     row-size=4B cardinality=8
 |
@@ -789,7 +789,7 @@ PLAN-ROOT SINK
 |  row-size=12B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    runtime filters: RF000 -> functional.alltypes.year, RF002 -> functional.alltypes.year, RF004 -> functional.alltypes.year
    row-size=12B cardinality=7.30K
 ====
@@ -807,7 +807,7 @@ PLAN-ROOT SINK
 |  row-size=80B cardinality=10
 |
 |--02:SCAN HDFS [functional.alltypesnopart t2]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: t2.smallint_col = 1
 |     row-size=72B cardinality=0
 |
@@ -816,7 +816,7 @@ PLAN-ROOT SINK
 |  row-size=8B cardinality=10
 |
 00:SCAN HDFS [functional.alltypesagg]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    row-size=8B cardinality=11.00K
 ====
 # Two-way join query with an inline in the probe side of the join that has a union
@@ -834,7 +834,7 @@ PLAN-ROOT SINK
 |  row-size=76B cardinality=11.01K
 |
 |--03:SCAN HDFS [functional.alltypesnopart t3]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: t3.bool_col = FALSE
 |     row-size=72B cardinality=0
 |
@@ -843,12 +843,12 @@ PLAN-ROOT SINK
 |  row-size=4B cardinality=11.01K
 |
 |--02:SCAN HDFS [functional.alltypestiny t2]
-|     partitions=4/4 files=4 size=460B
+|     HDFS partitions=4/4 files=4 size=460B
 |     runtime filters: RF000 -> t2.year
 |     row-size=4B cardinality=8
 |
 01:SCAN HDFS [functional.alltypesagg t1]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    runtime filters: RF000 -> t1.year
    row-size=4B cardinality=11.00K
 ====
@@ -875,7 +875,7 @@ PLAN-ROOT SINK
 |  row-size=12B cardinality=21.90K
 |
 |--04:SCAN HDFS [functional.alltypessmall b]
-|     partitions=4/4 files=4 size=6.32KB
+|     HDFS partitions=4/4 files=4 size=6.32KB
 |     predicates: b.int_col = 1
 |     row-size=8B cardinality=10
 |
@@ -884,17 +884,17 @@ PLAN-ROOT SINK
 |  row-size=4B cardinality=21.90K
 |
 |--03:SCAN HDFS [functional.alltypes]
-|     partitions=24/24 files=24 size=478.45KB
+|     HDFS partitions=24/24 files=24 size=478.45KB
 |     runtime filters: RF000 -> functional.alltypes.month
 |     row-size=4B cardinality=7.30K
 |
 |--02:SCAN HDFS [functional.alltypes]
-|     partitions=24/24 files=24 size=478.45KB
+|     HDFS partitions=24/24 files=24 size=478.45KB
 |     runtime filters: RF000 -> functional.alltypes.month
 |     row-size=4B cardinality=7.30K
 |
 01:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    runtime filters: RF000 -> functional.alltypes.month
    row-size=4B cardinality=7.30K
 ====
@@ -921,7 +921,7 @@ PLAN-ROOT SINK
 |  row-size=16B cardinality=216
 |
 |--05:SCAN HDFS [functional.alltypessmall b]
-|     partitions=4/4 files=4 size=6.32KB
+|     HDFS partitions=4/4 files=4 size=6.32KB
 |     predicates: b.int_col = 1
 |     row-size=8B cardinality=10
 |
@@ -934,17 +934,17 @@ PLAN-ROOT SINK
 |  row-size=8B cardinality=21.90K
 |
 |--03:SCAN HDFS [functional.alltypes]
-|     partitions=24/24 files=24 size=478.45KB
+|     HDFS partitions=24/24 files=24 size=478.45KB
 |     runtime filters: RF000 -> functional.alltypes.month
 |     row-size=8B cardinality=7.30K
 |
 |--02:SCAN HDFS [functional.alltypes]
-|     partitions=24/24 files=24 size=478.45KB
+|     HDFS partitions=24/24 files=24 size=478.45KB
 |     runtime filters: RF000 -> functional.alltypes.month
 |     row-size=8B cardinality=7.30K
 |
 01:SCAN HDFS [functional.alltypes]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    runtime filters: RF000 -> functional.alltypes.month
    row-size=8B cardinality=7.30K
 ====
@@ -966,12 +966,12 @@ PLAN-ROOT SINK
 |  |  row-size=15B cardinality=7.30K
 |  |
 |  |--05:SCAN HDFS [functional.alltypesnopart t4]
-|  |     partitions=1/1 files=0 size=0B
+|  |     HDFS partitions=1/1 files=0 size=0B
 |  |     predicates: t4.bool_col = TRUE
 |  |     row-size=7B cardinality=0
 |  |
 |  04:SCAN HDFS [functional.alltypes t3]
-|     partitions=24/24 files=24 size=478.45KB
+|     HDFS partitions=24/24 files=24 size=478.45KB
 |     runtime filters: RF002 -> t3.`month`
 |     row-size=8B cardinality=7.30K
 |
@@ -981,12 +981,12 @@ PLAN-ROOT SINK
 |  row-size=13B cardinality=11.00K
 |
 |--02:SCAN HDFS [functional.alltypesnopart t2]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: t2.bool_col = FALSE
 |     row-size=9B cardinality=0
 |
 01:SCAN HDFS [functional.alltypesagg t1]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    runtime filters: RF000 -> t1.`year`
    row-size=4B cardinality=11.00K
 ====
@@ -1014,17 +1014,17 @@ PLAN-ROOT SINK
 |  |  row-size=4B cardinality=1.46K
 |  |
 |  |--03:SCAN HDFS [functional.alltypes]
-|  |     partitions=24/24 files=24 size=478.45KB
+|  |     HDFS partitions=24/24 files=24 size=478.45KB
 |  |     predicates: (functional.alltypes.id - functional.alltypes.id) < 1, (functional.alltypes.int_col - functional.alltypes.int_col) < 1
 |  |     row-size=8B cardinality=730
 |  |
 |  02:SCAN HDFS [functional.alltypes]
-|     partitions=24/24 files=24 size=478.45KB
+|     HDFS partitions=24/24 files=24 size=478.45KB
 |     predicates: (functional.alltypes.id - functional.alltypes.id) < 1, (functional.alltypes.int_col - functional.alltypes.int_col) < 1
 |     row-size=8B cardinality=730
 |
 00:SCAN HDFS [functional.alltypes a]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    predicates: (a.id - a.id) < 1
    runtime filters: RF000 -> a.id
    row-size=4B cardinality=730
@@ -1045,7 +1045,7 @@ PLAN-ROOT SINK
 |  row-size=92B cardinality=11.00K
 |
 |--05:SCAN HDFS [functional.alltypesnopart t3]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     predicates: t3.bool_col = FALSE
 |     row-size=72B cardinality=0
 |
@@ -1066,11 +1066,11 @@ PLAN-ROOT SINK
 |  row-size=12B cardinality=11.00K
 |
 |--01:SCAN HDFS [functional.alltypesnopart t2]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     row-size=4B cardinality=0
 |
 00:SCAN HDFS [functional.alltypesagg t1]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    runtime filters: RF000 -> t1.`year`
    row-size=8B cardinality=11.00K
 ====
@@ -1089,7 +1089,7 @@ PLAN-ROOT SINK
 |  row-size=109B cardinality=14.60K
 |
 |--03:SCAN HDFS [functional.alltypestiny v1]
-|     partitions=4/4 files=4 size=460B
+|     HDFS partitions=4/4 files=4 size=460B
 |     predicates: v1.int_col = 2009
 |     row-size=89B cardinality=4
 |
@@ -1106,7 +1106,7 @@ PLAN-ROOT SINK
 |
 00:SCAN HDFS [functional.alltypes]
    partition predicates: functional.alltypes.year = 2009
-   partitions=12/24 files=12 size=238.68KB
+   HDFS partitions=12/24 files=12 size=238.68KB
    row-size=12B cardinality=3.65K
 ====
 # Multi-way join query with a bushy plan
@@ -1138,12 +1138,12 @@ PLAN-ROOT SINK
 |  |  row-size=17B cardinality=0
 |  |
 |  |--06:SCAN HDFS [functional.alltypesnopart t5]
-|  |     partitions=1/1 files=0 size=0B
+|  |     HDFS partitions=1/1 files=0 size=0B
 |  |     predicates: t5.bool_col = TRUE
 |  |     row-size=11B cardinality=0
 |  |
 |  05:SCAN HDFS [functional.alltypesnopart t4]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     row-size=6B cardinality=0
 |
 04:HASH JOIN [INNER JOIN]
@@ -1157,16 +1157,16 @@ PLAN-ROOT SINK
 |  |  row-size=9B cardinality=0
 |  |
 |  |--02:SCAN HDFS [functional.alltypesnopart t3]
-|  |     partitions=1/1 files=0 size=0B
+|  |     HDFS partitions=1/1 files=0 size=0B
 |  |     predicates: t3.bool_col = FALSE
 |  |     row-size=5B cardinality=0
 |  |
 |  01:SCAN HDFS [functional.alltypesnopart t2]
-|     partitions=1/1 files=0 size=0B
+|     HDFS partitions=1/1 files=0 size=0B
 |     row-size=4B cardinality=0
 |
 00:SCAN HDFS [functional.alltypesagg t1]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    runtime filters: RF000 -> t1.month, RF002 -> t1.`year`
    row-size=95B cardinality=11.00K
 ====
@@ -1184,7 +1184,7 @@ PLAN-ROOT SINK
 |  row-size=16B cardinality=4
 |
 |--02:SCAN HDFS [functional.alltypestiny t3]
-|     partitions=4/4 files=4 size=460B
+|     HDFS partitions=4/4 files=4 size=460B
 |     predicates: t3.int_col = 1
 |     row-size=8B cardinality=4
 |
@@ -1194,12 +1194,12 @@ PLAN-ROOT SINK
 |  row-size=8B cardinality=8
 |
 |--01:SCAN HDFS [functional.alltypestiny t2]
-|     partitions=4/4 files=4 size=460B
+|     HDFS partitions=4/4 files=4 size=460B
 |     runtime filters: RF000 -> t2.id
 |     row-size=4B cardinality=8
 |
 00:SCAN HDFS [functional.alltypestiny t1]
-   partitions=4/4 files=4 size=460B
+   HDFS partitions=4/4 files=4 size=460B
    runtime filters: RF000 -> t1.id, RF002 -> t1.id
    row-size=4B cardinality=8
 ====
@@ -1216,7 +1216,7 @@ PLAN-ROOT SINK
 |  row-size=16B cardinality=4
 |
 |--02:SCAN HDFS [functional.alltypestiny t3]
-|     partitions=4/4 files=4 size=460B
+|     HDFS partitions=4/4 files=4 size=460B
 |     predicates: t3.int_col = 1
 |     row-size=8B cardinality=4
 |
@@ -1226,12 +1226,12 @@ PLAN-ROOT SINK
 |  row-size=8B cardinality=8
 |
 |--01:SCAN HDFS [functional.alltypestiny t2]
-|     partitions=4/4 files=4 size=460B
+|     HDFS partitions=4/4 files=4 size=460B
 |     runtime filters: RF000 -> t2.id
 |     row-size=4B cardinality=8
 |
 00:SCAN HDFS [functional.alltypestiny t1]
-   partitions=4/4 files=4 size=460B
+   HDFS partitions=4/4 files=4 size=460B
    runtime filters: RF000 -> t1.id, RF002 -> t1.id
    row-size=4B cardinality=8
 ====
@@ -1265,7 +1265,7 @@ PLAN-ROOT SINK
 |     row-size=32B cardinality=1
 |
 00:SCAN HDFS [tpch_nested_parquet.customer c]
-   partitions=1/1 files=4 size=288.99MB
+   HDFS partitions=1/1 files=4 size=288.99MB
    row-size=32B cardinality=150.00K
 ====
 # Two-way join query where the build side is optimized into an empty set
@@ -1284,7 +1284,7 @@ PLAN-ROOT SINK
 |--01:EMPTYSET
 |
 00:SCAN HDFS [functional.alltypestiny t1]
-   partitions=4/4 files=4 size=460B
+   HDFS partitions=4/4 files=4 size=460B
    runtime filters: RF000 -> t1.id
    row-size=4B cardinality=8
 ====
@@ -1319,7 +1319,7 @@ PLAN-ROOT SINK
 |  row-size=16B cardinality=8
 |
 |--03:SCAN HDFS [functional.alltypestiny t4]
-|     partitions=4/4 files=4 size=460B
+|     HDFS partitions=4/4 files=4 size=460B
 |     row-size=4B cardinality=8
 |
 05:HASH JOIN [INNER JOIN]
@@ -1328,7 +1328,7 @@ PLAN-ROOT SINK
 |  row-size=12B cardinality=8
 |
 |--02:SCAN HDFS [functional.alltypestiny t3]
-|     partitions=4/4 files=4 size=460B
+|     HDFS partitions=4/4 files=4 size=460B
 |     runtime filters: RF000 -> t3.id + t3.id
 |     row-size=4B cardinality=8
 |
@@ -1338,12 +1338,12 @@ PLAN-ROOT SINK
 |  row-size=8B cardinality=8
 |
 |--01:SCAN HDFS [functional.alltypestiny t2]
-|     partitions=4/4 files=4 size=460B
+|     HDFS partitions=4/4 files=4 size=460B
 |     runtime filters: RF000 -> t2.id + t2.id, RF002 -> t2.id
 |     row-size=4B cardinality=8
 |
 00:SCAN HDFS [functional.alltypestiny t1]
-   partitions=4/4 files=4 size=460B
+   HDFS partitions=4/4 files=4 size=460B
    runtime filters: RF000 -> t1.id + t1.id, RF002 -> t1.id, RF004 -> t1.id
    row-size=4B cardinality=8
 ====
@@ -1362,7 +1362,7 @@ PLAN-ROOT SINK
 |  row-size=8B cardinality=23.36K
 |
 |--02:SCAN HDFS [functional.alltypes a4]
-|     partitions=24/24 files=24 size=478.45KB
+|     HDFS partitions=24/24 files=24 size=478.45KB
 |     row-size=2B cardinality=7.30K
 |
 03:HASH JOIN [INNER JOIN]
@@ -1371,12 +1371,12 @@ PLAN-ROOT SINK
 |  row-size=6B cardinality=32
 |
 |--01:SCAN HDFS [functional.alltypestiny a3]
-|     partitions=4/4 files=4 size=460B
+|     HDFS partitions=4/4 files=4 size=460B
 |     runtime filters: RF000 -> a3.smallint_col
 |     row-size=2B cardinality=8
 |
 00:SCAN HDFS [functional.alltypestiny a1]
-   partitions=4/4 files=4 size=460B
+   HDFS partitions=4/4 files=4 size=460B
    runtime filters: RF002 -> a1.int_col
    row-size=4B cardinality=8
 ====
@@ -1398,13 +1398,13 @@ PLAN-ROOT SINK
 |  row-size=4B cardinality=2
 |
 04:HASH JOIN [RIGHT OUTER JOIN]
-|  hash predicates: if(TupleIsNull(), NULL, coalesce(int_col, 384)) = t1.`month`
+|  hash predicates: if(TupleIsNull(3), NULL, coalesce(int_col, 384)) = t1.`month`
 |  runtime filters: RF000 <- t1.`month`
 |  row-size=12B cardinality=8
 |
 |--00:SCAN HDFS [functional.alltypestiny t1]
 |     partition predicates: t1.`month` IS NOT NULL
-|     partitions=4/4 files=4 size=460B
+|     HDFS partitions=4/4 files=4 size=460B
 |     row-size=8B cardinality=8
 |
 03:HASH JOIN [LEFT SEMI JOIN]
@@ -1413,12 +1413,12 @@ PLAN-ROOT SINK
 |  row-size=4B cardinality=115
 |
 |--01:SCAN HDFS [functional.alltypes]
-|     partitions=24/24 files=24 size=478.45KB
+|     HDFS partitions=24/24 files=24 size=478.45KB
 |     runtime filters: RF000 -> coalesce(functional.alltypes.int_col, 384)
 |     row-size=4B cardinality=7.30K
 |
 02:SCAN HDFS [functional.alltypesagg]
-   partitions=11/11 files=11 size=814.73KB
+   HDFS partitions=11/11 files=11 size=814.73KB
    runtime filters: RF000 -> coalesce(int_col, 384), RF002 -> int_col
    row-size=4B cardinality=11.00K
 ====
@@ -1524,11 +1524,11 @@ PLAN-ROOT SINK
 |  |  row-size=64B cardinality=8
 |  |
 |  |--27:SCAN HDFS [functional.alltypestiny b]
-|  |     partitions=4/4 files=4 size=460B
+|  |     HDFS partitions=4/4 files=4 size=460B
 |  |     row-size=32B cardinality=8
 |  |
 |  26:SCAN HDFS [functional.alltypes a]
-|     partitions=24/24 files=24 size=478.45KB
+|     HDFS partitions=24/24 files=24 size=478.45KB
 |     row-size=32B cardinality=7.30K
 |
 35:NESTED LOOP JOIN [CROSS JOIN]
@@ -1539,11 +1539,11 @@ PLAN-ROOT SINK
 |  |  row-size=12B cardinality=7.30K
 |  |
 |  |--24:SCAN HDFS [functional.alltypes b]
-|  |     partitions=24/24 files=24 size=478.45KB
+|  |     HDFS partitions=24/24 files=24 size=478.45KB
 |  |     row-size=6B cardinality=7.30K
 |  |
 |  23:SCAN HDFS [functional.alltypes a]
-|     partitions=24/24 files=24 size=478.45KB
+|     HDFS partitions=24/24 files=24 size=478.45KB
 |     row-size=6B cardinality=7.30K
 |
 34:NESTED LOOP JOIN [CROSS JOIN]
@@ -1554,11 +1554,11 @@ PLAN-ROOT SINK
 |  |  row-size=40B cardinality=8
 |  |
 |  |--21:SCAN HDFS [functional.alltypestiny b]
-|  |     partitions=4/4 files=4 size=460B
+|  |     HDFS partitions=4/4 files=4 size=460B
 |  |     row-size=20B cardinality=8
 |  |
 |  20:SCAN HDFS [functional.alltypes a]
-|     partitions=24/24 files=24 size=478.45KB
+|     HDFS partitions=24/24 files=24 size=478.45KB
 |     row-size=20B cardinality=7.30K
 |
 33:NESTED LOOP JOIN [CROSS JOIN]
@@ -1569,7 +1569,7 @@ PLAN-ROOT SINK
 |  |  row-size=9B cardinality=0
 |  |
 |  |--18:SCAN HDFS [functional.alltypestiny x]
-|  |     partitions=4/4 files=4 size=460B
+|  |     HDFS partitions=4/4 files=4 size=460B
 |  |     row-size=4B cardinality=8
 |  |
 |  17:HASH JOIN [INNER JOIN]
@@ -1577,7 +1577,7 @@ PLAN-ROOT SINK
 |  |  row-size=5B cardinality=0
 |  |
 |  |--16:SCAN HDFS [functional.alltypes b]
-|  |     partitions=24/24 files=24 size=478.45KB
+|  |     HDFS partitions=24/24 files=24 size=478.45KB
 |  |     row-size=4B cardinality=7.30K
 |  |
 |  15:EMPTYSET
@@ -1590,11 +1590,11 @@ PLAN-ROOT SINK
 |  |  row-size=8B cardinality=7.30K
 |  |
 |  |--13:SCAN HDFS [functional.alltypes b]
-|  |     partitions=24/24 files=24 size=478.45KB
+|  |     HDFS partitions=24/24 files=24 size=478.45KB
 |  |     row-size=4B cardinality=7.30K
 |  |
 |  12:SCAN HDFS [functional.alltypes a]
-|     partitions=24/24 files=24 size=478.45KB
+|     HDFS partitions=24/24 files=24 size=478.45KB
 |     row-size=4B cardinality=7.30K
 |
 31:NESTED LOOP JOIN [CROSS JOIN]
@@ -1606,11 +1606,11 @@ PLAN-ROOT SINK
 |  |  row-size=64B cardinality=8
 |  |
 |  |--10:SCAN HDFS [functional.alltypestiny b]
-|  |     partitions=4/4 files=4 size=460B
+|  |     HDFS partitions=4/4 files=4 size=460B
 |  |     row-size=32B cardinality=8
 |  |
 |  09:SCAN HDFS [functional.alltypes a]
-|     partitions=24/24 files=24 size=478.45KB
+|     HDFS partitions=24/24 files=24 size=478.45KB
 |     runtime filters: RF032 -> a.bigint_col, RF033 -> a.bool_col, RF034 -> a.double_col, RF035 -> a.float_col, RF036 -> a.id, RF037 -> a.int_col, RF038 -> a.smallint_col, RF039 -> a.tinyint_col
 |     row-size=32B cardinality=7.30K
 |
@@ -1622,11 +1622,11 @@ PLAN-ROOT SINK
 |  |  row-size=130B cardinality=7.30K
 |  |
 |  |--07:SCAN HDFS [functional.alltypes b]
-|  |     partitions=24/24 files=24 size=478.45KB
+|  |     HDFS partitions=24/24 files=24 size=478.45KB
 |  |     row-size=65B cardinality=7.30K
 |  |
 |  06:SCAN HDFS [functional.alltypes a]
-|     partitions=24/24 files=24 size=478.45KB
+|     HDFS partitions=24/24 files=24 size=478.45KB
 |     row-size=65B cardinality=7.30K
 |
 29:NESTED LOOP JOIN [CROSS JOIN]
@@ -1638,11 +1638,11 @@ PLAN-ROOT SINK
 |  |  row-size=10B cardinality=8
 |  |
 |  |--04:SCAN HDFS [functional.alltypestiny b]
-|  |     partitions=4/4 files=4 size=460B
+|  |     HDFS partitions=4/4 files=4 size=460B
 |  |     row-size=5B cardinality=8
 |  |
 |  03:SCAN HDFS [functional.alltypes a]
-|     partitions=24/24 files=24 size=478.45KB
+|     HDFS partitions=24/24 files=24 size=478.45KB
 |     runtime filters: RF012 -> a.bool_col, RF013 -> a.id
 |     row-size=5B cardinality=7.30K
 |
@@ -1651,11 +1651,11 @@ PLAN-ROOT SINK
 |  row-size=40B cardinality=7.30K
 |
 |--01:SCAN HDFS [functional.alltypes b]
-|     partitions=24/24 files=24 size=478.45KB
+|     HDFS partitions=24/24 files=24 size=478.45KB
 |     row-size=20B cardinality=7.30K
 |
 00:SCAN HDFS [functional.alltypes a]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    row-size=20B cardinality=7.30K
 ====
 # IMPALA-4490: Only generate runtime filters for hash join nodes, even if there is an
@@ -1675,7 +1675,7 @@ PLAN-ROOT SINK
 |  row-size=28B cardinality=7.30K
 |
 |--02:SCAN HDFS [functional.alltypes c]
-|     partitions=24/24 files=24 size=478.45KB
+|     HDFS partitions=24/24 files=24 size=478.45KB
 |     row-size=8B cardinality=7.30K
 |
 03:HASH JOIN [INNER JOIN]
@@ -1684,11 +1684,11 @@ PLAN-ROOT SINK
 |  row-size=20B cardinality=7.30K
 |
 |--00:SCAN HDFS [functional.alltypes a]
-|     partitions=24/24 files=24 size=478.45KB
+|     HDFS partitions=24/24 files=24 size=478.45KB
 |     row-size=4B cardinality=7.30K
 |
 01:SCAN HDFS [functional.alltypes b]
-   partitions=24/24 files=24 size=478.45KB
+   HDFS partitions=24/24 files=24 size=478.45KB
    runtime filters: RF000 -> b.id
    row-size=16B cardinality=7.30K
 ====
@@ -1708,12 +1708,12 @@ PLAN-ROOT SINK
 |  row-size=419B cardinality=4
 |
 |--00:SCAN HDFS [tpch_parquet.lineitem]
-|     partitions=1/1 files=3 size=193.60MB
+|     HDFS partitions=1/1 files=3 size=193.99MB
 |     predicates: l_orderkey = 965
 |     row-size=231B cardinality=4
 |
 01:SCAN HDFS [tpch_parquet.part]
-   partitions=1/1 files=1 size=6.23MB
+   HDFS partitions=1/1 files=1 size=6.24MB
    runtime filters: RF000 -> p_partkey, RF001 -> p_retailprice
    row-size=188B cardinality=200.00K
 ====
@@ -1739,11 +1739,11 @@ PLAN-ROOT SINK
 |  row-size=12B cardinality=32
 |
 |--01:SCAN HDFS [functional.alltypestiny t2]
-|     partitions=4/4 files=4 size=460B
+|     HDFS partitions=4/4 files=4 size=460B
 |     row-size=8B cardinality=8
 |
 00:SCAN HDFS [functional.alltypestiny t1]
-   partitions=4/4 files=4 size=460B
+   HDFS partitions=4/4 files=4 size=460B
    row-size=4B cardinality=8
 ====
 # IMPALA-6286: Same as above but with an inline view.
@@ -1767,11 +1767,11 @@ PLAN-ROOT SINK
 |  row-size=12B cardinality=32
 |
 |--01:SCAN HDFS [functional.alltypestiny t2]
-|     partitions=4/4 files=4 size=460B
+|     HDFS partitions=4/4 files=4 size=460B
 |     row-size=8B cardinality=8
 |
 00:SCAN HDFS [functional.alltypestiny t1]
-   partitions=4/4 files=4 size=460B
+   HDFS partitions=4/4 files=4 size=460B
    row-size=4B cardinality=8
 ====
 # IMPALA-6286: The runtime filter produced by inner join 05 can safely be assigned
@@ -1800,7 +1800,7 @@ PLAN-ROOT SINK
 |  row-size=16B cardinality=32
 |
 |--02:SCAN HDFS [functional.alltypestiny t3]
-|     partitions=4/4 files=4 size=460B
+|     HDFS partitions=4/4 files=4 size=460B
 |     row-size=4B cardinality=8
 |
 04:HASH JOIN [LEFT OUTER JOIN]
@@ -1808,11 +1808,11 @@ PLAN-ROOT SINK
 |  row-size=12B cardinality=32
 |
 |--01:SCAN HDFS [functional.alltypestiny t2]
-|     partitions=4/4 files=4 size=460B
+|     HDFS partitions=4/4 files=4 size=460B
 |     runtime filters: RF000 -> t2.id
 |     row-size=8B cardinality=8
 |
 00:SCAN HDFS [functional.alltypestiny t1]
-   partitions=4/4 files=4 size=460B
+   HDFS partitions=4/4 files=4 size=460B
    row-size=4B cardinality=8
 ====
diff --git a/testdata/workloads/functional-query/queries/QueryTest/nested-types-runtime.test b/testdata/workloads/functional-query/queries/QueryTest/nested-types-runtime.test
index 1f3b966..5f0cb16 100644
--- a/testdata/workloads/functional-query/queries/QueryTest/nested-types-runtime.test
+++ b/testdata/workloads/functional-query/queries/QueryTest/nested-types-runtime.test
@@ -475,7 +475,7 @@ left outer join (
     from complextypestbl t left outer join t.int_array
 ) rightSide
 on leftSide.id = rightSide.id;
----- RESULTS
+---- RESULTS: VERIFY_IS_EQUAL_SORTED
 1,1
 1,1
 1,1