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.
*/