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

michaelsmith 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 0f53e3136 IMPALA-14429: Calcite planner: change mechanism for parsing 
tinyint, smallint
0f53e3136 is described below

commit 0f53e31363dddad918c5f5cf103697b4624d9ede
Author: Steve Carlin <[email protected]>
AuthorDate: Wed Oct 22 17:37:31 2025 -0700

    IMPALA-14429: Calcite planner: change mechanism for parsing tinyint, 
smallint
    
    Calcite and Impala have an inconsistency with datatypes for small integers.
    Calcite will treat all integers that fit within an integer as an integer.
    Impala treats integers more granularly, that is, '1' will be a tinyint and
    '1872' will be a smallint. CALCITE-7120 has been filed within Calcite so
    that eventually Calcite will be compatible with Impala.
    
    For Calcite v1.37, the coercenodes module handles the inconsistency. This is
    done after the RelNodes are created.
    
    In Calcite 1.41, some code was added at the AST level that broke Impala
    since it is too late to manipulate the fields after RelNode creation.
    
    A new mechanism to handle the inconsistency has been added with this commit.
    
    The internal Validator for Calcite calls 'deriveType' which derives the 
proper
    type and this method has been overriden.
    
    At RexBuilder time (where the RexNodes for the RelNodes are created), the
    makeLiteral method is overridden so that the proper type is created.
    ImpalaRexBuilder derives from RexBuilder and provides this method.
    
    A "postAnalysis_" variable within the ImpalaRexBuilder ensures that the
    makeLiteral logic only gets applied at analysis time. At optimization time,
    the Impala code knows the explicit type of the literal that is being
    created, so the RelDataType of the parameter passed in is used.
    
    Testing is already in place for this as we have tests for dealing with
    different size constants. This commit is proactive to the upgrade to
    1.41
    
    Change-Id: I67b6f7711093a4b8488beee0893aea3c72239eb0
    Reviewed-on: http://gerrit.cloudera.org:8080/23724
    Reviewed-by: Michael Smith <[email protected]>
    Tested-by: Michael Smith <[email protected]>
---
 .../impala/calcite/operators/ImpalaRexBuilder.java | 77 ++++++++++++++++++++++
 .../calcite/service/CalciteRelNodeConverter.java   |  9 ++-
 .../calcite/service/ImpalaSqlValidatorImpl.java    | 31 +++++++++
 .../calcite/analytic-rank-pushdown-calcite.test    |  5 +-
 .../PlannerTest/calcite_tpcds/tpcds-q33.test       | 45 ++++++++-----
 .../PlannerTest/calcite_tpcds/tpcds-q40.test       |  6 +-
 .../calcite_tpcds/tpcds-q43-verbose.test           |  5 +-
 .../PlannerTest/calcite_tpcds/tpcds-q43.test       | 15 +++--
 .../PlannerTest/calcite_tpcds/tpcds-q56.test       | 45 ++++++++-----
 .../PlannerTest/calcite_tpcds/tpcds-q60.test       | 45 ++++++++-----
 .../PlannerTest/calcite_tpcds/tpcds-q61.test       | 60 ++++++++++-------
 .../PlannerTest/calcite_tpcds/tpcds-q89.test       |  6 +-
 .../PlannerTest/calcite_tpcds/tpcds-q91.test       | 15 +++--
 13 files changed, 260 insertions(+), 104 deletions(-)

diff --git 
a/java/calcite-planner/src/main/java/org/apache/impala/calcite/operators/ImpalaRexBuilder.java
 
b/java/calcite-planner/src/main/java/org/apache/impala/calcite/operators/ImpalaRexBuilder.java
new file mode 100644
index 000000000..3c210135d
--- /dev/null
+++ 
b/java/calcite-planner/src/main/java/org/apache/impala/calcite/operators/ImpalaRexBuilder.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.impala.calcite.operators;
+
+import org.apache.calcite.rel.type.RelDataType;
+import org.apache.calcite.rel.type.RelDataTypeFactory;
+import org.apache.calcite.rex.RexBuilder;
+import org.apache.calcite.rex.RexLiteral;
+import org.apache.calcite.sql.type.SqlTypeName;
+import org.apache.calcite.sql.type.SqlTypeUtil;
+import org.apache.impala.calcite.type.ImpalaTypeConverter;
+
+import java.math.BigDecimal;
+
+/**
+ * Factory for row expressions.
+ *
+ * See the base class in Calcite for the details about RexBuilder. This 
extension
+ * allows Impala to override functions that need extra work to make RexBuilder
+ * Impala compatible.
+ *
+ * This RexBuilder is used at RelNodeConverter time. The extra 'makeLiteral'
+ * method causes numbers like '3' to be created as a tinyint rather than a
+ * an int (see CALCITE-7120). We do not want to use this at optimization time.
+ * When we do constant folding, we want to create literals with the type that
+ * Impala provides, not the default type.
+ *
+ * For instance, take the expression '1 + 2'.  At parsing time, we want the
+ * individual literals to be tinyints here.  However, after constant folding,
+ * the '3' will be a smallint, as defined by the '+' coercing rules. So we
+ * want the provided 'smallint' type to be used for '3' and thus do not want
+ * to call the makeLiteral in this class.
+ *
+ */
+public class ImpalaRexBuilder extends RexBuilder {
+
+  private boolean postAnalysis_ = false;
+
+  public ImpalaRexBuilder(RelDataTypeFactory typeFactory) {
+    super(typeFactory);
+  }
+
+  public void setPostAnalysis() {
+    postAnalysis_ = true;
+  }
+
+  @Override
+  public RexLiteral makeLiteral(Comparable o, RelDataType type, SqlTypeName 
typeName) {
+    // CALCITE-7120: Calcite always creates tinyint and smallint literals as 
Integer, but
+    // Impala needs them as tinyints and smallints. This should only be done 
during
+    // analysis and pre-optimization. At optimization time, the literal has 
been analyzed
+    // and the type is explicitly set by the Impala caller. For instance, in 
constant
+    // folding, if a '1 + 1' is folded to a '2', the '2' will be explicitly 
set to a
+    // smallint rather than a tinyint because of the "+" operation.
+    if (!postAnalysis_) {
+      if (SqlTypeUtil.isExactNumeric(type) && o instanceof BigDecimal) {
+        BigDecimal bd0 = (BigDecimal) o;
+        type = ImpalaTypeConverter.getLiteralDataType(bd0, type);
+      }
+    }
+    return super.makeLiteral(o, type, typeName);
+  }
+}
diff --git 
a/java/calcite-planner/src/main/java/org/apache/impala/calcite/service/CalciteRelNodeConverter.java
 
b/java/calcite-planner/src/main/java/org/apache/impala/calcite/service/CalciteRelNodeConverter.java
index 517ae8ac5..0a8c96faa 100644
--- 
a/java/calcite-planner/src/main/java/org/apache/impala/calcite/service/CalciteRelNodeConverter.java
+++ 
b/java/calcite-planner/src/main/java/org/apache/impala/calcite/service/CalciteRelNodeConverter.java
@@ -52,6 +52,7 @@ import org.apache.calcite.tools.FrameworkConfig;
 import org.apache.calcite.tools.Frameworks;
 import org.apache.calcite.tools.RelBuilder;
 import org.apache.impala.calcite.operators.ImpalaConvertletTable;
+import org.apache.impala.calcite.operators.ImpalaRexBuilder;
 import org.apache.impala.calcite.rules.ImpalaCoreRules;
 import org.apache.impala.calcite.rules.ImpalaMQContext;
 import org.apache.impala.calcite.rules.ImpalaRexExecutor;
