Repository: hive
Updated Branches:
  refs/heads/master 531652e68 -> 8c0d148cd


HIVE-13094: CBO: Assertion error in Case expression (Jesus Camacho Rodriguez, 
reviewed by Pengcheng Xiong)


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/8c0d148c
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/8c0d148c
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/8c0d148c

Branch: refs/heads/master
Commit: 8c0d148cd20199c647b2550ae51068f531ba42a3
Parents: 531652e
Author: Jesus Camacho Rodriguez <jcama...@apache.org>
Authored: Mon Feb 22 16:17:02 2016 +0100
Committer: Jesus Camacho Rodriguez <jcama...@apache.org>
Committed: Wed Feb 24 06:02:29 2016 +0100

----------------------------------------------------------------------
 .../hive/ql/optimizer/calcite/HiveRexUtil.java  |  2 +-
 .../rules/HiveReduceExpressionsRule.java        |  2 +-
 ql/src/test/queries/clientpositive/fold_case.q  |  3 +++
 .../test/results/clientpositive/fold_case.q.out | 25 ++++++++++++++++++++
 .../spark/vectorization_short_regress.q.out     |  4 ++--
 .../tez/vectorization_short_regress.q.out       |  4 ++--
 .../vectorization_short_regress.q.out           |  4 ++--
 7 files changed, 36 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/8c0d148c/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRexUtil.java
