diff --git ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRexUtil.java ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRexUtil.java index 3f6dd6a..f75303f 100644 --- ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRexUtil.java +++ ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/HiveRexUtil.java @@ -91,7 +91,7 @@ private static RexNode simplifyCase(RexBuilder rexBuilder, RexCall call) { 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) { diff --git ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveReduceExpressionsRule.java ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveReduceExpressionsRule.java index 8f15ec7..1d2c4cc 100644 --- ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveReduceExpressionsRule.java +++ ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/rules/HiveReduceExpressionsRule.java @@ -582,7 +582,7 @@ protected static RexNode substitute(RexCall call, int ordinal, RexNode node) { } node = super.visitCall(call); if (node != call) { - node = RexUtil.simplify(rexBuilder, node); + node = HiveRexUtil.simplify(rexBuilder, node); } return node; } diff --git ql/src/test/queries/clientpositive/fold_case.q ql/src/test/queries/clientpositive/fold_case.q index 4732aa5..013a45f 100644 --- ql/src/test/queries/clientpositive/fold_case.q +++ 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; diff --git ql/src/test/results/clientpositive/fold_case.q.out ql/src/test/results/clientpositive/fold_case.q.out index 90ea0af..8e88dbf 100644 --- ql/src/test/results/clientpositive/fold_case.q.out +++ 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 +