@@ -85,6 +86,8 @@ public class CalciteRelNodeConverter implements CompilerStep {
 
   private final CalciteCatalogReader reader_;
 
+  private final ImpalaRexBuilder rexBuilder_;
+
   public CalciteRelNodeConverter(CalciteAnalysisResult analysisResult) {
     this.typeFactory_ = analysisResult.getTypeFactory();
     this.reader_ = analysisResult.getCatalogReader();
@@ -92,8 +95,8 @@ public class CalciteRelNodeConverter implements CompilerStep {
     this.planner_ = new VolcanoPlanner(ImpalaCost.FACTORY, new 
ImpalaMQContext());
     planner_.addRelTraitDef(ConventionTraitDef.INSTANCE);
     planner_.setExecutor(new RemoveUnraggedCharCastRexExecutor());
-    cluster_ =
-        RelOptCluster.create(planner_, new RexBuilder(typeFactory_));
+    this.rexBuilder_ = new ImpalaRexBuilder(typeFactory_);
+    cluster_ = RelOptCluster.create(planner_, this.rexBuilder_);
     viewExpander_ = createViewExpander(
         
analysisResult.getSqlValidator().getCatalogReader().getRootSchema().plus());
     cluster_.setMetadataProvider(ImpalaRelMetadataProvider.DEFAULT);
@@ -158,6 +161,8 @@ public class CalciteRelNodeConverter implements 
CompilerStep {
         RelDecorrelator.decorrelateQuery(subQueryRemovedPlan, relBuilder);
 
     LogUtil.logDebug(decorrelatedPlan, "Plan after subquery decorrelation 
phase");
+
+    rexBuilder_.setPostAnalysis();
     return decorrelatedPlan;
   }
 
diff --git 
a/java/calcite-planner/src/main/java/org/apache/impala/calcite/service/ImpalaSqlValidatorImpl.java
 
b/java/calcite-planner/src/main/java/org/apache/impala/calcite/service/ImpalaSqlValidatorImpl.java
index 43e908979..f0e6a330f 100644
--- 
a/java/calcite-planner/src/main/java/org/apache/impala/calcite/service/ImpalaSqlValidatorImpl.java
+++ 
b/java/calcite-planner/src/main/java/org/apache/impala/calcite/service/ImpalaSqlValidatorImpl.java
@@ -20,6 +20,7 @@ package org.apache.impala.calcite.service;
 import com.google.common.base.Preconditions;
 
 import org.apache.calcite.prepare.RelOptTableImpl;
+import org.apache.calcite.rel.type.RelDataType;
 import org.apache.calcite.rel.type.RelDataTypeFactory;
 import org.apache.calcite.sql.validate.SqlNameMatcher;
 import org.apache.calcite.sql.validate.SqlQualified;
@@ -35,17 +36,23 @@ import org.apache.calcite.sql.SqlOperatorTable;
 import org.apache.calcite.sql.SqlCall;
 import org.apache.calcite.sql.SqlFunction;
 import org.apache.calcite.sql.SqlIdentifier;
+import org.apache.calcite.sql.SqlNode;
+import org.apache.calcite.sql.SqlNumericLiteral;
 import org.apache.calcite.sql.SqlOperator;
+import org.apache.calcite.sql.SqlUtil;
 import org.apache.impala.analysis.Analyzer;
 import org.apache.impala.authorization.Privilege;
 import org.apache.impala.calcite.schema.CalciteTable;
 import org.apache.impala.calcite.schema.ImpalaViewTable;
+import org.apache.impala.calcite.type.ImpalaTypeConverter;
 import org.apache.impala.catalog.BuiltinsDb;
 import org.apache.impala.catalog.FeView;
 import org.apache.impala.catalog.FeFsTable;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import java.math.BigDecimal;
+
 /**
  * The ImpalaSqlValidatorImpl is responsible for registering column-level and
  * function-level privilege requests in the given query. The methods in the 
class will be
@@ -65,6 +72,30 @@ public class ImpalaSqlValidatorImpl extends SqlValidatorImpl 
{
     analyzer_ = analyzer;
   }
 
+  /**
+   * Override of deriveType needed for IMPALA-14429 and
+   * CALCITE-7120.
+   *
+   * Calcite always treats numerics like '1' as an integer, whereas
+   * Impala treats this as a tinyint. So the derived type is overridden
+   * to produce Impala's derived type rather than Calcite's derived type.
+   */
+  @Override
+  public RelDataType deriveType(
+      SqlValidatorScope scope,
+      SqlNode operand) {
+    if (operand instanceof SqlNumericLiteral) {
+      SqlNumericLiteral numeric = (SqlNumericLiteral) operand;
+      if (numeric.isInteger()) {
+        RelDataType type = ImpalaTypeConverter.getLiteralDataType(
+            new BigDecimal(numeric.toValue()), null);
+        setValidatedNodeType(operand, type);
+        return type;
+      }
+    }
+    return super.deriveType(scope, operand);
+  }
+
   @Override public void validateIdentifier(SqlIdentifier id, SqlValidatorScope 
scope) {
     super.validateIdentifier(id, scope);
     // It is a bit inefficient to execute scope.fullyQualify() again because 
this has
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/calcite/analytic-rank-pushdown-calcite.test
 
b/testdata/workloads/functional-planner/queries/PlannerTest/calcite/analytic-rank-pushdown-calcite.test
index 24dc0c210..6fd556a9b 100644
--- 
a/testdata/workloads/functional-planner/queries/PlannerTest/calcite/analytic-rank-pushdown-calcite.test
+++ 
b/testdata/workloads/functional-planner/queries/PlannerTest/calcite/analytic-rank-pushdown-calcite.test
@@ -784,12 +784,9 @@ where rownum <= 20
 PLAN-ROOT SINK
 |
 00:UNION
+|  constant-operands=1
 |  row-size=16B cardinality=21
 |
-|--05:UNION
-|     constant-operands=1
-|     row-size=12B cardinality=1
-|
 04:SELECT
 |  predicates: row_number() <= 20
 |  row-size=31B cardinality=20
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q33.test
 
b/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q33.test
index 33b11573c..ede162a46 100644
--- 
a/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q33.test
+++ 
b/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q33.test
@@ -161,12 +161,13 @@ PLAN-ROOT SINK
 |  |
 |  |--25:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address]
 |  |     HDFS partitions=1/1 files=1 size=307.36MB
-|  |     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-6 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk IS NOT NULL
+|  |     predicates: 
tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk 
IS NOT NULL
 |  |     stored statistics:
 |  |       table: rows=15.00M size=307.36MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-6 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk IS NOT NULL
+|  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0))
+|  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk 
IS NOT NULL
 |  |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |  |     tuple-ids=27 row-size=8B cardinality=2.43M cost=2571000
 |  |     in pipelines: 25(GETNEXT)
@@ -271,12 +272,13 @@ PLAN-ROOT SINK
 |  |
 |  |--15:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address]
 |  |     HDFS partitions=1/1 files=1 size=307.36MB
-|  |     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-6 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk IS NOT NULL
+|  |     predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk 
IS NOT NULL
 |  |     stored statistics:
 |  |       table: rows=15.00M size=307.36MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-6 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk IS NOT NULL
+|  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0))
+|  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk 
IS NOT NULL
 |  |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |  |     tuple-ids=15 row-size=8B cardinality=2.43M cost=2571000
 |  |     in pipelines: 15(GETNEXT)
@@ -375,12 +377,13 @@ PLAN-ROOT SINK
 |
 |--05:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address]
 |     HDFS partitions=1/1 files=1 size=307.36MB
-|     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-6 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|     predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |     stored statistics:
 |       table: rows=15.00M size=307.36MB
 |       columns: all
 |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-6 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0))
+|     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |     tuple-ids=4 row-size=8B cardinality=2.43M cost=2571000
 |     in pipelines: 05(GETNEXT)
@@ -599,12 +602,13 @@ max-parallelism=60 segment-costs=[59409, 59409, 59409, 
8325, 5176] cpu-compariso
 |  |  max-parallelism=10 segment-costs=[2675761]
 |  |  25:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address, RANDOM]
 |  |     HDFS partitions=1/1 files=1 size=307.36MB
-|  |     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-6 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk IS NOT NULL
+|  |     predicates: 
tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk 
IS NOT NULL
 |  |     stored statistics:
 |  |       table: rows=15.00M size=307.36MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-6 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk IS NOT NULL
+|  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0))
+|  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk 
IS NOT NULL
 |  |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |  |     tuple-ids=27 row-size=8B cardinality=2.43M cost=2571000
 |  |     in pipelines: 25(GETNEXT)
@@ -793,12 +797,13 @@ max-parallelism=60 segment-costs=[59409, 59409, 59409, 
8325, 5176] cpu-compariso
 |  |  max-parallelism=10 segment-costs=[2675761]
 |  |  15:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address, RANDOM]
 |  |     HDFS partitions=1/1 files=1 size=307.36MB
-|  |     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-6 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk IS NOT NULL
+|  |     predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk 
IS NOT NULL
 |  |     stored statistics:
 |  |       table: rows=15.00M size=307.36MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-6 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk IS NOT NULL
