Repository: hive
Updated Branches:
  refs/heads/master dc3cbf23d -> 01cef9230


HIVE-20881: Constant propagation oversimplifies projections (Zoltan Haindrich 
reviewed by Ashutosh Chauhan)

Signed-off-by: Zoltan Haindrich <k...@rxd.hu>


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

Branch: refs/heads/master
Commit: 01cef9230947db7070bdc49f2691148f65b5e466
Parents: dc3cbf2
Author: Zoltan Haindrich <k...@rxd.hu>
Authored: Fri Nov 9 15:02:32 2018 +0100
Committer: Zoltan Haindrich <k...@rxd.hu>
Committed: Fri Nov 9 15:02:32 2018 +0100

----------------------------------------------------------------------
 .../optimizer/ConstantPropagateProcFactory.java |  9 +++--
 .../queries/clientpositive/constant_prop_4.q    |  9 +++++
 .../clientpositive/constant_prop_4.q.out        | 39 ++++++++++++++++++++
 3 files changed, 53 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/01cef923/ql/src/java/org/apache/hadoop/hive/ql/optimizer/ConstantPropagateProcFactory.java
----------------------------------------------------------------------
diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/ConstantPropagateProcFactory.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/ConstantPropagateProcFactory.java
index 54d52f8..11159d2 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/ConstantPropagateProcFactory.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/ConstantPropagateProcFactory.java
@@ -63,7 +63,6 @@ import org.apache.hadoop.hive.ql.plan.JoinCondDesc;
 import org.apache.hadoop.hive.ql.plan.JoinDesc;
 import org.apache.hadoop.hive.ql.plan.ReduceSinkDesc;
 import org.apache.hadoop.hive.ql.plan.TableScanDesc;
-import org.apache.hadoop.hive.ql.udf.UDFType;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDF.DeferredJavaObject;
 import org.apache.hadoop.hive.ql.udf.generic.GenericUDFBaseCompare;
@@ -471,7 +470,7 @@ public final class ConstantPropagateProcFactory {
   private static boolean isConstantFoldableUdf(GenericUDF udf,  
List<ExprNodeDesc> children) {
     // Runtime constants + deterministic functions can be folded.
     if (!FunctionRegistry.isConsistentWithinQuery(udf)) {
-      if (udf.getClass().equals(GenericUDFUnixTimeStamp.class) 
+      if (udf.getClass().equals(GenericUDFUnixTimeStamp.class)
           && children != null && children.size() > 0) {
         // unix_timestamp is polymorphic (ignore class annotations)
         return true;
@@ -640,8 +639,10 @@ public final class ConstantPropagateProcFactory {
             // if true, prune it
             positionsToRemove.set(i);
           } else {
-            // if false, return false
-            return childExpr;
+            if (Boolean.FALSE.equals(c.getValue())) {
+              // if false, return false
+              return childExpr;
+            }
           }
         } else if (childExpr instanceof ExprNodeGenericFuncDesc &&
                 ((ExprNodeGenericFuncDesc)childExpr).getGenericUDF() 
instanceof GenericUDFOPNotNull &&

http://git-wip-us.apache.org/repos/asf/hive/blob/01cef923/ql/src/test/queries/clientpositive/constant_prop_4.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/constant_prop_4.q 
b/ql/src/test/queries/clientpositive/constant_prop_4.q
new file mode 100644
index 0000000..ba2069c
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/constant_prop_4.q
@@ -0,0 +1,9 @@
+create table cx2(bool1 boolean);
+insert into cx2 values (true),(false),(null);
+
+set hive.cbo.enable=true;
+select bool1 IS TRUE OR (cast(NULL as boolean) AND bool1 IS NOT TRUE AND bool1 
IS NOT FALSE) from cx2;
+
+set hive.cbo.enable=false;
+select bool1 IS TRUE OR (cast(NULL as boolean) AND bool1 IS NOT TRUE AND bool1 
IS NOT FALSE) from cx2;
+

http://git-wip-us.apache.org/repos/asf/hive/blob/01cef923/ql/src/test/results/clientpositive/constant_prop_4.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/constant_prop_4.q.out 
b/ql/src/test/results/clientpositive/constant_prop_4.q.out
new file mode 100644
index 0000000..f40467b
--- /dev/null
+++ b/ql/src/test/results/clientpositive/constant_prop_4.q.out
@@ -0,0 +1,39 @@
+PREHOOK: query: create table cx2(bool1 boolean)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@cx2
+POSTHOOK: query: create table cx2(bool1 boolean)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@cx2
+PREHOOK: query: insert into cx2 values (true),(false),(null)
+PREHOOK: type: QUERY
+PREHOOK: Input: _dummy_database@_dummy_table
+PREHOOK: Output: default@cx2
+POSTHOOK: query: insert into cx2 values (true),(false),(null)
+POSTHOOK: type: QUERY
+POSTHOOK: Input: _dummy_database@_dummy_table
+POSTHOOK: Output: default@cx2
+POSTHOOK: Lineage: cx2.bool1 SCRIPT []
+PREHOOK: query: select bool1 IS TRUE OR (cast(NULL as boolean) AND bool1 IS 
NOT TRUE AND bool1 IS NOT FALSE) from cx2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@cx2
+#### A masked pattern was here ####
+POSTHOOK: query: select bool1 IS TRUE OR (cast(NULL as boolean) AND bool1 IS 
NOT TRUE AND bool1 IS NOT FALSE) from cx2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@cx2
+#### A masked pattern was here ####
+true
+false
+NULL
+PREHOOK: query: select bool1 IS TRUE OR (cast(NULL as boolean) AND bool1 IS 
NOT TRUE AND bool1 IS NOT FALSE) from cx2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@cx2
+#### A masked pattern was here ####
+POSTHOOK: query: select bool1 IS TRUE OR (cast(NULL as boolean) AND bool1 IS 
NOT TRUE AND bool1 IS NOT FALSE) from cx2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@cx2
+#### A masked pattern was here ####
+true
+false
+NULL

Reply via email to