diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java index 29be691..8b49f50 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java @@ -79,7 +79,6 @@ import org.apache.calcite.rel.rules.FilterAggregateTransposeRule; import org.apache.calcite.rel.rules.FilterMergeRule; import org.apache.calcite.rel.rules.FilterProjectTransposeRule; -import org.apache.calcite.rel.rules.FilterSetOpTransposeRule; import org.apache.calcite.rel.rules.JoinPushTransitivePredicatesRule; import org.apache.calcite.rel.rules.JoinToMultiJoinRule; import org.apache.calcite.rel.rules.LoptOptimizeJoinRule; @@ -12505,7 +12504,7 @@ private String canHandleQbForCbo(QB qbToChk, boolean topLevelQB, boolean verbose boolean isStrictTest = isInTest && !conf.getVar(ConfVars.HIVEMAPREDMODE).equalsIgnoreCase("nonstrict"); boolean hasEnoughJoins = !topLevelQB || (queryProperties.getJoinCount() > 1) || isInTest; - if (!isStrictTest && hasEnoughJoins && !queryProperties.hasClusterBy() + if (!isStrictTest && hasEnoughJoins && !queryProperties.hasGroupBy() && !queryProperties.hasClusterBy() && !queryProperties.hasDistributeBy() && !queryProperties.hasSortBy() && !queryProperties.hasPTF() && !queryProperties.usesScript() && !queryProperties.hasMultiDestQuery() && !queryProperties.hasLateralViews()) { diff --git ql/src/java/org/apache/hadoop/hive/ql/udf/generic/NumericHistogram.java ql/src/java/org/apache/hadoop/hive/ql/udf/generic/NumericHistogram.java index a8c875c..a73ee68 100644 --- ql/src/java/org/apache/hadoop/hive/ql/udf/generic/NumericHistogram.java +++ ql/src/java/org/apache/hadoop/hive/ql/udf/generic/NumericHistogram.java @@ -19,7 +19,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.Arrays; import java.util.Collections; import java.util.Random; import org.apache.hadoop.hive.serde2.io.DoubleWritable; @@ -42,14 +41,7 @@ double y; public int compareTo(Object other) { - Coord o = (Coord) other; - if(x < o.x) { - return -1; - } - if(x > o.x) { - return 1; - } - return 0; + return Double.compare(x, ((Coord) other).x); } }; diff --git ql/src/test/queries/clientpositive/udaf_percentile_approx_23.q ql/src/test/queries/clientpositive/udaf_percentile_approx_23.q index 1efa295..1dc388a 100644 --- ql/src/test/queries/clientpositive/udaf_percentile_approx_23.q +++ ql/src/test/queries/clientpositive/udaf_percentile_approx_23.q @@ -84,3 +84,8 @@ select * from t9; select * from t10; select * from t11; select * from t12; + +-- NaN +explain +select percentile_approx(case when key < 100 then cast('NaN' as double) else key end, 0.5) from bucket group by 1; +select percentile_approx(case when key < 100 then cast('NaN' as double) else key end, 0.5) from bucket group by 1; diff --git ql/src/test/results/clientpositive/udaf_percentile_approx_23.q.out ql/src/test/results/clientpositive/udaf_percentile_approx_23.q.out index b2c0281..4602cb9 100644 --- ql/src/test/results/clientpositive/udaf_percentile_approx_23.q.out +++ ql/src/test/results/clientpositive/udaf_percentile_approx_23.q.out @@ -504,3 +504,72 @@ POSTHOOK: type: QUERY POSTHOOK: Input: default@t12 #### A masked pattern was here #### [26.0,255.5,479.0,491.0] +PREHOOK: query: -- NaN +explain +select percentile_approx(case when key < 100 then cast('NaN' as double) else key end, 0.5) from bucket group by 1 +PREHOOK: type: QUERY +POSTHOOK: query: -- NaN +explain +select percentile_approx(case when key < 100 then cast('NaN' as double) else key end, 0.5) from bucket group by 1 +POSTHOOK: type: QUERY +STAGE DEPENDENCIES: + Stage-1 is a root stage + Stage-0 depends on stages: Stage-1 + +STAGE PLANS: + Stage: Stage-1 + Map Reduce + Map Operator Tree: + TableScan + alias: bucket + Statistics: Num rows: 726 Data size: 5812 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: key (type: double) + outputColumnNames: key + Statistics: Num rows: 726 Data size: 5812 Basic stats: COMPLETE Column stats: NONE + Group By Operator + aggregations: percentile_approx(CASE WHEN ((key < 100.0)) THEN (UDFToDouble('NaN')) ELSE (key) END, 0.5) + keys: 1 (type: int) + mode: hash + outputColumnNames: _col0, _col1 + Statistics: Num rows: 726 Data size: 5812 Basic stats: COMPLETE Column stats: NONE + Reduce Output Operator + key expressions: _col0 (type: int) + sort order: + + Map-reduce partition columns: _col0 (type: int) + Statistics: Num rows: 726 Data size: 5812 Basic stats: COMPLETE Column stats: NONE + value expressions: _col1 (type: array) + Reduce Operator Tree: + Group By Operator + aggregations: percentile_approx(VALUE._col0) + keys: KEY._col0 (type: int) + mode: mergepartial + outputColumnNames: _col0, _col1 + Statistics: Num rows: 363 Data size: 2906 Basic stats: COMPLETE Column stats: NONE + Select Operator + expressions: _col1 (type: double) + outputColumnNames: _col0 + Statistics: Num rows: 363 Data size: 2906 Basic stats: COMPLETE Column stats: NONE + File Output Operator + compressed: false + Statistics: Num rows: 363 Data size: 2906 Basic stats: COMPLETE Column stats: NONE + table: + input format: org.apache.hadoop.mapred.TextInputFormat + output format: org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat + serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe + + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + ListSink + +PREHOOK: query: select percentile_approx(case when key < 100 then cast('NaN' as double) else key end, 0.5) from bucket group by 1 +PREHOOK: type: QUERY +PREHOOK: Input: default@bucket +#### A masked pattern was here #### +POSTHOOK: query: select percentile_approx(case when key < 100 then cast('NaN' as double) else key end, 0.5) from bucket group by 1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@bucket +#### A masked pattern was here #### +341.5