+|  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0))
+|  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk 
IS NOT NULL
 |  |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |  |     tuple-ids=15 row-size=8B cardinality=2.43M cost=2571000
 |  |     in pipelines: 15(GETNEXT)
@@ -982,12 +987,13 @@ max-parallelism=60 segment-costs=[562543053, 207079] 
cpu-comparison-result=60 [m
 |  max-parallelism=10 segment-costs=[2675761]
 |  05:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address, RANDOM]
 |     HDFS partitions=1/1 files=1 size=307.36MB
-|     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-6 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|     predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |     stored statistics:
 |       table: rows=15.00M size=307.36MB
 |       columns: all
 |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-6 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0))
+|     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |     tuple-ids=4 row-size=8B cardinality=2.43M cost=2571000
 |     in pipelines: 05(GETNEXT)
@@ -1223,12 +1229,13 @@ max-parallelism=60 segment-costs=[59409, 59409, 59409, 
8325, 5176] cpu-compariso
 |  |  max-parallelism=10 segment-costs=[2675761]
 |  |  25:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address, RANDOM]
 |  |     HDFS partitions=1/1 files=1 size=307.36MB
-|  |     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-6 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk IS NOT NULL
+|  |     predicates: 
tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk 
IS NOT NULL
 |  |     stored statistics:
 |  |       table: rows=15.00M size=307.36MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-6 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk IS NOT NULL
+|  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0))
+|  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk 
IS NOT NULL
 |  |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |  |     tuple-ids=27 row-size=8B cardinality=2.43M cost=2571000
 |  |     in pipelines: 25(GETNEXT)
@@ -1417,12 +1424,13 @@ max-parallelism=60 segment-costs=[59409, 59409, 59409, 
8325, 5176] cpu-compariso
 |  |  max-parallelism=10 segment-costs=[2675761]
 |  |  15:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address, RANDOM]
 |  |     HDFS partitions=1/1 files=1 size=307.36MB
-|  |     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-6 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk IS NOT NULL
+|  |     predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk 
IS NOT NULL
 |  |     stored statistics:
 |  |       table: rows=15.00M size=307.36MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-6 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk IS NOT NULL
+|  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0))
+|  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk 
IS NOT NULL
 |  |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |  |     tuple-ids=15 row-size=8B cardinality=2.43M cost=2571000
 |  |     in pipelines: 15(GETNEXT)
@@ -1606,12 +1614,13 @@ max-parallelism=60 segment-costs=[562543053, 207079] 
cpu-comparison-result=60 [m
 |  max-parallelism=10 segment-costs=[2675761]
 |  05:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address, RANDOM]
 |     HDFS partitions=1/1 files=1 size=307.36MB
-|     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-6 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|     predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |     stored statistics:
 |       table: rows=15.00M size=307.36MB
 |       columns: all
 |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-6 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0))
+|     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |     tuple-ids=4 row-size=8B cardinality=2.43M cost=2571000
 |     in pipelines: 05(GETNEXT)
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q40.test
 
b/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q40.test
index 8b564a027..9692e76ba 100644
--- 
a/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q40.test
+++ 
b/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q40.test
@@ -44,7 +44,7 @@ PLAN-ROOT SINK
 |  in pipelines: 10(GETNEXT), 09(OPEN)
 |
 09:AGGREGATE [FINALIZE]