----------------------------------------------------------------------
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRexUtil.java 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRexUtil.java
index 3f6dd6a..f75303f 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRexUtil.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRexUtil.java
@@ -91,7 +91,7 @@ public class HiveRexUtil {
     assert newOperands.size() % 2 == 1;
     switch (newOperands.size()) {
     case 1:
-      return newOperands.get(0);
+      return rexBuilder.makeCast(call.getType(), newOperands.get(0));
     }
   trueFalse:
     if (call.getType().getSqlTypeName() == SqlTypeName.BOOLEAN) {

http://git-wip-us.apache.org/repos/asf/hive/blob/8c0d148c/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveReduceExpressionsRule.java
----------------------------------------------------------------------
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveReduceExpressionsRule.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveReduceExpressionsRule.java
index 8f15ec7..1d2c4cc 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveReduceExpressionsRule.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveReduceExpressionsRule.java
@@ -582,7 +582,7 @@ public abstract class HiveReduceExpressionsRule extends 
RelOptRule {
       }
       node = super.visitCall(call);
       if (node != call) {
-        node = RexUtil.simplify(rexBuilder, node);
+        node = HiveRexUtil.simplify(rexBuilder, node);
       }
       return node;
     }

http://git-wip-us.apache.org/repos/asf/hive/blob/8c0d148c/ql/src/test/queries/clientpositive/fold_case.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/fold_case.q 
b/ql/src/test/queries/clientpositive/fold_case.q
index 4732aa5..013a45f 100644
--- a/ql/src/test/queries/clientpositive/fold_case.q
+++ b/ql/src/test/queries/clientpositive/fold_case.q
@@ -18,3 +18,6 @@ explain
 select (case key when '238' then null else null end) from src where (case key 
when '238' then 2 = null else 3 = null  end);
 explain 
 select count(1) from src where (case key when '238' then null else 1=1 end);
+explain 
+select (CASE WHEN (-2) >= 0  THEN SUBSTRING(key, 1,CAST((-2) AS INT)) ELSE 
NULL END)
+from src;

http://git-wip-us.apache.org/repos/asf/hive/blob/8c0d148c/ql/src/test/results/clientpositive/fold_case.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/fold_case.q.out 
b/ql/src/test/results/clientpositive/fold_case.q.out
index 90ea0af..8e88dbf 100644
--- a/ql/src/test/results/clientpositive/fold_case.q.out
+++ b/ql/src/test/results/clientpositive/fold_case.q.out
@@ -475,3 +475,28 @@ STAGE PLANS:
       Processor Tree:
         ListSink
 
+PREHOOK: query: explain 
+select (CASE WHEN (-2) >= 0  THEN SUBSTRING(key, 1,CAST((-2) AS INT)) ELSE 
NULL END)
+from src
+PREHOOK: type: QUERY
+POSTHOOK: query: explain 
+select (CASE WHEN (-2) >= 0  THEN SUBSTRING(key, 1,CAST((-2) AS INT)) ELSE 
NULL END)
+from src
+POSTHOOK: type: QUERY
+STAGE DEPENDENCIES:
+  Stage-0 is a root stage
+
+STAGE PLANS:
+  Stage: Stage-0
+    Fetch Operator
+      limit: -1
+      Processor Tree:
+        TableScan
+          alias: src
+          Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE 
Column stats: COMPLETE
+          Select Operator
+            expressions: null (type: void)
+            outputColumnNames: _col0
+            Statistics: Num rows: 500 Data size: 0 Basic stats: PARTIAL Column 
stats: COMPLETE
+            ListSink
+

http://git-wip-us.apache.org/repos/asf/hive/blob/8c0d148c/ql/src/test/results/clientpositive/spark/vectorization_short_regress.q.out
----------------------------------------------------------------------
diff --git 
a/ql/src/test/results/clientpositive/spark/vectorization_short_regress.q.out 
b/ql/src/test/results/clientpositive/spark/vectorization_short_regress.q.out
index f7eadaf..4cb21a1 100644
--- a/ql/src/test/results/clientpositive/spark/vectorization_short_regress.q.out
+++ b/ql/src/test/results/clientpositive/spark/vectorization_short_regress.q.out
@@ -2345,7 +2345,7 @@ STAGE PLANS:
                   alias: alltypesorc
                   Statistics: Num rows: 12288 Data size: 377237 Basic stats: 
COMPLETE Column stats: NONE
                   Filter Operator
-                    predicate: ((UDFToDouble(ctimestamp1) <> 0.0) and (((-257 
<> UDFToInteger(ctinyint)) and cboolean2 is not null and cstring1 regexp '.*ss' 
and (-3.0 < UDFToDouble(ctimestamp1))) or (UDFToDouble(ctimestamp2) = -5.0) or 
((UDFToDouble(ctimestamp1) < 0.0) and (cstring2 like '%b%')) or (cdouble = 
UDFToDouble(cint)) or (cboolean1 is null and (cfloat < UDFToFloat(cint))))) 
(type: boolean)
+                    predicate: ((UDFToDouble(ctimestamp1) <> 0.0) and (((-257 
<> UDFToInteger(ctinyint)) and cstring1 regexp '.*ss' and (-3.0 < 
UDFToDouble(ctimestamp1)) and cboolean2 is not null) or 
(UDFToDouble(ctimestamp2) = -5.0) or ((UDFToDouble(ctimestamp1) < 0.0) and 
(cstring2 like '%b%')) or (cdouble = UDFToDouble(cint)) or (cboolean1 is null 
and (cfloat < UDFToFloat(cint))))) (type: boolean)
                     Statistics: Num rows: 12288 Data size: 377237 Basic stats: 
COMPLETE Column stats: NONE
                     Select Operator
                       expressions: cstring1 (type: string), ctimestamp1 (type: 
timestamp), cint (type: int), csmallint (type: smallint), ctinyint (type: 
tinyint), cfloat (type: float), cdouble (type: double)
@@ -2678,7 +2678,7 @@ STAGE PLANS:
                   alias: alltypesorc
                   Statistics: Num rows: 12288 Data size: 377237 Basic stats: 
COMPLETE Column stats: NONE
                   Filter Operator
-                    predicate: ((((cdouble < UDFToDouble(csmallint)) and 
(cboolean2 = cboolean1) and (UDFToDouble(cbigint) <= -863.257)) or ((cint >= 
-257) and cstring1 is not null and (cboolean1 >= 1)) or cstring2 regexp 'b' or 
((csmallint >= UDFToShort(ctinyint)) and ctimestamp2 is null)) and cboolean1 is 
not null) (type: boolean)
+                    predicate: ((((cdouble < UDFToDouble(csmallint)) and 
(cboolean2 = cboolean1) and (UDFToDouble(cbigint) <= -863.257)) or ((cint >= 
-257) and (cboolean1 >= 1) and cstring1 is not null) or cstring2 regexp 'b' or 
((csmallint >= UDFToShort(ctinyint)) and ctimestamp2 is null)) and cboolean1 is 
not null) (type: boolean)
                     Statistics: Num rows: 10239 Data size: 314333 Basic stats: 
COMPLETE Column stats: NONE
                     Select Operator
                       expressions: cboolean1 (type: boolean), cfloat (type: 
float), cbigint (type: bigint), cint (type: int), cdouble (type: double), 
ctinyint (type: tinyint), csmallint (type: smallint)

http://git-wip-us.apache.org/repos/asf/hive/blob/8c0d148c/ql/src/test/results/clientpositive/tez/vectorization_short_regress.q.out
----------------------------------------------------------------------
diff --git 
a/ql/src/test/results/clientpositive/tez/vectorization_short_regress.q.out 
b/ql/src/test/results/clientpositive/tez/vectorization_short_regress.q.out
index 483b7bc..3b69947 100644
--- a/ql/src/test/results/clientpositive/tez/vectorization_short_regress.q.out
+++ b/ql/src/test/results/clientpositive/tez/vectorization_short_regress.q.out
@@ -2355,7 +2355,7 @@ STAGE PLANS:
                   alias: alltypesorc
                   Statistics: Num rows: 12288 Data size: 2641964 Basic stats: 
COMPLETE Column stats: NONE
                   Filter Operator
-                    predicate: ((UDFToDouble(ctimestamp1) <> 0.0) and (((-257 
<> UDFToInteger(ctinyint)) and cboolean2 is not null and cstring1 regexp '.*ss' 
and (-3.0 < UDFToDouble(ctimestamp1))) or (UDFToDouble(ctimestamp2) = -5.0) or 
((UDFToDouble(ctimestamp1) < 0.0) and (cstring2 like '%b%')) or (cdouble = 
UDFToDouble(cint)) or (cboolean1 is null and (cfloat < UDFToFloat(cint))))) 
(type: boolean)
+                    predicate: ((UDFToDouble(ctimestamp1) <> 0.0) and (((-257 
<> UDFToInteger(ctinyint)) and cstring1 regexp '.*ss' and (-3.0 < 
UDFToDouble(ctimestamp1)) and cboolean2 is not null) or 
(UDFToDouble(ctimestamp2) = -5.0) or ((UDFToDouble(ctimestamp1) < 0.0) and 
(cstring2 like '%b%')) or (cdouble = UDFToDouble(cint)) or (cboolean1 is null 
and (cfloat < UDFToFloat(cint))))) (type: boolean)
                     Statistics: Num rows: 12288 Data size: 2641964 Basic 
stats: COMPLETE Column stats: NONE
                     Select Operator
                       expressions: cstring1 (type: string), ctimestamp1 (type: 
timestamp), cint (type: int), csmallint (type: smallint), ctinyint (type: 
tinyint), cfloat (type: float), cdouble (type: double)
@@ -2689,7 +2689,7 @@ STAGE PLANS:
                   alias: alltypesorc
                   Statistics: Num rows: 12288 Data size: 2641964 Basic stats: 
COMPLETE Column stats: NONE
                   Filter Operator
-                    predicate: ((((cdouble < UDFToDouble(csmallint)) and 
(cboolean2 = cboolean1) and (UDFToDouble(cbigint) <= -863.257)) or ((cint >= 
-257) and cstring1 is not null and (cboolean1 >= 1)) or cstring2 regexp 'b' or 
((csmallint >= UDFToShort(ctinyint)) and ctimestamp2 is null)) and cboolean1 is 
not null) (type: boolean)
+                    predicate: ((((cdouble < UDFToDouble(csmallint)) and 
(cboolean2 = cboolean1) and (UDFToDouble(cbigint) <= -863.257)) or ((cint >= 
-257) and (cboolean1 >= 1) and cstring1 is not null) or cstring2 regexp 'b' or 
((csmallint >= UDFToShort(ctinyint)) and ctimestamp2 is null)) and cboolean1 is 
not null) (type: boolean)
                     Statistics: Num rows: 10239 Data size: 2201421 Basic 
stats: COMPLETE Column stats: NONE
                     Select Operator
                       expressions: cboolean1 (type: boolean), cfloat (type: 
float), cbigint (type: bigint), cint (type: int), cdouble (type: double), 
ctinyint (type: tinyint), csmallint (type: smallint)

http://git-wip-us.apache.org/repos/asf/hive/blob/8c0d148c/ql/src/test/results/clientpositive/vectorization_short_regress.q.out
----------------------------------------------------------------------
diff --git 
a/ql/src/test/results/clientpositive/vectorization_short_regress.q.out 
b/ql/src/test/results/clientpositive/vectorization_short_regress.q.out
index 155e4d3..4b8ff69 100644
--- a/ql/src/test/results/clientpositive/vectorization_short_regress.q.out
+++ b/ql/src/test/results/clientpositive/vectorization_short_regress.q.out
@@ -2294,7 +2294,7 @@ STAGE PLANS:
             alias: alltypesorc
             Statistics: Num rows: 12288 Data size: 2641964 Basic stats: 
COMPLETE Column stats: NONE
             Filter Operator
-              predicate: ((UDFToDouble(ctimestamp1) <> 0.0) and (((-257 <> 
UDFToInteger(ctinyint)) and cboolean2 is not null and cstring1 regexp '.*ss' 
and (-3.0 < UDFToDouble(ctimestamp1))) or (UDFToDouble(ctimestamp2) = -5.0) or 
((UDFToDouble(ctimestamp1) < 0.0) and (cstring2 like '%b%')) or (cdouble = 
UDFToDouble(cint)) or (cboolean1 is null and (cfloat < UDFToFloat(cint))))) 
(type: boolean)
+              predicate: ((UDFToDouble(ctimestamp1) <> 0.0) and (((-257 <> 
UDFToInteger(ctinyint)) and cstring1 regexp '.*ss' and (-3.0 < 
UDFToDouble(ctimestamp1)) and cboolean2 is not null) or 
(UDFToDouble(ctimestamp2) = -5.0) or ((UDFToDouble(ctimestamp1) < 0.0) and 
(cstring2 like '%b%')) or (cdouble = UDFToDouble(cint)) or (cboolean1 is null 
and (cfloat < UDFToFloat(cint))))) (type: boolean)
               Statistics: Num rows: 12288 Data size: 2641964 Basic stats: 
COMPLETE Column stats: NONE
               Select Operator
                 expressions: cstring1 (type: string), ctimestamp1 (type: 
timestamp), cint (type: int), csmallint (type: smallint), ctinyint (type: 
tinyint), cfloat (type: float), cdouble (type: double)
@@ -2630,7 +2630,7 @@ STAGE PLANS:
             alias: alltypesorc
             Statistics: Num rows: 12288 Data size: 2641964 Basic stats: 
COMPLETE Column stats: NONE
             Filter Operator
-              predicate: ((((cdouble < UDFToDouble(csmallint)) and (cboolean2 
= cboolean1) and (UDFToDouble(cbigint) <= -863.257)) or ((cint >= -257) and 
cstring1 is not null and (cboolean1 >= 1)) or cstring2 regexp 'b' or 
((csmallint >= UDFToShort(ctinyint)) and ctimestamp2 is null)) and cboolean1 is 
not null) (type: boolean)
+              predicate: ((((cdouble < UDFToDouble(csmallint)) and (cboolean2 
= cboolean1) and (UDFToDouble(cbigint) <= -863.257)) or ((cint >= -257) and 
(cboolean1 >= 1) and cstring1 is not null) or cstring2 regexp 'b' or 
((csmallint >= UDFToShort(ctinyint)) and ctimestamp2 is null)) and cboolean1 is 
not null) (type: boolean)
               Statistics: Num rows: 10239 Data size: 2201421 Basic stats: 
COMPLETE Column stats: NONE
               Select Operator
                 expressions: cboolean1 (type: boolean), cfloat (type: float), 
cbigint (type: bigint), cint (type: int), cdouble (type: double), ctinyint 
(type: tinyint), csmallint (type: smallint)

Reply via email to