diff --git ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeDescUtils.java ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeDescUtils.java index 75372cd..686befd 100644 --- ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeDescUtils.java +++ ql/src/java/org/apache/hadoop/hive/ql/plan/ExprNodeDescUtils.java @@ -212,7 +212,14 @@ public static ExprNodeDesc backtrack(ExprNodeDesc source, Operator current, if (source instanceof ExprNodeGenericFuncDesc) { // all children expression should be resolved ExprNodeGenericFuncDesc function = (ExprNodeGenericFuncDesc) source.clone(); - function.setChildren(backtrack(function.getChildren(), current, terminal)); + List children = backtrack(function.getChildren(), current, terminal); + for (ExprNodeDesc child : children) { + if (child == null) { + // Could not resolve all of the function children, fail + return null; + } + } + function.setChildren(children); return function; } if (source instanceof ExprNodeColumnDesc) { @@ -222,7 +229,11 @@ public static ExprNodeDesc backtrack(ExprNodeDesc source, Operator current, if (source instanceof ExprNodeFieldDesc) { // field expression should be resolved ExprNodeFieldDesc field = (ExprNodeFieldDesc) source.clone(); - field.setDesc(backtrack(field.getDesc(), current, terminal)); + ExprNodeDesc fieldDesc = backtrack(field.getDesc(), current, terminal); + if (fieldDesc == null) { + return null; + } + field.setDesc(fieldDesc); return field; } // constant or null expr, just return diff --git ql/src/test/queries/clientpositive/sum_expr_with_order.q ql/src/test/queries/clientpositive/sum_expr_with_order.q new file mode 100644 index 0000000..4de9837 --- /dev/null +++ ql/src/test/queries/clientpositive/sum_expr_with_order.q @@ -0,0 +1,5 @@ + +select +cast(sum(key)*100 as decimal(15,3)) as c1 +from src +order by c1; diff --git ql/src/test/results/clientpositive/sum_expr_with_order.q.out ql/src/test/results/clientpositive/sum_expr_with_order.q.out new file mode 100644 index 0000000..00318e8 --- /dev/null +++ ql/src/test/results/clientpositive/sum_expr_with_order.q.out @@ -0,0 +1,15 @@ +PREHOOK: query: select +cast(sum(key)*100 as decimal(15,3)) as c1 +from src +order by c1 +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: select +cast(sum(key)*100 as decimal(15,3)) as c1 +from src +order by c1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +13009100