From 32a1c0e9d3ce40615742bfbf1904fa7b59c57894 Mon Sep 17 00:00:00 2001 From: Ashutosh Chauhan Date: Tue, 30 Jan 2018 10:59:29 -0800 Subject: [PATCH] HIVE-18585 : Return type for udfs should be determined using Hive inference rules instead of Calcite Signed-off-by: Ashutosh Chauhan --- .../calcite/translator/RexNodeConverter.java | 2 +- ql/src/test/queries/clientpositive/fold_case.q | 2 ++ ql/src/test/results/clientpositive/fold_case.q.out | 23 ++++++++++++++++++++++ 3 files changed, 26 insertions(+), 1 deletion(-) diff --git a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/RexNodeConverter.java b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/RexNodeConverter.java index f53739dc43..39ff59129a 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/RexNodeConverter.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/optimizer/calcite/translator/RexNodeConverter.java @@ -337,7 +337,7 @@ private RexNode convert(ExprNodeGenericFuncDesc func) throws SemanticException { // If it is a floor operator, we need to rewrite it childRexNodeLst = rewriteFloorDateChildren(calciteOp, childRexNodeLst); } - expr = cluster.getRexBuilder().makeCall(calciteOp, childRexNodeLst); + expr = cluster.getRexBuilder().makeCall(retType, calciteOp, childRexNodeLst); } else { retType = expr.getType(); } diff --git a/ql/src/test/queries/clientpositive/fold_case.q b/ql/src/test/queries/clientpositive/fold_case.q index e2b490ef77..0066c41079 100644 --- a/ql/src/test/queries/clientpositive/fold_case.q +++ b/ql/src/test/queries/clientpositive/fold_case.q @@ -24,3 +24,5 @@ from src; explain select (CASE WHEN key = value THEN '1' WHEN true THEN '0' ELSE NULL END) from src; +explain +select (case when true then key when not true then to_date(key) else null end) from src; diff --git a/ql/src/test/results/clientpositive/fold_case.q.out b/ql/src/test/results/clientpositive/fold_case.q.out index 156608f02a..191c108044 100644 --- a/ql/src/test/results/clientpositive/fold_case.q.out +++ b/ql/src/test/results/clientpositive/fold_case.q.out @@ -511,3 +511,26 @@ STAGE PLANS: Processor Tree: ListSink +PREHOOK: query: explain +select (case when true then key when not true then to_date(key) else null end) from src +PREHOOK: type: QUERY +POSTHOOK: query: explain +select (case when true then key when not true then to_date(key) 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: NONE + Select Operator + expressions: key (type: string) + outputColumnNames: _col0 + Statistics: Num rows: 500 Data size: 5312 Basic stats: COMPLETE Column stats: NONE + ListSink + -- 2.14.3 (Apple Git-98)