diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/ColumnStatsTask.java b/ql/src/java/org/apache/hadoop/hive/ql/exec/ColumnStatsTask.java index cb16fb7..d96f432 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/exec/ColumnStatsTask.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/ColumnStatsTask.java @@ -386,7 +386,9 @@ private void unpackStructObject(ObjectInspector oi, Object o, String fName, ColumnStatistics colStats = new ColumnStatistics(); colStats.setStatsDesc(statsDesc); colStats.setStatsObj(statsObjs); - stats.add(colStats); + if (!statsObjs.isEmpty()) { + stats.add(colStats); + } } ftOp.clearFetchContext(); return stats; @@ -413,6 +415,9 @@ private int persistColumnStats(Hive db) throws HiveException, MetaException, IOE List colStats = constructColumnStatsFromPackedRows(db); // Persist the column statistics object to the metastore // Note, this function is shared for both table and partition column stats. + if (colStats.isEmpty()) { + return 0; + } SetPartitionsStatsRequest request = new SetPartitionsStatsRequest(colStats); if (work.getColStats() != null && work.getColStats().getNumBitVector() > 0) { request.setNeedMerge(true); diff --git a/ql/src/test/queries/clientpositive/udf_round_2_auto_stats.q b/ql/src/test/queries/clientpositive/udf_round_2_auto_stats.q new file mode 100644 index 0000000..2532f81 --- /dev/null +++ b/ql/src/test/queries/clientpositive/udf_round_2_auto_stats.q @@ -0,0 +1,16 @@ +set hive.fetch.task.conversion=more; +set hive.stats.column.autogather=true; + +-- test for NaN (not-a-number) +create table tstTbl1(n double); + +insert overwrite table tstTbl1 +select 'NaN' from src tablesample (1 rows); + +select * from tstTbl1; + +select round(n, 1) from tstTbl1; +select round(n) from tstTbl1; + +-- test for Infinity +select round(1/0), round(1/0, 2), round(1.0/0.0), round(1.0/0.0, 2) from src tablesample (1 rows); diff --git a/ql/src/test/results/clientpositive/udf_round_2_auto_stats.q.out b/ql/src/test/results/clientpositive/udf_round_2_auto_stats.q.out new file mode 100644 index 0000000..4dbe8fc --- /dev/null +++ b/ql/src/test/results/clientpositive/udf_round_2_auto_stats.q.out @@ -0,0 +1,55 @@ +PREHOOK: query: create table tstTbl1(n double) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@tstTbl1 +POSTHOOK: query: create table tstTbl1(n double) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@tstTbl1 +PREHOOK: query: insert overwrite table tstTbl1 +select 'NaN' from src tablesample (1 rows) +PREHOOK: type: QUERY +PREHOOK: Input: default@src +PREHOOK: Output: default@tsttbl1 +POSTHOOK: query: insert overwrite table tstTbl1 +select 'NaN' from src tablesample (1 rows) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +POSTHOOK: Output: default@tsttbl1 +POSTHOOK: Lineage: tsttbl1.n EXPRESSION [] +PREHOOK: query: select * from tstTbl1 +PREHOOK: type: QUERY +PREHOOK: Input: default@tsttbl1 +#### A masked pattern was here #### +POSTHOOK: query: select * from tstTbl1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@tsttbl1 +#### A masked pattern was here #### +NaN +PREHOOK: query: select round(n, 1) from tstTbl1 +PREHOOK: type: QUERY +PREHOOK: Input: default@tsttbl1 +#### A masked pattern was here #### +POSTHOOK: query: select round(n, 1) from tstTbl1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@tsttbl1 +#### A masked pattern was here #### +NaN +PREHOOK: query: select round(n) from tstTbl1 +PREHOOK: type: QUERY +PREHOOK: Input: default@tsttbl1 +#### A masked pattern was here #### +POSTHOOK: query: select round(n) from tstTbl1 +POSTHOOK: type: QUERY +POSTHOOK: Input: default@tsttbl1 +#### A masked pattern was here #### +NaN +PREHOOK: query: select round(1/0), round(1/0, 2), round(1.0/0.0), round(1.0/0.0, 2) from src tablesample (1 rows) +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: select round(1/0), round(1/0, 2), round(1.0/0.0), round(1.0/0.0, 2) from src tablesample (1 rows) +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +NULL NULL NULL NULL