-|  output: sum(CASE WHEN tpcds_partitioned_parquet_snap.date_dim.d_date < DATE 
'1999-02-02' THEN 
CAST(subtract(tpcds_partitioned_parquet_snap.catalog_sales.cs_sales_price, 
coalesce(tpcds_partitioned_parquet_snap.catalog_returns.cr_refunded_cash, 
CAST(0 AS DECIMAL(7,2)))) AS DECIMAL(12,2)) ELSE CAST(0 AS DECIMAL(12,2)) END), 
sum(CASE WHEN tpcds_partitioned_parquet_snap.date_dim.d_date >= DATE 
'1999-02-02' THEN 
CAST(subtract(tpcds_partitioned_parquet_snap.catalog_sales.cs_sales_price, coal 
[...]
+|  output: sum(CASE WHEN tpcds_partitioned_parquet_snap.date_dim.d_date < DATE 
'1999-02-02' THEN 
subtract(tpcds_partitioned_parquet_snap.catalog_sales.cs_sales_price, 
coalesce(tpcds_partitioned_parquet_snap.catalog_returns.cr_refunded_cash, 
CAST(0 AS DECIMAL(7,2)))) ELSE CAST(0 AS DECIMAL(8,2)) END), sum(CASE WHEN 
tpcds_partitioned_parquet_snap.date_dim.d_date >= DATE '1999-02-02' THEN 
subtract(tpcds_partitioned_parquet_snap.catalog_sales.cs_sales_price, 
coalesce(tpcds_partitioned_parque [...]
 |  group by: tpcds_partitioned_parquet_snap.warehouse.w_state, 
tpcds_partitioned_parquet_snap.item.i_item_id
 |  mem-estimate=197.86MB mem-reservation=34.00MB spill-buffer=2.00MB 
thread-reservation=0
 |  tuple-ids=10 row-size=74B cardinality=2.41M cost=628267210
@@ -187,7 +187,7 @@ F02:PLAN FRAGMENT 
[HASH(tpcds_partitioned_parquet_snap.catalog_sales.cs_item_sk,
 Per-Instance Resources: mem-estimate=226.37MB mem-reservation=34.00MB 
thread-reservation=1
 max-parallelism=320 segment-costs=[3171158934, 1179595953] 
cpu-comparison-result=210 [max(210 (self) vs 206 (sum children))]
 09:AGGREGATE [STREAMING]
-|  output: sum(CASE WHEN tpcds_partitioned_parquet_snap.date_dim.d_date < DATE 
'1999-02-02' THEN 
CAST(subtract(tpcds_partitioned_parquet_snap.catalog_sales.cs_sales_price, 
coalesce(tpcds_partitioned_parquet_snap.catalog_returns.cr_refunded_cash, 
CAST(0 AS DECIMAL(7,2)))) AS DECIMAL(12,2)) ELSE CAST(0 AS DECIMAL(12,2)) END), 
sum(CASE WHEN tpcds_partitioned_parquet_snap.date_dim.d_date >= DATE 
'1999-02-02' THEN 
CAST(subtract(tpcds_partitioned_parquet_snap.catalog_sales.cs_sales_price, coal 
[...]
+|  output: sum(CASE WHEN tpcds_partitioned_parquet_snap.date_dim.d_date < DATE 
'1999-02-02' THEN 
subtract(tpcds_partitioned_parquet_snap.catalog_sales.cs_sales_price, 
coalesce(tpcds_partitioned_parquet_snap.catalog_returns.cr_refunded_cash, 
CAST(0 AS DECIMAL(7,2)))) ELSE CAST(0 AS DECIMAL(8,2)) END), sum(CASE WHEN 
tpcds_partitioned_parquet_snap.date_dim.d_date >= DATE '1999-02-02' THEN 
subtract(tpcds_partitioned_parquet_snap.catalog_sales.cs_sales_price, 
coalesce(tpcds_partitioned_parque [...]
 |  group by: tpcds_partitioned_parquet_snap.warehouse.w_state, 
tpcds_partitioned_parquet_snap.item.i_item_id
 |  mem-estimate=197.86MB mem-reservation=34.00MB spill-buffer=2.00MB 
thread-reservation=0
 |  tuple-ids=10 row-size=74B cardinality=223.37M cost=1628893885
@@ -408,7 +408,7 @@ F02:PLAN FRAGMENT 
[HASH(tpcds_partitioned_parquet_snap.catalog_sales.cs_item_sk,
 Per-Instance Resources: mem-estimate=226.37MB mem-reservation=34.00MB 
thread-reservation=1
 max-parallelism=320 segment-costs=[3171158934, 1179595953] 
cpu-comparison-result=210 [max(210 (self) vs 206 (sum children))]
 09:AGGREGATE [STREAMING]
-|  output: sum(CASE WHEN tpcds_partitioned_parquet_snap.date_dim.d_date < DATE 
'1999-02-02' THEN 
CAST(subtract(tpcds_partitioned_parquet_snap.catalog_sales.cs_sales_price, 
coalesce(tpcds_partitioned_parquet_snap.catalog_returns.cr_refunded_cash, 
CAST(0 AS DECIMAL(7,2)))) AS DECIMAL(12,2)) ELSE CAST(0 AS DECIMAL(12,2)) END), 
sum(CASE WHEN tpcds_partitioned_parquet_snap.date_dim.d_date >= DATE 
'1999-02-02' THEN 
CAST(subtract(tpcds_partitioned_parquet_snap.catalog_sales.cs_sales_price, coal 
[...]
+|  output: sum(CASE WHEN tpcds_partitioned_parquet_snap.date_dim.d_date < DATE 
'1999-02-02' THEN 
subtract(tpcds_partitioned_parquet_snap.catalog_sales.cs_sales_price, 
coalesce(tpcds_partitioned_parquet_snap.catalog_returns.cr_refunded_cash, 
CAST(0 AS DECIMAL(7,2)))) ELSE CAST(0 AS DECIMAL(8,2)) END), sum(CASE WHEN 
tpcds_partitioned_parquet_snap.date_dim.d_date >= DATE '1999-02-02' THEN 
subtract(tpcds_partitioned_parquet_snap.catalog_sales.cs_sales_price, 
coalesce(tpcds_partitioned_parque [...]
 |  group by: tpcds_partitioned_parquet_snap.warehouse.w_state, 
tpcds_partitioned_parquet_snap.item.i_item_id
 |  mem-estimate=197.86MB mem-reservation=34.00MB spill-buffer=2.00MB 
thread-reservation=0
 |  tuple-ids=10 row-size=74B cardinality=223.37M cost=1628893885
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q43-verbose.test
 
b/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q43-verbose.test
index 5b546b64b..81bed0320 100644
--- 
a/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q43-verbose.test
+++ 
b/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q43-verbose.test
@@ -148,12 +148,13 @@ SumCost: cost-total=673 max-instances=1 adj-instances=1 
cost/inst=673 #cons:#pro
   |  cost-total=54 max-instances=1 adj-instances=1 cost/inst=54 
#cons:#prod=336:336 reduction=1.0 cost/cons=0.16071428 cost/prod=0.16071428 
raw-cost=54.3753
   03:SCAN HDFS [tpcds_partitioned_parquet_snap.store, RANDOM]
      HDFS partitions=1/1 files=1 size=119.76KB
-     predicates: CAST(tpcds_partitioned_parquet_snap.store.s_gmt_offset AS 
DECIMAL(12,2)) = CAST(-6 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.store.s_store_sk IS NOT NULL
+     predicates: tpcds_partitioned_parquet_snap.store.s_gmt_offset = CAST(-6 
AS DECIMAL(3,0)), tpcds_partitioned_parquet_snap.store.s_store_sk IS NOT NULL
      stored statistics:
        table: rows=1.35K size=119.76KB
        columns: all
      extrapolated-rows=disabled max-scan-range-rows=1.35K
-     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.store.s_gmt_offset AS DECIMAL(12,2)) = 
CAST(-6 AS DECIMAL(12,2)), tpcds_partitioned_parquet_snap.store.s_store_sk IS 
NOT NULL
+     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.store.s_gmt_offset = CAST(-6 AS DECIMAL(3,0))
+     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.store.s_gmt_offset = CAST(-6 AS DECIMAL(3,0)), 
tpcds_partitioned_parquet_snap.store.s_store_sk IS NOT NULL
      file formats: [PARQUET]
      mem-estimate=16.00MB mem-reservation=32.00KB thread-reservation=0
      cost-total=619 max-instances=1 adj-instances=1 cost/inst=619 
#cons:#prod=1350:336 reduction=4.017857 cost/cons=0.4585185 cost/prod=1.8422619 
raw-cost=619.0092
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q43.test
 
b/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q43.test
index 9639b8415..f8122e60a 100644
--- 
a/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q43.test
+++ 
b/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q43.test
@@ -51,12 +51,13 @@ PLAN-ROOT SINK
 |
 |--03:SCAN HDFS [tpcds_partitioned_parquet_snap.store]
 |     HDFS partitions=1/1 files=1 size=119.76KB
-|     predicates: CAST(tpcds_partitioned_parquet_snap.store.s_gmt_offset AS 
DECIMAL(12,2)) = CAST(-6 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.store.s_store_sk IS NOT NULL
+|     predicates: tpcds_partitioned_parquet_snap.store.s_gmt_offset = CAST(-6 
AS DECIMAL(3,0)), tpcds_partitioned_parquet_snap.store.s_store_sk IS NOT NULL
 |     stored statistics:
 |       table: rows=1.35K size=119.76KB
 |       columns: all
 |     extrapolated-rows=disabled max-scan-range-rows=1.35K
-|     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.store.s_gmt_offset AS DECIMAL(12,2)) = 
CAST(-6 AS DECIMAL(12,2)), tpcds_partitioned_parquet_snap.store.s_store_sk IS 
NOT NULL
+|     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.store.s_gmt_offset = CAST(-6 AS DECIMAL(3,0))
+|     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.store.s_gmt_offset = CAST(-6 AS DECIMAL(3,0)), 
tpcds_partitioned_parquet_snap.store.s_store_sk IS NOT NULL
 |     mem-estimate=16.00MB mem-reservation=32.00KB thread-reservation=0
 |     tuple-ids=4 row-size=52B cardinality=336 cost=619
 |     in pipelines: 03(GETNEXT)
@@ -172,12 +173,13 @@ max-parallelism=310 segment-costs=[3058023158, 1710341] 
cpu-comparison-result=12
 |  max-parallelism=1 segment-costs=[673]
 |  03:SCAN HDFS [tpcds_partitioned_parquet_snap.store, RANDOM]
 |     HDFS partitions=1/1 files=1 size=119.76KB
-|     predicates: CAST(tpcds_partitioned_parquet_snap.store.s_gmt_offset AS 
DECIMAL(12,2)) = CAST(-6 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.store.s_store_sk IS NOT NULL
+|     predicates: tpcds_partitioned_parquet_snap.store.s_gmt_offset = CAST(-6 
AS DECIMAL(3,0)), tpcds_partitioned_parquet_snap.store.s_store_sk IS NOT NULL
 |     stored statistics:
 |       table: rows=1.35K size=119.76KB
 |       columns: all
 |     extrapolated-rows=disabled max-scan-range-rows=1.35K
-|     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.store.s_gmt_offset AS DECIMAL(12,2)) = 
CAST(-6 AS DECIMAL(12,2)), tpcds_partitioned_parquet_snap.store.s_store_sk IS 
NOT NULL
+|     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.store.s_gmt_offset = CAST(-6 AS DECIMAL(3,0))
+|     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.store.s_gmt_offset = CAST(-6 AS DECIMAL(3,0)), 
tpcds_partitioned_parquet_snap.store.s_store_sk IS NOT NULL
 |     mem-estimate=16.00MB mem-reservation=32.00KB thread-reservation=0
 |     tuple-ids=4 row-size=52B cardinality=336 cost=619
 |     in pipelines: 03(GETNEXT)
@@ -310,12 +312,13 @@ max-parallelism=310 segment-costs=[3058023158, 1710341] 
cpu-comparison-result=12
 |  max-parallelism=1 segment-costs=[673]
 |  03:SCAN HDFS [tpcds_partitioned_parquet_snap.store, RANDOM]
 |     HDFS partitions=1/1 files=1 size=119.76KB
-|     predicates: CAST(tpcds_partitioned_parquet_snap.store.s_gmt_offset AS 
DECIMAL(12,2)) = CAST(-6 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.store.s_store_sk IS NOT NULL
+|     predicates: tpcds_partitioned_parquet_snap.store.s_gmt_offset = CAST(-6 
AS DECIMAL(3,0)), tpcds_partitioned_parquet_snap.store.s_store_sk IS NOT NULL
 |     stored statistics:
 |       table: rows=1.35K size=119.76KB
 |       columns: all
 |     extrapolated-rows=disabled max-scan-range-rows=1.35K
-|     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.store.s_gmt_offset AS DECIMAL(12,2)) = 
CAST(-6 AS DECIMAL(12,2)), tpcds_partitioned_parquet_snap.store.s_store_sk IS 
NOT NULL
+|     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.store.s_gmt_offset = CAST(-6 AS DECIMAL(3,0))
+|     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.store.s_gmt_offset = CAST(-6 AS DECIMAL(3,0)), 
tpcds_partitioned_parquet_snap.store.s_store_sk IS NOT NULL
 |     mem-estimate=16.00MB mem-reservation=32.00KB thread-reservation=0
 |     tuple-ids=4 row-size=52B cardinality=336 cost=619
 |     in pipelines: 03(GETNEXT)
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q56.test
 
b/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q56.test
index b5c316462..65c861052 100644
--- 
a/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q56.test
+++ 
b/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q56.test
@@ -155,12 +155,13 @@ PLAN-ROOT SINK
 |  |
 |  |--25:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address]
 |  |     HDFS partitions=1/1 files=1 size=307.36MB
-|  |     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk IS NOT NULL
+|  |     predicates: 
tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk 
IS NOT NULL
 |  |     stored statistics:
 |  |       table: rows=15.00M size=307.36MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk IS NOT NULL
+|  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0))
+|  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk 
IS NOT NULL
 |  |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |  |     tuple-ids=27 row-size=8B cardinality=2.43M cost=2571000
 |  |     in pipelines: 25(GETNEXT)
@@ -265,12 +266,13 @@ PLAN-ROOT SINK
 |  |
 |  |--15:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address]
 |  |     HDFS partitions=1/1 files=1 size=307.36MB
-|  |     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk IS NOT NULL
+|  |     predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk 
IS NOT NULL
 |  |     stored statistics:
 |  |       table: rows=15.00M size=307.36MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk IS NOT NULL
+|  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0))
+|  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk 
IS NOT NULL
 |  |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |  |     tuple-ids=15 row-size=8B cardinality=2.43M cost=2571000
 |  |     in pipelines: 15(GETNEXT)
@@ -369,12 +371,13 @@ PLAN-ROOT SINK
 |
 |--05:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address]
 |     HDFS partitions=1/1 files=1 size=307.36MB
-|     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|     predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |     stored statistics:
 |       table: rows=15.00M size=307.36MB
 |       columns: all
 |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0))
+|     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |     tuple-ids=4 row-size=8B cardinality=2.43M cost=2571000
 |     in pipelines: 05(GETNEXT)
@@ -594,12 +597,13 @@ max-parallelism=60 segment-costs=[3009167, 1914295, 
1228691, 1614300, 1290683] c
 |  |  max-parallelism=10 segment-costs=[2675761]
 |  |  25:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address, RANDOM]
 |  |     HDFS partitions=1/1 files=1 size=307.36MB
-|  |     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk IS NOT NULL
+|  |     predicates: 
tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk 
IS NOT NULL
 |  |     stored statistics:
 |  |       table: rows=15.00M size=307.36MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk IS NOT NULL
+|  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0))
+|  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk 
IS NOT NULL
 |  |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |  |     tuple-ids=27 row-size=8B cardinality=2.43M cost=2571000
 |  |     in pipelines: 25(GETNEXT)
@@ -789,12 +793,13 @@ max-parallelism=60 segment-costs=[3009167, 1914295, 
1228691, 1614300, 1290683] c
 |  |  max-parallelism=10 segment-costs=[2675761]
 |  |  15:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address, RANDOM]
 |  |     HDFS partitions=1/1 files=1 size=307.36MB
-|  |     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk IS NOT NULL
+|  |     predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk 
IS NOT NULL
 |  |     stored statistics:
 |  |       table: rows=15.00M size=307.36MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk IS NOT NULL
+|  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0))
+|  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk 
IS NOT NULL
 |  |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |  |     tuple-ids=15 row-size=8B cardinality=2.43M cost=2571000
 |  |     in pipelines: 15(GETNEXT)
@@ -978,12 +983,13 @@ max-parallelism=60 segment-costs=[540745133, 13955253] 
cpu-comparison-result=60
 |  max-parallelism=10 segment-costs=[2675761]
 |  05:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address, RANDOM]
 |     HDFS partitions=1/1 files=1 size=307.36MB
-|     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|     predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |     stored statistics:
 |       table: rows=15.00M size=307.36MB
 |       columns: all
 |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0))
+|     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |     tuple-ids=4 row-size=8B cardinality=2.43M cost=2571000
 |     in pipelines: 05(GETNEXT)
@@ -1220,12 +1226,13 @@ max-parallelism=60 segment-costs=[3009167, 1914295, 
1228691, 1614300, 1290683] c
 |  |  max-parallelism=10 segment-costs=[2675761]
 |  |  25:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address, RANDOM]
 |  |     HDFS partitions=1/1 files=1 size=307.36MB
-|  |     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk IS NOT NULL
+|  |     predicates: 
tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk 
IS NOT NULL
 |  |     stored statistics:
 |  |       table: rows=15.00M size=307.36MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk IS NOT NULL
+|  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0))
+|  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk 
IS NOT NULL
 |  |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |  |     tuple-ids=27 row-size=8B cardinality=2.43M cost=2571000
 |  |     in pipelines: 25(GETNEXT)
@@ -1415,12 +1422,13 @@ max-parallelism=60 segment-costs=[3009167, 1914295, 
1228691, 1614300, 1290683] c
 |  |  max-parallelism=10 segment-costs=[2675761]
 |  |  15:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address, RANDOM]
 |  |     HDFS partitions=1/1 files=1 size=307.36MB
