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