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

anishek 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 3c42435  HIVE-23960: Partition with no column statistics leads to 
unbalanced calls to openTransaction/commitTransaction error during 
get_partitions_by_names (Pravin Kumar Sinha, reviewed by Aasha Medhi)
3c42435 is described below

commit 3c42435545000de08aa99f2bf225b027128ea1ba
Author: Anishek Agarwal <anis...@gmail.com>
AuthorDate: Mon Aug 10 11:02:55 2020 +0530

    HIVE-23960: Partition with no column statistics leads to unbalanced calls 
to openTransaction/commitTransaction error during get_partitions_by_names 
(Pravin Kumar Sinha, reviewed by Aasha Medhi)
---
 .../queries/clientpositive/repl_4_exim_nocolstat.q |  33 +++++
 .../llap/repl_4_exim_nocolstat.q.out               | 149 +++++++++++++++++++++
 .../apache/hadoop/hive/metastore/ObjectStore.java  |   9 +-
 3 files changed, 189 insertions(+), 2 deletions(-)

diff --git a/ql/src/test/queries/clientpositive/repl_4_exim_nocolstat.q 
b/ql/src/test/queries/clientpositive/repl_4_exim_nocolstat.q
new file mode 100644
index 0000000..4b4ad07
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/repl_4_exim_nocolstat.q
@@ -0,0 +1,33 @@
+set hive.mapred.mode=nonstrict;
+set hive.test.mode=true;
+set hive.test.mode.prefix=;
+set hive.test.mode.nosamplelist=replsrc,repldst;
+set metastore.try.direct.sql=false;
+set hive.metastore.rawstore.impl=org.apache.hadoop.hive.metastore.ObjectStore;
+
+drop table if exists replsrc;
+drop table if exists repldst;
+
+create table replsrc (emp_id int comment "employee id")
+        partitioned by (emp_country string, emp_state string)
+        stored as textfile;
+load data local inpath "../../data/files/test.dat"
+        into table replsrc partition (emp_country="us",emp_state="ca");
+
+alter table replsrc add partition (emp_country="zx",emp_state="ka");
+
+dfs ${system:test.dfs.mkdir} target/tmp/ql/test/data/exports/repldst/temp;
+dfs -rmr target/tmp/ql/test/data/exports/repldst;
+
+export table replsrc to 'ql/test/data/exports/repldst' for 
replication('repldst');
+
+drop table replsrc;
+
+import table repldst from 'ql/test/data/exports/repldst';
+describe extended repldst;
+show table extended like repldst;
+show create table repldst;
+select * from repldst;
+
+drop table repldst;
+
diff --git 
a/ql/src/test/results/clientpositive/llap/repl_4_exim_nocolstat.q.out 
b/ql/src/test/results/clientpositive/llap/repl_4_exim_nocolstat.q.out
new file mode 100644
index 0000000..4ff902d
--- /dev/null
+++ b/ql/src/test/results/clientpositive/llap/repl_4_exim_nocolstat.q.out
@@ -0,0 +1,149 @@
+PREHOOK: query: drop table if exists replsrc
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: drop table if exists replsrc
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: drop table if exists repldst
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: drop table if exists repldst
+POSTHOOK: type: DROPTABLE
+PREHOOK: query: create table replsrc (emp_id int comment "employee id")
+        partitioned by (emp_country string, emp_state string)
+        stored as textfile
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@replsrc
+POSTHOOK: query: create table replsrc (emp_id int comment "employee id")
+        partitioned by (emp_country string, emp_state string)
+        stored as textfile
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@replsrc
+PREHOOK: query: load data local inpath "../../data/files/test.dat"
+        into table replsrc partition (emp_country="us",emp_state="ca")
+PREHOOK: type: LOAD
+#### A masked pattern was here ####
+PREHOOK: Output: default@replsrc
+POSTHOOK: query: load data local inpath "../../data/files/test.dat"
+        into table replsrc partition (emp_country="us",emp_state="ca")
+POSTHOOK: type: LOAD
+#### A masked pattern was here ####
+POSTHOOK: Output: default@replsrc
+POSTHOOK: Output: default@replsrc@emp_country=us/emp_state=ca
+PREHOOK: query: alter table replsrc add partition 
(emp_country="zx",emp_state="ka")
+PREHOOK: type: ALTERTABLE_ADDPARTS
+PREHOOK: Output: default@replsrc
+POSTHOOK: query: alter table replsrc add partition 
(emp_country="zx",emp_state="ka")
+POSTHOOK: type: ALTERTABLE_ADDPARTS
+POSTHOOK: Output: default@replsrc
+POSTHOOK: Output: default@replsrc@emp_country=zx/emp_state=ka
+#### A masked pattern was here ####
+PREHOOK: query: export table replsrc to 'ql/test/data/exports/repldst' for 
replication('repldst')
+PREHOOK: type: EXPORT
+PREHOOK: Input: default@replsrc@emp_country=us/emp_state=ca
+PREHOOK: Input: default@replsrc@emp_country=zx/emp_state=ka
+#### A masked pattern was here ####
+POSTHOOK: query: export table replsrc to 'ql/test/data/exports/repldst' for 
replication('repldst')
+POSTHOOK: type: EXPORT
+POSTHOOK: Input: default@replsrc@emp_country=us/emp_state=ca
+POSTHOOK: Input: default@replsrc@emp_country=zx/emp_state=ka
+#### A masked pattern was here ####
+PREHOOK: query: drop table replsrc
+PREHOOK: type: DROPTABLE
+PREHOOK: Input: default@replsrc
+PREHOOK: Output: default@replsrc
+POSTHOOK: query: drop table replsrc
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Input: default@replsrc
+POSTHOOK: Output: default@replsrc
+PREHOOK: query: import table repldst from 'ql/test/data/exports/repldst'
+PREHOOK: type: IMPORT
+#### A masked pattern was here ####
+PREHOOK: Output: default@repldst
+POSTHOOK: query: import table repldst from 'ql/test/data/exports/repldst'
+POSTHOOK: type: IMPORT
+#### A masked pattern was here ####
+POSTHOOK: Output: default@repldst
+POSTHOOK: Output: default@repldst@emp_country=us/emp_state=ca
+POSTHOOK: Output: default@repldst@emp_country=zx/emp_state=ka
+PREHOOK: query: describe extended repldst
+PREHOOK: type: DESCTABLE
+PREHOOK: Input: default@repldst
+POSTHOOK: query: describe extended repldst
+POSTHOOK: type: DESCTABLE
+POSTHOOK: Input: default@repldst
+emp_id                 int                     employee id         
+emp_country            string                                      
+emp_state              string                                      
+                
+# Partition Information                 
+# col_name             data_type               comment             
+emp_country            string                                      
+emp_state              string                                      
+                
+#### A masked pattern was here ####
+PREHOOK: query: show table extended like repldst
+PREHOOK: type: SHOW_TABLESTATUS
+POSTHOOK: query: show table extended like repldst
+POSTHOOK: type: SHOW_TABLESTATUS
+tableName:repldst
+#### A masked pattern was here ####
+inputformat:org.apache.hadoop.mapred.TextInputFormat
+outputformat:org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat
+columns:struct columns { i32 emp_id}
+partitioned:true
+partitionColumns:struct partition_columns { string emp_country, string 
emp_state}
+totalNumberFiles:1
+totalFileSize:11
+maxFileSize:11
+minFileSize:11
+#### A masked pattern was here ####
+
+PREHOOK: query: show create table repldst
+PREHOOK: type: SHOW_CREATETABLE
+PREHOOK: Input: default@repldst
+POSTHOOK: query: show create table repldst
+POSTHOOK: type: SHOW_CREATETABLE
+POSTHOOK: Input: default@repldst
+CREATE TABLE `repldst`(
+  `emp_id` int COMMENT 'employee id')
+PARTITIONED BY ( 
+  `emp_country` string, 
+  `emp_state` string)
+ROW FORMAT SERDE 
+  'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' 
+STORED AS INPUTFORMAT 
+  'org.apache.hadoop.mapred.TextInputFormat' 
+OUTPUTFORMAT 
+  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
+LOCATION
+#### A masked pattern was here ####
+TBLPROPERTIES (
+  'bucketing_version'='2', 
+  'repl.last.id'='0', 
+#### A masked pattern was here ####
+PREHOOK: query: select * from repldst
+PREHOOK: type: QUERY
+PREHOOK: Input: default@repldst
+PREHOOK: Input: default@repldst@emp_country=us/emp_state=ca
+PREHOOK: Input: default@repldst@emp_country=zx/emp_state=ka
+#### A masked pattern was here ####
+POSTHOOK: query: select * from repldst
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@repldst
+POSTHOOK: Input: default@repldst@emp_country=us/emp_state=ca
+POSTHOOK: Input: default@repldst@emp_country=zx/emp_state=ka
+#### A masked pattern was here ####
+1      us      ca
+2      us      ca
+3      us      ca
+4      us      ca
+5      us      ca
+6      us      ca
+PREHOOK: query: drop table repldst
+PREHOOK: type: DROPTABLE
+PREHOOK: Input: default@repldst
+PREHOOK: Output: default@repldst
+POSTHOOK: query: drop table repldst
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Input: default@repldst
+POSTHOOK: Output: default@repldst
diff --git 
a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ObjectStore.java
 
b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ObjectStore.java
index 1fc0be7..f866b94 100644
--- 
a/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ObjectStore.java
+++ 
b/standalone-metastore/metastore-server/src/main/java/org/apache/hadoop/hive/metastore/ObjectStore.java
@@ -9226,6 +9226,10 @@ public class ObjectStore implements RawStore, 
Configurable {
   public List<ColumnStatistics> getPartitionColumnStatistics(String catName, 
String dbName, String tableName,
       List<String> partNames, List<String> colNames, String engine) throws 
MetaException, NoSuchObjectException {
     // Note: this will get stats without verifying ACID.
+    if (CollectionUtils.isEmpty(partNames) || 
CollectionUtils.isEmpty(colNames)) {
+      LOG.debug("PartNames and/or ColNames are empty");
+      return Collections.emptyList();
+    }
     return getPartitionColumnStatisticsInternal(
         catName, dbName, tableName, partNames, colNames, engine, true, true);
   }
@@ -9236,8 +9240,9 @@ public class ObjectStore implements RawStore, 
Configurable {
       List<String> partNames, List<String> colNames,
       String engine, String writeIdList)
       throws MetaException, NoSuchObjectException {
-    if (partNames == null || partNames.isEmpty()) {
-      return null;
+    if (CollectionUtils.isEmpty(partNames) || 
CollectionUtils.isEmpty(colNames)) {
+      LOG.debug("PartNames and/or ColNames are empty");
+      return Collections.emptyList();
     }
     List<ColumnStatistics> allStats = getPartitionColumnStatisticsInternal(
         catName, dbName, tableName, partNames, colNames, engine, true, true);

Reply via email to