Repository: incubator-impala
Updated Branches:
  refs/heads/master a2805ca6f -> baba8960b


IMPALA-5145: Do not constant fold null in CastExprs

Constant folding null values in CastExprs causes CTAS statements
to fail. This regresses the observed behavior before constant folding
was introduced. This change does not constant fold null in CastExprs.

Change-Id: Ia7aa1ab7f53a9dcc7560ded321a9d1e1ee2d18e3
Reviewed-on: http://gerrit.cloudera.org:8080/6663
Reviewed-by: Alex Behm <[email protected]>
Tested-by: Impala Public Jenkins


Project: http://git-wip-us.apache.org/repos/asf/incubator-impala/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-impala/commit/8660c404
Tree: http://git-wip-us.apache.org/repos/asf/incubator-impala/tree/8660c404
Diff: http://git-wip-us.apache.org/repos/asf/incubator-impala/diff/8660c404

Branch: refs/heads/master
Commit: 8660c404c93673559c639cf7306c0a6f7ab9001f
Parents: a2805ca
Author: aphadke <[email protected]>
Authored: Mon Apr 17 17:52:18 2017 -0700
Committer: Impala Public Jenkins <[email protected]>
Committed: Thu Apr 20 19:39:17 2017 +0000

----------------------------------------------------------------------
 .../org/apache/impala/rewrite/FoldConstantsRule.java    | 12 ++++++++++++
 .../queries/PlannerTest/aggregation.test                |  2 +-
 .../queries/QueryTest/create-table-as-select.test       |  6 ++++++
 3 files changed, 19 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/8660c404/fe/src/main/java/org/apache/impala/rewrite/FoldConstantsRule.java
----------------------------------------------------------------------
diff --git a/fe/src/main/java/org/apache/impala/rewrite/FoldConstantsRule.java 
b/fe/src/main/java/org/apache/impala/rewrite/FoldConstantsRule.java
index 146dd83..3437531 100644
--- a/fe/src/main/java/org/apache/impala/rewrite/FoldConstantsRule.java
+++ b/fe/src/main/java/org/apache/impala/rewrite/FoldConstantsRule.java
@@ -20,6 +20,9 @@ package org.apache.impala.rewrite;
 import org.apache.impala.analysis.Analyzer;
 import org.apache.impala.analysis.Expr;
 import org.apache.impala.analysis.LiteralExpr;
+import org.apache.impala.analysis.NullLiteral;
+import org.apache.impala.analysis.CastExpr;
+
 import org.apache.impala.common.AnalysisException;
 
 /**
@@ -47,6 +50,15 @@ public class FoldConstantsRule implements ExprRewriteRule {
     // children should have been folded at this point.
     for (Expr child: expr.getChildren()) if (!child.isLiteral()) return expr;
     if (expr.isLiteral() || !expr.isConstant()) return expr;
+
+    // Do not constant fold cast(null as dataType) because we cannot preserve 
the
+    // cast-to-types and that can lead to query failures, e.g., CTAS
+    if (expr instanceof CastExpr) {
+      CastExpr castExpr = (CastExpr) expr;
+      if (castExpr.getChild(0) instanceof NullLiteral) {
+        return expr;
+      }
+    }
     // Analyze constant exprs, if necessary. Note that the 'expr' may become 
non-constant
     // after analysis (e.g., aggregate functions).
     if (!expr.isAnalyzed()) {

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/8660c404/testdata/workloads/functional-planner/queries/PlannerTest/aggregation.test
----------------------------------------------------------------------
diff --git 
a/testdata/workloads/functional-planner/queries/PlannerTest/aggregation.test 
b/testdata/workloads/functional-planner/queries/PlannerTest/aggregation.test
index a92cee3..a1177b0 100644
--- a/testdata/workloads/functional-planner/queries/PlannerTest/aggregation.test
+++ b/testdata/workloads/functional-planner/queries/PlannerTest/aggregation.test
@@ -725,7 +725,7 @@ PLAN-ROOT SINK
 |
 01:AGGREGATE [FINALIZE]
 |  output: count(*)
-|  group by: bool_col, NULL
+|  group by: bool_col, CAST(NULL AS INT)
 |
 00:SCAN HDFS [functional.alltypestiny]
    partitions=4/4 files=4 size=460B

http://git-wip-us.apache.org/repos/asf/incubator-impala/blob/8660c404/testdata/workloads/functional-query/queries/QueryTest/create-table-as-select.test
----------------------------------------------------------------------
diff --git 
a/testdata/workloads/functional-query/queries/QueryTest/create-table-as-select.test
 
b/testdata/workloads/functional-query/queries/QueryTest/create-table-as-select.test
index 2178589..9090d61 100644
--- 
a/testdata/workloads/functional-query/queries/QueryTest/create-table-as-select.test
+++ 
b/testdata/workloads/functional-query/queries/QueryTest/create-table-as-select.test
@@ -183,3 +183,9 @@ create table $DATABASE.rand_ctas as select rand() from 
functional.alltypes;
 'Inserted 7300 row(s)'
 ---- ERRORS
 ====
+---- QUERY
+# IMPALA-5145: Do not constant fold null in CastExprs
+create table if not exists cast_null_as_int as (select cast(null as int) c);
+---- RESULTS
+'Inserted 1 row(s)'
+====

Reply via email to