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 b18b5af..84619e6 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 @@ -717,10 +717,10 @@ private static ExprNodeDesc shortcutFunction(GenericUDF udf, List return Boolean.TRUE.equals(thenVal) ? whenExpr : Boolean.FALSE.equals(thenVal) ? thenExpr : null; } else if(thenVal.equals(elseVal)){ return thenExpr; - } else if (thenVal instanceof Boolean && elseVal instanceof Boolean) { - return Boolean.TRUE.equals(thenVal) ? whenExpr : - ExprNodeGenericFuncDesc.newInstance(new GenericUDFOPNot(), newExprs.subList(0, 1)); } else { + // Note that we can not rewrite it to GenericUDFOPNot() for the case + // of "thenVal instanceof Boolean && elseVal instanceof Boolean". + // See test case in HIVE-12742. return null; } } diff --git a/ql/src/test/queries/clientpositive/constantPropWhen.q b/ql/src/test/queries/clientpositive/constantPropWhen.q new file mode 100644 index 0000000..c7936ae --- /dev/null +++ b/ql/src/test/queries/clientpositive/constantPropWhen.q @@ -0,0 +1,6 @@ +set hive.mapred.mode=nonstrict; + +drop table test_1; +create table test_1 (id int, id2 int); +insert into table test_1 values (123, NULL); +SELECT cast(CASE WHEN id = id2 THEN FALSE ELSE TRUE END AS BOOLEAN) AS b FROM test_1; diff --git a/ql/src/test/results/clientpositive/constantPropWhen.q.out b/ql/src/test/results/clientpositive/constantPropWhen.q.out new file mode 100644 index 0000000..431c49a --- /dev/null +++ b/ql/src/test/results/clientpositive/constantPropWhen.q.out @@ -0,0 +1,31 @@ +PREHOOK: query: drop table test_1 +PREHOOK: type: DROPTABLE +POSTHOOK: query: drop table test_1 +POSTHOOK: type: DROPTABLE +PREHOOK: query: create table test_1 (id int, id2 int) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@test_1 +POSTHOOK: query: create table test_1 (id int, id2 int) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@test_1 +PREHOOK: query: insert into table test_1 values (123, NULL) +PREHOOK: type: QUERY +PREHOOK: Input: default@values__tmp__table__1 +PREHOOK: Output: default@test_1 +POSTHOOK: query: insert into table test_1 values (123, NULL) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@values__tmp__table__1 +POSTHOOK: Output: default@test_1 +POSTHOOK: Lineage: test_1.id EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col1, type:string, comment:), ] +POSTHOOK: Lineage: test_1.id2 EXPRESSION [(values__tmp__table__1)values__tmp__table__1.FieldSchema(name:tmp_values_col2, type:string, comment:), ] +PREHOOK: query: SELECT cast(CASE WHEN id = id2 THEN FALSE ELSE TRUE END AS BOOLEAN) AS b FROM test_1 +PREHOOK: type: QUERY +PREHOOK: Input: default@test_1 +#### A masked pattern was here #### +POSTHOOK: query: SELECT cast(CASE WHEN id = id2 THEN FALSE ELSE TRUE END AS BOOLEAN) AS b FROM test_1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@test_1 +#### A masked pattern was here #### +true