-|  |     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk IS NOT NULL
+|  |     predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk 
IS NOT NULL
 |  |     stored statistics:
 |  |       table: rows=15.00M size=307.36MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk IS NOT NULL
+|  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0))
+|  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk 
IS NOT NULL
 |  |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |  |     tuple-ids=15 row-size=8B cardinality=2.43M cost=2571000
 |  |     in pipelines: 15(GETNEXT)
@@ -1604,12 +1612,13 @@ max-parallelism=60 segment-costs=[540745133, 13955253] 
cpu-comparison-result=60
 |  max-parallelism=10 segment-costs=[2675761]
 |  05:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address, RANDOM]
 |     HDFS partitions=1/1 files=1 size=307.36MB
-|     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|     predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |     stored statistics:
 |       table: rows=15.00M size=307.36MB
 |       columns: all
 |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0))
+|     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |     tuple-ids=4 row-size=8B cardinality=2.43M cost=2571000
 |     in pipelines: 05(GETNEXT)
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q60.test
 
b/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q60.test
index c9ba4e676..68bb86f24 100644
--- 
a/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q60.test
+++ 
b/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q60.test
@@ -164,12 +164,13 @@ PLAN-ROOT SINK
 |  |
 |  |--25:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address]
 |  |     HDFS partitions=1/1 files=1 size=307.36MB
-|  |     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk IS NOT NULL
+|  |     predicates: 
tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk 
IS NOT NULL
 |  |     stored statistics:
 |  |       table: rows=15.00M size=307.36MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk IS NOT NULL
+|  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0))
+|  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk 
IS NOT NULL
 |  |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |  |     tuple-ids=27 row-size=8B cardinality=2.43M cost=2571000
 |  |     in pipelines: 25(GETNEXT)
@@ -274,12 +275,13 @@ PLAN-ROOT SINK
 |  |
 |  |--15:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address]
 |  |     HDFS partitions=1/1 files=1 size=307.36MB
-|  |     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk IS NOT NULL
+|  |     predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk 
IS NOT NULL
 |  |     stored statistics:
 |  |       table: rows=15.00M size=307.36MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk IS NOT NULL
+|  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0))
+|  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk 
IS NOT NULL
 |  |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |  |     tuple-ids=15 row-size=8B cardinality=2.43M cost=2571000
 |  |     in pipelines: 15(GETNEXT)
@@ -378,12 +380,13 @@ PLAN-ROOT SINK
 |
 |--05:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address]
 |     HDFS partitions=1/1 files=1 size=307.36MB
-|     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|     predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |     stored statistics:
 |       table: rows=15.00M size=307.36MB
 |       columns: all
 |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0))
+|     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |     tuple-ids=4 row-size=8B cardinality=2.43M cost=2571000
 |     in pipelines: 05(GETNEXT)
@@ -603,12 +606,13 @@ max-parallelism=60 segment-costs=[6819259, 4400373, 
2635532, 1614300, 1290683] c
 |  |  max-parallelism=10 segment-costs=[2675761]
 |  |  25:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address, RANDOM]
 |  |     HDFS partitions=1/1 files=1 size=307.36MB
-|  |     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk IS NOT NULL
+|  |     predicates: 
tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk 
IS NOT NULL
 |  |     stored statistics:
 |  |       table: rows=15.00M size=307.36MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk IS NOT NULL
+|  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0))
+|  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk 
IS NOT NULL
 |  |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |  |     tuple-ids=27 row-size=8B cardinality=2.43M cost=2571000
 |  |     in pipelines: 25(GETNEXT)
