This is an automated email from the ASF dual-hosted git repository.

okumin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git


The following commit(s) were added to refs/heads/master by this push:
     new 15d78aec0ef HIVE-28124: Do not allow non-numeric values in Hive table 
stats during an alter table (#5664) (Miklos Szurap, reviewed by Shohei Okumiya)
15d78aec0ef is described below

commit 15d78aec0efa22a81c34fadaa26efd2518fcb3af
Author: Miklos Szurap <[email protected]>
AuthorDate: Wed Mar 5 14:13:18 2025 +0100

    HIVE-28124: Do not allow non-numeric values in Hive table stats during an 
alter table (#5664) (Miklos Szurap, reviewed by Shohei Okumiya)
---
 .../AbstractAlterTablePropertiesAnalyzer.java      | 24 +++++-----
 .../alter_tableprops_non_numeric_1.q               |  3 ++
 .../alter_tableprops_non_numeric_10.q              |  3 ++
 .../alter_tableprops_non_numeric_11.q              |  3 ++
 .../alter_tableprops_non_numeric_2.q               |  3 ++
 .../alter_tableprops_non_numeric_3.q               |  3 ++
 .../alter_tableprops_non_numeric_4.q               |  3 ++
 .../alter_tableprops_non_numeric_5.q               |  3 ++
 .../alter_tableprops_non_numeric_6.q               |  3 ++
 .../alter_tableprops_non_numeric_7.q               |  3 ++
 .../alter_tableprops_non_numeric_8.q               |  3 ++
 .../alter_tableprops_non_numeric_9.q               |  3 ++
 .../clientnegative/updateBasicStats_failure_1.q    |  3 ++
 .../clientnegative/updateBasicStats_failure_2.q    |  3 ++
 .../clientnegative/updateBasicStats_failure_3.q    |  3 ++
 .../clientnegative/updateBasicStats_failure_4.q    |  3 ++
 .../clientnegative/updateBasicStats_failure_5.q    |  4 ++
 .../clientnegative/updateBasicStats_failure_6.q    |  4 ++
 .../clientpositive/alter_tableprops_numeric.q      |  5 +++
 .../alter_tableprops_non_numeric_1.q.out           |  9 ++++
 .../alter_tableprops_non_numeric_10.q.out          |  9 ++++
 .../alter_tableprops_non_numeric_11.q.out          |  9 ++++
 .../alter_tableprops_non_numeric_2.q.out           |  9 ++++
 .../alter_tableprops_non_numeric_3.q.out           |  9 ++++
 .../alter_tableprops_non_numeric_4.q.out           |  9 ++++
 .../alter_tableprops_non_numeric_5.q.out           |  9 ++++
 .../alter_tableprops_non_numeric_6.q.out           |  9 ++++
 .../alter_tableprops_non_numeric_7.q.out           |  9 ++++
 .../alter_tableprops_non_numeric_8.q.out           |  9 ++++
 .../alter_tableprops_non_numeric_9.q.out           |  9 ++++
 .../updateBasicStats_failure_1.q.out               |  9 ++++
 .../updateBasicStats_failure_2.q.out               |  9 ++++
 .../updateBasicStats_failure_3.q.out               |  9 ++++
 .../updateBasicStats_failure_4.q.out               |  9 ++++
 .../updateBasicStats_failure_5.q.out               |  9 ++++
 .../updateBasicStats_failure_6.q.out               |  9 ++++
 .../llap/alter_tableprops_numeric.q.out            | 52 ++++++++++++++++++++++
 .../apache/hadoop/hive/common/StatsSetupConst.java |  7 +++
 38 files changed, 282 insertions(+), 12 deletions(-)

diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/misc/properties/AbstractAlterTablePropertiesAnalyzer.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/misc/properties/AbstractAlterTablePropertiesAnalyzer.java
index 0e7132563cb..eac73edc7ec 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/misc/properties/AbstractAlterTablePropertiesAnalyzer.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/ddl/table/misc/properties/AbstractAlterTablePropertiesAnalyzer.java
@@ -83,16 +83,23 @@ protected void analyzeCommand(TableName tableName, 
Map<String, String> partition
   }
 
   /**
-   * @return If it is executed after an update statistics command.
+   * @return If the alter changes table statistics
    */
   private boolean validate(TableName tableName, Map<String, String> 
properties) throws SemanticException {
     // We need to check if the properties are valid, especially for stats.
-    // They might be changed via alter table .. update statistics or alter 
table .. set tblproperties.
-    // If the property is not row_count or raw_data_size, it could not be 
changed through update statistics.
     boolean changeStats = false;
     for (Entry<String, String> entry : properties.entrySet()) {
-      // we make sure that we do not change anything if there is anything 
wrong.
-      if (entry.getKey().equals(StatsSetupConst.ROW_COUNT) || 
entry.getKey().equals(StatsSetupConst.RAW_DATA_SIZE)) {
+      // Stats can be changed via alter table .. update statistics or alter 
table .. set tblproperties.
+      // If the property is not numRows or rawDataSize, it cannot be changed 
through update statistics.
+      if 
((queryState.getCommandType().equals(HiveOperation.ALTERTABLE_UPDATETABLESTATS.getOperationName())
 ||
+              
queryState.getCommandType().equals(HiveOperation.ALTERTABLE_UPDATEPARTSTATS.getOperationName()))
+              && !entry.getKey().equals(StatsSetupConst.ROW_COUNT) && 
!entry.getKey().equals(StatsSetupConst.RAW_DATA_SIZE)) {
+        throw new SemanticException(String.format(
+                  "AlterTable UpdateStats %s failed because the only valid 
keys are %s and %s",
+                  entry.getKey(), StatsSetupConst.ROW_COUNT, 
StatsSetupConst.RAW_DATA_SIZE));
+      }
+      // We can update all table stats through SET TBLPROPERTIES. Validating 
if the value is a Long
+      if (StatsSetupConst.STATS_NUMERIC.contains(entry.getKey())) {
         try {
           Long.parseLong(entry.getValue());
           changeStats = true;
@@ -107,13 +114,6 @@ private boolean validate(TableName tableName, Map<String, 
String> properties) th
               "Table: %s has constraints enabled. Please remove those 
constraints to change this property.",
               tableName.getNotEmptyDbTable())));
         }
-      } else {
-        if 
(queryState.getCommandType().equals(HiveOperation.ALTERTABLE_UPDATETABLESTATS.getOperationName())
 ||
-            
queryState.getCommandType().equals(HiveOperation.ALTERTABLE_UPDATEPARTSTATS.getOperationName()))
 {
-          throw new SemanticException(String.format(
-              "AlterTable UpdateStats %s failed because the only valid keys 
are %s and %s",
-              entry.getKey(), StatsSetupConst.ROW_COUNT, 
StatsSetupConst.RAW_DATA_SIZE));
-        }
       }
     }
     return changeStats;
diff --git 
a/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_1.q 
b/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_1.q
new file mode 100644
index 00000000000..51746558b22
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_1.q
@@ -0,0 +1,3 @@
+create table stat_test (a int);
+
+alter table stat_test set TBLPROPERTIES('numRows'='');
diff --git 
a/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_10.q 
b/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_10.q
new file mode 100644
index 00000000000..05c2147c07e
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_10.q
@@ -0,0 +1,3 @@
+create table stat_test (a int);
+
+alter table stat_test set TBLPROPERTIES('numFilesErasureCoded'='NaN');
diff --git 
a/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_11.q 
b/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_11.q
new file mode 100644
index 00000000000..2affb6d6232
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_11.q
@@ -0,0 +1,3 @@
+create table stat_test (a int);
+
+alter table stat_test set TBLPROPERTIES('numFiles'='1', 'numRows'='1', 
'totalSize'='1', 'rawDataSize'='1', 'numFilesErasureCoded'='NaN');
diff --git 
a/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_2.q 
b/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_2.q
new file mode 100644
index 00000000000..f9938350807
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_2.q
@@ -0,0 +1,3 @@
+create table stat_test (a int);
+
+alter table stat_test set TBLPROPERTIES('numRows'='NaN');
diff --git 
a/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_3.q 
b/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_3.q
new file mode 100644
index 00000000000..49b616a4561
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_3.q
@@ -0,0 +1,3 @@
+create table stat_test (a int);
+
+alter table stat_test set TBLPROPERTIES('rawDataSize'='');
diff --git 
a/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_4.q 
b/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_4.q
new file mode 100644
index 00000000000..1baf878203c
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_4.q
@@ -0,0 +1,3 @@
+create table stat_test (a int);
+
+alter table stat_test set TBLPROPERTIES('rawDataSize'='NaN');
diff --git 
a/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_5.q 
b/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_5.q
new file mode 100644
index 00000000000..b2f0b4fef35
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_5.q
@@ -0,0 +1,3 @@
+create table stat_test (a int);
+
+alter table stat_test set TBLPROPERTIES('totalSize'='');
diff --git 
a/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_6.q 
b/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_6.q
new file mode 100644
index 00000000000..be2a56add80
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_6.q
@@ -0,0 +1,3 @@
+create table stat_test (a int);
+
+alter table stat_test set TBLPROPERTIES('totalSize'='NaN');
diff --git 
a/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_7.q 
b/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_7.q
new file mode 100644
index 00000000000..58d99bbc166
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_7.q
@@ -0,0 +1,3 @@
+create table stat_test (a int);
+
+alter table stat_test set TBLPROPERTIES('numFiles'='');
diff --git 
a/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_8.q 
b/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_8.q
new file mode 100644
index 00000000000..d767385460d
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_8.q
@@ -0,0 +1,3 @@
+create table stat_test (a int);
+
+alter table stat_test set TBLPROPERTIES('numFiles'='NaN');
diff --git 
a/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_9.q 
b/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_9.q
new file mode 100644
index 00000000000..719961f5541
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/alter_tableprops_non_numeric_9.q
@@ -0,0 +1,3 @@
+create table stat_test (a int);
+
+alter table stat_test set TBLPROPERTIES('numFilesErasureCoded'='');
diff --git a/ql/src/test/queries/clientnegative/updateBasicStats_failure_1.q 
b/ql/src/test/queries/clientnegative/updateBasicStats_failure_1.q
new file mode 100644
index 00000000000..1ed47cadafa
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/updateBasicStats_failure_1.q
@@ -0,0 +1,3 @@
+create table stat_test (a int);
+
+alter table stat_test update statistics set ('numRows'='');
diff --git a/ql/src/test/queries/clientnegative/updateBasicStats_failure_2.q 
b/ql/src/test/queries/clientnegative/updateBasicStats_failure_2.q
new file mode 100644
index 00000000000..91d1abf4ae9
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/updateBasicStats_failure_2.q
@@ -0,0 +1,3 @@
+create table stat_test (a int);
+
+alter table stat_test update statistics set ('numRows'='NaN');
diff --git a/ql/src/test/queries/clientnegative/updateBasicStats_failure_3.q 
b/ql/src/test/queries/clientnegative/updateBasicStats_failure_3.q
new file mode 100644
index 00000000000..dc677cdf5d8
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/updateBasicStats_failure_3.q
@@ -0,0 +1,3 @@
+create table stat_test (a int);
+
+alter table stat_test update statistics set ('rawDataSize'='');
diff --git a/ql/src/test/queries/clientnegative/updateBasicStats_failure_4.q 
b/ql/src/test/queries/clientnegative/updateBasicStats_failure_4.q
new file mode 100644
index 00000000000..22f8edee99e
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/updateBasicStats_failure_4.q
@@ -0,0 +1,3 @@
+create table stat_test (a int);
+
+alter table stat_test update statistics set ('rawDataSize'='NaN');
\ No newline at end of file
diff --git a/ql/src/test/queries/clientnegative/updateBasicStats_failure_5.q 
b/ql/src/test/queries/clientnegative/updateBasicStats_failure_5.q
new file mode 100644
index 00000000000..3cdbb0032f9
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/updateBasicStats_failure_5.q
@@ -0,0 +1,4 @@
+create table stat_test (a int);
+
+-- this should fail, only numRows and rawDataSize should be updateable through 
update statistics
+alter table stat_test update statistics set ('totalSize'='1');
diff --git a/ql/src/test/queries/clientnegative/updateBasicStats_failure_6.q 
b/ql/src/test/queries/clientnegative/updateBasicStats_failure_6.q
new file mode 100644
index 00000000000..5a6cf11902b
--- /dev/null
+++ b/ql/src/test/queries/clientnegative/updateBasicStats_failure_6.q
@@ -0,0 +1,4 @@
+create table stat_test (a int);
+
+-- this should fail, only numRows and rawDataSize should be updateable through 
update statistics
+alter table stat_test update statistics set ('numFiles'='1');
\ No newline at end of file
diff --git a/ql/src/test/queries/clientpositive/alter_tableprops_numeric.q 
b/ql/src/test/queries/clientpositive/alter_tableprops_numeric.q
new file mode 100644
index 00000000000..57f2045d2bb
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/alter_tableprops_numeric.q
@@ -0,0 +1,5 @@
+create external table stat_test (a int);
+
+alter table stat_test set TBLPROPERTIES('numFiles'='1', 'numRows'='2', 
'totalSize'='3', 'rawDataSize'='4', 'numFilesErasureCoded'='5', 
'STATS_GENERATED_VIA_STATS_TASK'='true');
+
+describe formatted stat_test;
\ No newline at end of file
diff --git 
a/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_1.q.out 
b/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_1.q.out
new file mode 100644
index 00000000000..1ff2c683a00
--- /dev/null
+++ b/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_1.q.out
@@ -0,0 +1,9 @@
+PREHOOK: query: create table stat_test (a int)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@stat_test
+POSTHOOK: query: create table stat_test (a int)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@stat_test
+FAILED: SemanticException AlterTable numRows failed with value 
diff --git 
a/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_10.q.out 
b/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_10.q.out
new file mode 100644
index 00000000000..d7d8ecc2ef3
--- /dev/null
+++ b/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_10.q.out
@@ -0,0 +1,9 @@
+PREHOOK: query: create table stat_test (a int)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@stat_test
+POSTHOOK: query: create table stat_test (a int)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@stat_test
+FAILED: SemanticException AlterTable numFilesErasureCoded failed with value NaN
diff --git 
a/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_11.q.out 
b/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_11.q.out
new file mode 100644
index 00000000000..d7d8ecc2ef3
--- /dev/null
+++ b/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_11.q.out
@@ -0,0 +1,9 @@
+PREHOOK: query: create table stat_test (a int)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@stat_test
+POSTHOOK: query: create table stat_test (a int)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@stat_test
+FAILED: SemanticException AlterTable numFilesErasureCoded failed with value NaN
diff --git 
a/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_2.q.out 
b/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_2.q.out
new file mode 100644
index 00000000000..47e72e2b4bc
--- /dev/null
+++ b/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_2.q.out
@@ -0,0 +1,9 @@
+PREHOOK: query: create table stat_test (a int)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@stat_test
+POSTHOOK: query: create table stat_test (a int)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@stat_test
+FAILED: SemanticException AlterTable numRows failed with value NaN
diff --git 
a/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_3.q.out 
b/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_3.q.out
new file mode 100644
index 00000000000..ef421edd223
--- /dev/null
+++ b/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_3.q.out
@@ -0,0 +1,9 @@
+PREHOOK: query: create table stat_test (a int)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@stat_test
+POSTHOOK: query: create table stat_test (a int)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@stat_test
+FAILED: SemanticException AlterTable rawDataSize failed with value 
diff --git 
a/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_4.q.out 
b/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_4.q.out
new file mode 100644
index 00000000000..8401bdd3a08
--- /dev/null
+++ b/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_4.q.out
@@ -0,0 +1,9 @@
+PREHOOK: query: create table stat_test (a int)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@stat_test
+POSTHOOK: query: create table stat_test (a int)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@stat_test
+FAILED: SemanticException AlterTable rawDataSize failed with value NaN
diff --git 
a/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_5.q.out 
b/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_5.q.out
new file mode 100644
index 00000000000..48236076344
--- /dev/null
+++ b/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_5.q.out
@@ -0,0 +1,9 @@
+PREHOOK: query: create table stat_test (a int)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@stat_test
+POSTHOOK: query: create table stat_test (a int)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@stat_test
+FAILED: SemanticException AlterTable totalSize failed with value 
diff --git 
a/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_6.q.out 
b/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_6.q.out
new file mode 100644
index 00000000000..2273d54146f
--- /dev/null
+++ b/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_6.q.out
@@ -0,0 +1,9 @@
+PREHOOK: query: create table stat_test (a int)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@stat_test
+POSTHOOK: query: create table stat_test (a int)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@stat_test
+FAILED: SemanticException AlterTable totalSize failed with value NaN
diff --git 
a/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_7.q.out 
b/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_7.q.out
new file mode 100644
index 00000000000..004bf372252
--- /dev/null
+++ b/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_7.q.out
@@ -0,0 +1,9 @@
+PREHOOK: query: create table stat_test (a int)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@stat_test
+POSTHOOK: query: create table stat_test (a int)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@stat_test
+FAILED: SemanticException AlterTable numFiles failed with value 
diff --git 
a/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_8.q.out 
b/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_8.q.out
new file mode 100644
index 00000000000..bb2b01cc81d
--- /dev/null
+++ b/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_8.q.out
@@ -0,0 +1,9 @@
+PREHOOK: query: create table stat_test (a int)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@stat_test
+POSTHOOK: query: create table stat_test (a int)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@stat_test
+FAILED: SemanticException AlterTable numFiles failed with value NaN
diff --git 
a/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_9.q.out 
b/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_9.q.out
new file mode 100644
index 00000000000..3fadd0e5ba1
--- /dev/null
+++ b/ql/src/test/results/clientnegative/alter_tableprops_non_numeric_9.q.out
@@ -0,0 +1,9 @@
+PREHOOK: query: create table stat_test (a int)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@stat_test
+POSTHOOK: query: create table stat_test (a int)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@stat_test
+FAILED: SemanticException AlterTable numFilesErasureCoded failed with value 
diff --git 
a/ql/src/test/results/clientnegative/updateBasicStats_failure_1.q.out 
b/ql/src/test/results/clientnegative/updateBasicStats_failure_1.q.out
new file mode 100644
index 00000000000..1ff2c683a00
--- /dev/null
+++ b/ql/src/test/results/clientnegative/updateBasicStats_failure_1.q.out
@@ -0,0 +1,9 @@
+PREHOOK: query: create table stat_test (a int)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@stat_test
+POSTHOOK: query: create table stat_test (a int)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@stat_test
+FAILED: SemanticException AlterTable numRows failed with value 
diff --git 
a/ql/src/test/results/clientnegative/updateBasicStats_failure_2.q.out 
b/ql/src/test/results/clientnegative/updateBasicStats_failure_2.q.out
new file mode 100644
index 00000000000..47e72e2b4bc
--- /dev/null
+++ b/ql/src/test/results/clientnegative/updateBasicStats_failure_2.q.out
@@ -0,0 +1,9 @@
+PREHOOK: query: create table stat_test (a int)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@stat_test
+POSTHOOK: query: create table stat_test (a int)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@stat_test
+FAILED: SemanticException AlterTable numRows failed with value NaN
diff --git 
a/ql/src/test/results/clientnegative/updateBasicStats_failure_3.q.out 
b/ql/src/test/results/clientnegative/updateBasicStats_failure_3.q.out
new file mode 100644
index 00000000000..ef421edd223
--- /dev/null
+++ b/ql/src/test/results/clientnegative/updateBasicStats_failure_3.q.out
@@ -0,0 +1,9 @@
+PREHOOK: query: create table stat_test (a int)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@stat_test
+POSTHOOK: query: create table stat_test (a int)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@stat_test
+FAILED: SemanticException AlterTable rawDataSize failed with value 
diff --git 
a/ql/src/test/results/clientnegative/updateBasicStats_failure_4.q.out 
b/ql/src/test/results/clientnegative/updateBasicStats_failure_4.q.out
new file mode 100644
index 00000000000..8401bdd3a08
--- /dev/null
+++ b/ql/src/test/results/clientnegative/updateBasicStats_failure_4.q.out
@@ -0,0 +1,9 @@
+PREHOOK: query: create table stat_test (a int)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@stat_test
+POSTHOOK: query: create table stat_test (a int)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@stat_test
+FAILED: SemanticException AlterTable rawDataSize failed with value NaN
diff --git 
a/ql/src/test/results/clientnegative/updateBasicStats_failure_5.q.out 
b/ql/src/test/results/clientnegative/updateBasicStats_failure_5.q.out
new file mode 100644
index 00000000000..72404a0872d
--- /dev/null
+++ b/ql/src/test/results/clientnegative/updateBasicStats_failure_5.q.out
@@ -0,0 +1,9 @@
+PREHOOK: query: create table stat_test (a int)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@stat_test
+POSTHOOK: query: create table stat_test (a int)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@stat_test
+FAILED: SemanticException AlterTable UpdateStats totalSize failed because the 
only valid keys are numRows and rawDataSize
diff --git 
a/ql/src/test/results/clientnegative/updateBasicStats_failure_6.q.out 
b/ql/src/test/results/clientnegative/updateBasicStats_failure_6.q.out
new file mode 100644
index 00000000000..2e5a1a27e89
--- /dev/null
+++ b/ql/src/test/results/clientnegative/updateBasicStats_failure_6.q.out
@@ -0,0 +1,9 @@
+PREHOOK: query: create table stat_test (a int)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@stat_test
+POSTHOOK: query: create table stat_test (a int)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@stat_test
+FAILED: SemanticException AlterTable UpdateStats numFiles failed because the 
only valid keys are numRows and rawDataSize
diff --git 
a/ql/src/test/results/clientpositive/llap/alter_tableprops_numeric.q.out 
b/ql/src/test/results/clientpositive/llap/alter_tableprops_numeric.q.out
new file mode 100644
index 00000000000..d2ab5bf2b5b
--- /dev/null
+++ b/ql/src/test/results/clientpositive/llap/alter_tableprops_numeric.q.out
@@ -0,0 +1,52 @@
+PREHOOK: query: create external table stat_test (a int)
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@stat_test
+POSTHOOK: query: create external table stat_test (a int)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@stat_test
+PREHOOK: query: alter table stat_test set TBLPROPERTIES('numFiles'='1', 
'numRows'='2', 'totalSize'='3', 'rawDataSize'='4', 'numFilesErasureCoded'='5', 
'STATS_GENERATED_VIA_STATS_TASK'='true')
+PREHOOK: type: ALTERTABLE_PROPERTIES
+PREHOOK: Input: default@stat_test
+PREHOOK: Output: default@stat_test
+POSTHOOK: query: alter table stat_test set TBLPROPERTIES('numFiles'='1', 
'numRows'='2', 'totalSize'='3', 'rawDataSize'='4', 'numFilesErasureCoded'='5', 
'STATS_GENERATED_VIA_STATS_TASK'='true')
+POSTHOOK: type: ALTERTABLE_PROPERTIES
+POSTHOOK: Input: default@stat_test
+POSTHOOK: Output: default@stat_test
+PREHOOK: query: describe formatted stat_test
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@stat_test
+POSTHOOK: query: describe formatted stat_test
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@stat_test
+# col_name             data_type               comment             
+a                      int                                         
+                
+# Detailed Table Information            
+Database:              default                  
+#### A masked pattern was here ####
+Retention:             0                        
+#### A masked pattern was here ####
+Table Type:            EXTERNAL_TABLE           
+Table Parameters:               
+       EXTERNAL                TRUE                
+       STATS_GENERATED_VIA_STATS_TASK  true                
+       bucketing_version       2                   
+#### A masked pattern was here ####
+       numFiles                0                   
+       numRows                 2                   
+       rawDataSize             4                   
+       totalSize               #Masked#
+#### A masked pattern was here ####
+                
+# Storage Information           
+SerDe Library:         org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe      
 
+InputFormat:           org.apache.hadoop.mapred.TextInputFormat         
+OutputFormat:          
org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat       
+Compressed:            No                       
+Num Buckets:           -1                       
+Bucket Columns:        []                       
+Sort Columns:          []                       
+Storage Desc Params:            
+       serialization.format    1                   
diff --git 
a/standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/common/StatsSetupConst.java
 
b/standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/common/StatsSetupConst.java
index a04b646c604..aec1a3894f8 100644
--- 
a/standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/common/StatsSetupConst.java
+++ 
b/standalone-metastore/metastore-common/src/main/java/org/apache/hadoop/hive/common/StatsSetupConst.java
@@ -22,8 +22,10 @@
 import java.util.ArrayList;
 import java.util.Map;
 import java.util.TreeMap;
+import java.util.Set;
 
 import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableSet;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hive.metastore.conf.MetastoreConf;
 import org.apache.hadoop.hive.metastore.conf.MetastoreConf.ConfVars;
@@ -134,6 +136,11 @@ public String getAggregator(Configuration conf) {
    */
   public static final List<String> STATS_REQUIRE_COMPUTE = 
ImmutableList.of(ROW_COUNT, RAW_DATA_SIZE);
 
+  /**
+   * Set of table properties which should have numeric values
+   */
+  public static final Set<String> STATS_NUMERIC = 
ImmutableSet.copyOf(SUPPORTED_STATS);
+
   /**
    * List of statistics that can be collected quickly without requiring a scan 
of the data.
    */

Reply via email to