@@ -798,12 +802,13 @@ max-parallelism=60 segment-costs=[6819259, 4400373, 
2635532, 1614300, 1290683] c
 |  |  max-parallelism=10 segment-costs=[2675761]
 |  |  15:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address, RANDOM]
 |  |     HDFS partitions=1/1 files=1 size=307.36MB
-|  |     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk IS NOT NULL
+|  |     predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk 
IS NOT NULL
 |  |     stored statistics:
 |  |       table: rows=15.00M size=307.36MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk IS NOT NULL
+|  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0))
+|  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk 
IS NOT NULL
 |  |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |  |     tuple-ids=15 row-size=8B cardinality=2.43M cost=2571000
 |  |     in pipelines: 15(GETNEXT)
@@ -987,12 +992,13 @@ max-parallelism=60 segment-costs=[561638319, 35010096] 
cpu-comparison-result=60
 |  max-parallelism=10 segment-costs=[2675761]
 |  05:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address, RANDOM]
 |     HDFS partitions=1/1 files=1 size=307.36MB
-|     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|     predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |     stored statistics:
 |       table: rows=15.00M size=307.36MB
 |       columns: all
 |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0))
+|     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |     tuple-ids=4 row-size=8B cardinality=2.43M cost=2571000
 |     in pipelines: 05(GETNEXT)
@@ -1229,12 +1235,13 @@ max-parallelism=60 segment-costs=[6819259, 4400373, 
2635532, 1614300, 1290683] c
 |  |  max-parallelism=10 segment-costs=[2675761]
 |  |  25:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address, RANDOM]
 |  |     HDFS partitions=1/1 files=1 size=307.36MB
-|  |     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk IS NOT NULL
+|  |     predicates: 
tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk 
IS NOT NULL
 |  |     stored statistics:
 |  |       table: rows=15.00M size=307.36MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk IS NOT NULL
+|  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0))
+|  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address_1.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_1.ca_address_sk 
IS NOT NULL
 |  |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |  |     tuple-ids=27 row-size=8B cardinality=2.43M cost=2571000
 |  |     in pipelines: 25(GETNEXT)
@@ -1424,12 +1431,13 @@ max-parallelism=60 segment-costs=[6819259, 4400373, 
2635532, 1614300, 1290683] c
 |  |  max-parallelism=10 segment-costs=[2675761]
 |  |  15:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address, RANDOM]
 |  |     HDFS partitions=1/1 files=1 size=307.36MB
-|  |     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk IS NOT NULL
+|  |     predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk 
IS NOT NULL
 |  |     stored statistics:
 |  |       table: rows=15.00M size=307.36MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk IS NOT NULL
+|  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0))
+|  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk 
IS NOT NULL
 |  |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |  |     tuple-ids=15 row-size=8B cardinality=2.43M cost=2571000
 |  |     in pipelines: 15(GETNEXT)
@@ -1613,12 +1621,13 @@ max-parallelism=60 segment-costs=[561638319, 35010096] 
cpu-comparison-result=60
 |  max-parallelism=10 segment-costs=[2675761]
 |  05:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address, RANDOM]
 |     HDFS partitions=1/1 files=1 size=307.36MB
-|     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|     predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |     stored statistics:
 |       table: rows=15.00M size=307.36MB
 |       columns: all
 |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-5 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0))
+|     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-5 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |     tuple-ids=4 row-size=8B cardinality=2.43M cost=2571000
 |     in pipelines: 05(GETNEXT)
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q61.test
 
b/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q61.test
index 0f7c6e5be..38dd18efa 100644
--- 
a/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q61.test
+++ 
b/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q61.test
@@ -88,12 +88,13 @@ PLAN-ROOT SINK
 |  |  |
 |  |  |--22:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address]
 |  |  |     HDFS partitions=1/1 files=1 size=307.36MB
-|  |  |     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-7 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk IS NOT NULL
+|  |  |     predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-7 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk 
IS NOT NULL
 |  |  |     stored statistics:
 |  |  |       table: rows=15.00M size=307.36MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|  |  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-7 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk IS NOT NULL
+|  |  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-7 AS 
DECIMAL(3,0))
+|  |  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-7 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk 
IS NOT NULL
 |  |  |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |  |  |     tuple-ids=25 row-size=8B cardinality=2.43M cost=2571000
 |  |  |     in pipelines: 22(GETNEXT)
@@ -121,12 +122,13 @@ PLAN-ROOT SINK
 |  |
 |  |--19:SCAN HDFS [tpcds_partitioned_parquet_snap.store]
 |  |     HDFS partitions=1/1 files=1 size=119.76KB
-|  |     predicates: CAST(tpcds_partitioned_parquet_snap.store_0.s_gmt_offset 
AS DECIMAL(12,2)) = CAST(-7 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.store_0.s_store_sk IS NOT NULL
+|  |     predicates: tpcds_partitioned_parquet_snap.store_0.s_gmt_offset = 
CAST(-7 AS DECIMAL(3,0)), tpcds_partitioned_parquet_snap.store_0.s_store_sk IS 
NOT NULL
 |  |     stored statistics:
 |  |       table: rows=1.35K size=119.76KB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=1.35K
-|  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.store_0.s_gmt_offset AS DECIMAL(12,2)) = 
CAST(-7 AS DECIMAL(12,2)), tpcds_partitioned_parquet_snap.store_0.s_store_sk IS 
NOT NULL
+|  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.store_0.s_gmt_offset = CAST(-7 AS DECIMAL(3,0))
+|  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.store_0.s_gmt_offset = CAST(-7 AS DECIMAL(3,0)), 
tpcds_partitioned_parquet_snap.store_0.s_store_sk IS NOT NULL
 |  |     mem-estimate=16.00MB mem-reservation=16.00KB thread-reservation=0
 |  |     tuple-ids=21 row-size=8B cardinality=336 cost=231
 |  |     in pipelines: 19(GETNEXT)
@@ -212,12 +214,13 @@ PLAN-ROOT SINK
 |  |
 |  |--10:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address]
 |  |     HDFS partitions=1/1 files=1 size=307.36MB
-|  |     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-7 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|  |     predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-7 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |  |     stored statistics:
 |  |       table: rows=15.00M size=307.36MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-7 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-7 AS 
DECIMAL(3,0))
+|  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-7 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |  |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |  |     tuple-ids=12 row-size=8B cardinality=2.43M cost=2571000
 |  |     in pipelines: 10(GETNEXT)
@@ -245,12 +248,13 @@ PLAN-ROOT SINK
 |
 |--07:SCAN HDFS [tpcds_partitioned_parquet_snap.store]
 |     HDFS partitions=1/1 files=1 size=119.76KB
-|     predicates: CAST(tpcds_partitioned_parquet_snap.store.s_gmt_offset AS 
DECIMAL(12,2)) = CAST(-7 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.store.s_store_sk IS NOT NULL
+|     predicates: tpcds_partitioned_parquet_snap.store.s_gmt_offset = CAST(-7 
AS DECIMAL(3,0)), tpcds_partitioned_parquet_snap.store.s_store_sk IS NOT NULL
 |     stored statistics:
 |       table: rows=1.35K size=119.76KB
 |       columns: all
 |     extrapolated-rows=disabled max-scan-range-rows=1.35K
-|     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.store.s_gmt_offset AS DECIMAL(12,2)) = 
CAST(-7 AS DECIMAL(12,2)), tpcds_partitioned_parquet_snap.store.s_store_sk IS 
NOT NULL
+|     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.store.s_gmt_offset = CAST(-7 AS DECIMAL(3,0))
+|     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.store.s_gmt_offset = CAST(-7 AS DECIMAL(3,0)), 
tpcds_partitioned_parquet_snap.store.s_store_sk IS NOT NULL
 |     mem-estimate=16.00MB mem-reservation=16.00KB thread-reservation=0
 |     tuple-ids=8 row-size=8B cardinality=336 cost=231
 |     in pipelines: 07(GETNEXT)
@@ -440,12 +444,13 @@ PLAN-ROOT SINK
 |  |  |  max-parallelism=10 segment-costs=[5069764]
 |  |  |  22:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=307.36MB
-|  |  |     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-7 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk IS NOT NULL
+|  |  |     predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-7 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk 
IS NOT NULL
 |  |  |     stored statistics:
 |  |  |       table: rows=15.00M size=307.36MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|  |  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-7 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk IS NOT NULL
+|  |  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-7 AS 
DECIMAL(3,0))
+|  |  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-7 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk 
IS NOT NULL
 |  |  |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |  |  |     tuple-ids=25 row-size=8B cardinality=2.43M cost=2571000
 |  |  |     in pipelines: 22(GETNEXT)
@@ -508,12 +513,13 @@ PLAN-ROOT SINK
 |  |  max-parallelism=1 segment-costs=[245]
 |  |  19:SCAN HDFS [tpcds_partitioned_parquet_snap.store, RANDOM]
 |  |     HDFS partitions=1/1 files=1 size=119.76KB
-|  |     predicates: CAST(tpcds_partitioned_parquet_snap.store_0.s_gmt_offset 
AS DECIMAL(12,2)) = CAST(-7 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.store_0.s_store_sk IS NOT NULL
+|  |     predicates: tpcds_partitioned_parquet_snap.store_0.s_gmt_offset = 
CAST(-7 AS DECIMAL(3,0)), tpcds_partitioned_parquet_snap.store_0.s_store_sk IS 
NOT NULL
 |  |     stored statistics:
 |  |       table: rows=1.35K size=119.76KB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=1.35K
-|  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.store_0.s_gmt_offset AS DECIMAL(12,2)) = 
CAST(-7 AS DECIMAL(12,2)), tpcds_partitioned_parquet_snap.store_0.s_store_sk IS 
NOT NULL
+|  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.store_0.s_gmt_offset = CAST(-7 AS DECIMAL(3,0))
+|  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.store_0.s_gmt_offset = CAST(-7 AS DECIMAL(3,0)), 
tpcds_partitioned_parquet_snap.store_0.s_store_sk IS NOT NULL
 |  |     mem-estimate=16.00MB mem-reservation=16.00KB thread-reservation=0
 |  |     tuple-ids=21 row-size=8B cardinality=336 cost=231
 |  |     in pipelines: 19(GETNEXT)
@@ -682,12 +688,13 @@ max-parallelism=60 segment-costs=[585345192, 185] 
cpu-comparison-result=77 [max(
 |  |  max-parallelism=10 segment-costs=[5069764]
 |  |  10:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address, RANDOM]
 |  |     HDFS partitions=1/1 files=1 size=307.36MB
-|  |     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-7 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|  |     predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-7 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |  |     stored statistics:
 |  |       table: rows=15.00M size=307.36MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-7 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-7 AS 
DECIMAL(3,0))
+|  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-7 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |  |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |  |     tuple-ids=12 row-size=8B cardinality=2.43M cost=2571000
 |  |     in pipelines: 10(GETNEXT)
@@ -741,12 +748,13 @@ max-parallelism=60 segment-costs=[585345192, 185] 
cpu-comparison-result=77 [max(
 |  max-parallelism=1 segment-costs=[245]
 |  07:SCAN HDFS [tpcds_partitioned_parquet_snap.store, RANDOM]
 |     HDFS partitions=1/1 files=1 size=119.76KB
-|     predicates: CAST(tpcds_partitioned_parquet_snap.store.s_gmt_offset AS 
DECIMAL(12,2)) = CAST(-7 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.store.s_store_sk IS NOT NULL
+|     predicates: tpcds_partitioned_parquet_snap.store.s_gmt_offset = CAST(-7 
AS DECIMAL(3,0)), tpcds_partitioned_parquet_snap.store.s_store_sk IS NOT NULL
 |     stored statistics:
 |       table: rows=1.35K size=119.76KB
 |       columns: all
 |     extrapolated-rows=disabled max-scan-range-rows=1.35K
-|     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.store.s_gmt_offset AS DECIMAL(12,2)) = 
CAST(-7 AS DECIMAL(12,2)), tpcds_partitioned_parquet_snap.store.s_store_sk IS 
NOT NULL
+|     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.store.s_gmt_offset = CAST(-7 AS DECIMAL(3,0))
+|     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.store.s_gmt_offset = CAST(-7 AS DECIMAL(3,0)), 
tpcds_partitioned_parquet_snap.store.s_store_sk IS NOT NULL
 |     mem-estimate=16.00MB mem-reservation=16.00KB thread-reservation=0
 |     tuple-ids=8 row-size=8B cardinality=336 cost=231
 |     in pipelines: 07(GETNEXT)
@@ -987,12 +995,13 @@ PLAN-ROOT SINK
 |  |  |  max-parallelism=10 segment-costs=[5069764]
 |  |  |  22:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address, RANDOM]
 |  |  |     HDFS partitions=1/1 files=1 size=307.36MB
-|  |  |     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-7 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk IS NOT NULL
+|  |  |     predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-7 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk 
IS NOT NULL
 |  |  |     stored statistics:
 |  |  |       table: rows=15.00M size=307.36MB
 |  |  |       columns: all
 |  |  |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|  |  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-7 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk IS NOT NULL
+|  |  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-7 AS 
DECIMAL(3,0))
+|  |  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address_0.ca_gmt_offset = CAST(-7 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address_0.ca_address_sk 
IS NOT NULL
 |  |  |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |  |  |     tuple-ids=25 row-size=8B cardinality=2.43M cost=2571000
 |  |  |     in pipelines: 22(GETNEXT)
@@ -1055,12 +1064,13 @@ PLAN-ROOT SINK
 |  |  max-parallelism=1 segment-costs=[245]
 |  |  19:SCAN HDFS [tpcds_partitioned_parquet_snap.store, RANDOM]
 |  |     HDFS partitions=1/1 files=1 size=119.76KB
-|  |     predicates: CAST(tpcds_partitioned_parquet_snap.store_0.s_gmt_offset 
AS DECIMAL(12,2)) = CAST(-7 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.store_0.s_store_sk IS NOT NULL
+|  |     predicates: tpcds_partitioned_parquet_snap.store_0.s_gmt_offset = 
CAST(-7 AS DECIMAL(3,0)), tpcds_partitioned_parquet_snap.store_0.s_store_sk IS 
NOT NULL
 |  |     stored statistics:
 |  |       table: rows=1.35K size=119.76KB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=1.35K
-|  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.store_0.s_gmt_offset AS DECIMAL(12,2)) = 
CAST(-7 AS DECIMAL(12,2)), tpcds_partitioned_parquet_snap.store_0.s_store_sk IS 
NOT NULL
+|  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.store_0.s_gmt_offset = CAST(-7 AS DECIMAL(3,0))
+|  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.store_0.s_gmt_offset = CAST(-7 AS DECIMAL(3,0)), 
tpcds_partitioned_parquet_snap.store_0.s_store_sk IS NOT NULL
 |  |     mem-estimate=16.00MB mem-reservation=16.00KB thread-reservation=0
 |  |     tuple-ids=21 row-size=8B cardinality=336 cost=231
 |  |     in pipelines: 19(GETNEXT)
@@ -1228,12 +1238,13 @@ max-parallelism=10 segment-costs=[23802542, 185] 
cpu-comparison-result=90 [max(9
 |  |  max-parallelism=10 segment-costs=[5069764]
 |  |  10:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address, RANDOM]
 |  |     HDFS partitions=1/1 files=1 size=307.36MB
-|  |     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-7 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|  |     predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-7 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |  |     stored statistics:
 |  |       table: rows=15.00M size=307.36MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-7 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-7 AS 
DECIMAL(3,0))
+|  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-7 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |  |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |  |     tuple-ids=12 row-size=8B cardinality=2.43M cost=2571000
 |  |     in pipelines: 10(GETNEXT)
@@ -1296,12 +1307,13 @@ max-parallelism=80 segment-costs=[794436452]
 |  max-parallelism=1 segment-costs=[245]
 |  07:SCAN HDFS [tpcds_partitioned_parquet_snap.store, RANDOM]
 |     HDFS partitions=1/1 files=1 size=119.76KB
-|     predicates: CAST(tpcds_partitioned_parquet_snap.store.s_gmt_offset AS 
DECIMAL(12,2)) = CAST(-7 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.store.s_store_sk IS NOT NULL
+|     predicates: tpcds_partitioned_parquet_snap.store.s_gmt_offset = CAST(-7 
AS DECIMAL(3,0)), tpcds_partitioned_parquet_snap.store.s_store_sk IS NOT NULL
 |     stored statistics:
 |       table: rows=1.35K size=119.76KB
 |       columns: all
 |     extrapolated-rows=disabled max-scan-range-rows=1.35K
-|     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.store.s_gmt_offset AS DECIMAL(12,2)) = 
CAST(-7 AS DECIMAL(12,2)), tpcds_partitioned_parquet_snap.store.s_store_sk IS 
NOT NULL
+|     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.store.s_gmt_offset = CAST(-7 AS DECIMAL(3,0))
+|     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.store.s_gmt_offset = CAST(-7 AS DECIMAL(3,0)), 
tpcds_partitioned_parquet_snap.store.s_store_sk IS NOT NULL
 |     mem-estimate=16.00MB mem-reservation=16.00KB thread-reservation=0
 |     tuple-ids=8 row-size=8B cardinality=336 cost=231
 |     in pipelines: 07(GETNEXT)
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q89.test
 
b/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q89.test
index f6ea6cc0a..ce8c4fee0 100644
--- 
a/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q89.test
+++ 
b/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q89.test
@@ -44,7 +44,7 @@ PLAN-ROOT SINK
 |  in pipelines: 11(GETNEXT), 08(OPEN)
 |
 10:SELECT
-|  predicates: CASE WHEN 
avg(sum(tpcds_partitioned_parquet_snap.store_sales.ss_sales_price)) != CAST(0 
AS DECIMAL(38,6)) THEN 
divide(abs(subtract(sum(tpcds_partitioned_parquet_snap.store_sales.ss_sales_price),
 avg(sum(tpcds_partitioned_parquet_snap.store_sales.ss_sales_price)))), 
avg(sum(tpcds_partitioned_parquet_snap.store_sales.ss_sales_price))) ELSE NULL 
END > CAST(0.1 AS DECIMAL(2,1))
+|  predicates: CASE WHEN 
avg(sum(tpcds_partitioned_parquet_snap.store_sales.ss_sales_price)) != CAST(0 
AS DECIMAL(3,0)) THEN 
divide(abs(subtract(sum(tpcds_partitioned_parquet_snap.store_sales.ss_sales_price),
 avg(sum(tpcds_partitioned_parquet_snap.store_sales.ss_sales_price)))), 
avg(sum(tpcds_partitioned_parquet_snap.store_sales.ss_sales_price))) ELSE NULL 
END > CAST(0.1 AS DECIMAL(2,1))
 |  mem-estimate=0B mem-reservation=0B thread-reservation=0
 |  tuple-ids=13,12 row-size=137B cardinality=298.51K cost=2985120
 |  in pipelines: 08(GETNEXT)
@@ -173,7 +173,7 @@ max-parallelism=10 segment-costs=[18890602, 9031203, 389] 
cpu-comparison-result=
 |  in pipelines: 11(GETNEXT), 08(OPEN)
 |
 10:SELECT
-|  predicates: CASE WHEN 
avg(sum(tpcds_partitioned_parquet_snap.store_sales.ss_sales_price)) != CAST(0 
AS DECIMAL(38,6)) THEN 
divide(abs(subtract(sum(tpcds_partitioned_parquet_snap.store_sales.ss_sales_price),
 avg(sum(tpcds_partitioned_parquet_snap.store_sales.ss_sales_price)))), 
avg(sum(tpcds_partitioned_parquet_snap.store_sales.ss_sales_price))) ELSE NULL 
END > CAST(0.1 AS DECIMAL(2,1))
+|  predicates: CASE WHEN 
avg(sum(tpcds_partitioned_parquet_snap.store_sales.ss_sales_price)) != CAST(0 
AS DECIMAL(3,0)) THEN 
divide(abs(subtract(sum(tpcds_partitioned_parquet_snap.store_sales.ss_sales_price),
 avg(sum(tpcds_partitioned_parquet_snap.store_sales.ss_sales_price)))), 
avg(sum(tpcds_partitioned_parquet_snap.store_sales.ss_sales_price))) ELSE NULL 
END > CAST(0.1 AS DECIMAL(2,1))
 |  mem-estimate=0B mem-reservation=0B thread-reservation=0
 |  tuple-ids=13,12 row-size=137B cardinality=298.51K cost=2985120
 |  in pipelines: 08(GETNEXT)
@@ -377,7 +377,7 @@ max-parallelism=10 segment-costs=[18890602, 9031203, 389] 
cpu-comparison-result=
 |  in pipelines: 11(GETNEXT), 08(OPEN)
 |
 10:SELECT
-|  predicates: CASE WHEN 
avg(sum(tpcds_partitioned_parquet_snap.store_sales.ss_sales_price)) != CAST(0 
AS DECIMAL(38,6)) THEN 
divide(abs(subtract(sum(tpcds_partitioned_parquet_snap.store_sales.ss_sales_price),
 avg(sum(tpcds_partitioned_parquet_snap.store_sales.ss_sales_price)))), 
avg(sum(tpcds_partitioned_parquet_snap.store_sales.ss_sales_price))) ELSE NULL 
END > CAST(0.1 AS DECIMAL(2,1))
+|  predicates: CASE WHEN 
avg(sum(tpcds_partitioned_parquet_snap.store_sales.ss_sales_price)) != CAST(0 
AS DECIMAL(3,0)) THEN 
divide(abs(subtract(sum(tpcds_partitioned_parquet_snap.store_sales.ss_sales_price),
 avg(sum(tpcds_partitioned_parquet_snap.store_sales.ss_sales_price)))), 
avg(sum(tpcds_partitioned_parquet_snap.store_sales.ss_sales_price))) ELSE NULL 
END > CAST(0.1 AS DECIMAL(2,1))
 |  mem-estimate=0B mem-reservation=0B thread-reservation=0
 |  tuple-ids=13,12 row-size=137B cardinality=298.51K cost=2985120
 |  in pipelines: 08(GETNEXT)
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q91.test
 
b/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q91.test
index 3ecb2f335..06c2d6740 100644
--- 
a/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q91.test
+++ 
b/testdata/workloads/functional-planner/queries/PlannerTest/calcite_tpcds/tpcds-q91.test
@@ -112,12 +112,13 @@ PLAN-ROOT SINK
 |  |
 |  |--06:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address]
 |  |     HDFS partitions=1/1 files=1 size=307.36MB
-|  |     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-6 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|  |     predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |  |     stored statistics:
 |  |       table: rows=15.00M size=307.36MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-6 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0))
+|  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |  |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |  |     tuple-ids=8 row-size=8B cardinality=2.43M cost=2571000
 |  |     in pipelines: 06(GETNEXT)
@@ -374,12 +375,13 @@ max-parallelism=10 segment-costs=[15015105, 146771] 
cpu-comparison-result=73 [ma
 |  |  max-parallelism=10 segment-costs=[2675761]
 |  |  06:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address, RANDOM]
 |  |     HDFS partitions=1/1 files=1 size=307.36MB
-|  |     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-6 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|  |     predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |  |     stored statistics:
 |  |       table: rows=15.00M size=307.36MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-6 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0))
+|  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |  |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |  |     tuple-ids=8 row-size=8B cardinality=2.43M cost=2571000
 |  |     in pipelines: 06(GETNEXT)
@@ -670,12 +672,13 @@ max-parallelism=10 segment-costs=[15015105, 146771] 
cpu-comparison-result=73 [ma
 |  |  max-parallelism=10 segment-costs=[2675761]
 |  |  06:SCAN HDFS [tpcds_partitioned_parquet_snap.customer_address, RANDOM]
 |  |     HDFS partitions=1/1 files=1 size=307.36MB
-|  |     predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-6 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|  |     predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |  |     stored statistics:
 |  |       table: rows=15.00M size=307.36MB
 |  |       columns: all
 |  |     extrapolated-rows=disabled max-scan-range-rows=1.58M
-|  |     parquet dictionary predicates: 
CAST(tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset AS 
DECIMAL(12,2)) = CAST(-6 AS DECIMAL(12,2)), 
tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS NOT NULL
+|  |     parquet statistics predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0))
+|  |     parquet dictionary predicates: 
tpcds_partitioned_parquet_snap.customer_address.ca_gmt_offset = CAST(-6 AS 
DECIMAL(3,0)), tpcds_partitioned_parquet_snap.customer_address.ca_address_sk IS 
NOT NULL
 |  |     mem-estimate=16.00MB mem-reservation=128.00KB thread-reservation=0
 |  |     tuple-ids=8 row-size=8B cardinality=2.43M cost=2571000
 |  |     in pipelines: 06(GETNEXT)


Reply via email to