Index: conf/hive-default.xml
===================================================================
--- conf/hive-default.xml (revision 1043848)
+++ conf/hive-default.xml (working copy)
@@ -815,4 +815,11 @@
This enables substitution using syntax like ${var} ${system:var} and ${env:var}.
+
+ hive.error.on.empty.partition
+ false
+ Whether to throw an excpetion if dynamic partition insert generates empty results.
+
+
+
Index: common/src/java/org/apache/hadoop/hive/conf/HiveConf.java
===================================================================
--- common/src/java/org/apache/hadoop/hive/conf/HiveConf.java (revision 1043848)
+++ common/src/java/org/apache/hadoop/hive/conf/HiveConf.java (working copy)
@@ -323,7 +323,10 @@
SEMANTIC_ANALYZER_HOOK("hive.semantic.analyzer.hook",null),
// Print column names in output
- HIVE_CLI_PRINT_HEADER("hive.cli.print.header", false);
+ HIVE_CLI_PRINT_HEADER("hive.cli.print.header", false),
+
+ HIVE_ERROR_ON_EMPTY_PARTITION("hive.error.on.empty.partition", false);
+
;
Index: ql/src/test/results/clientnegative/dyn_part_empty.q.out
===================================================================
--- ql/src/test/results/clientnegative/dyn_part_empty.q.out (revision 0)
+++ ql/src/test/results/clientnegative/dyn_part_empty.q.out (revision 0)
@@ -0,0 +1,14 @@
+PREHOOK: query: create table dyn_err(key string, value string) partitioned by (ds string)
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: create table dyn_err(key string, value string) partitioned by (ds string)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@dyn_err
+PREHOOK: query: insert overwrite table dyn_err partition(ds) select key, value, ds from srcpart where ds is not null and key = 'no exists'
+PREHOOK: type: QUERY
+PREHOOK: Input: default@srcpart@ds=2008-04-08/hr=11
+PREHOOK: Input: default@srcpart@ds=2008-04-08/hr=12
+PREHOOK: Input: default@srcpart@ds=2008-04-09/hr=11
+PREHOOK: Input: default@srcpart@ds=2008-04-09/hr=12
+PREHOOK: Output: default@dyn_err
+Failed with exception This query creates no partitions. To turn off this error, set hive.error.on.empty.partition=false.
+FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.MoveTask
Index: ql/src/test/queries/clientnegative/dyn_part_empty.q
===================================================================
--- ql/src/test/queries/clientnegative/dyn_part_empty.q (revision 0)
+++ ql/src/test/queries/clientnegative/dyn_part_empty.q (revision 0)
@@ -0,0 +1,8 @@
+set hive.exec.dynamic.partition=true;
+set hive.exec.dynamic.partition.mode=nonstrict;
+set hive.stats.autogether=false;
+set hive.error.on.empty.partition=true;
+
+create table dyn_err(key string, value string) partitioned by (ds string);
+
+insert overwrite table dyn_err partition(ds) select key, value, ds from srcpart where ds is not null and key = 'no exists';
Index: ql/src/java/org/apache/hadoop/hive/ql/exec/MoveTask.java
===================================================================
--- ql/src/java/org/apache/hadoop/hive/ql/exec/MoveTask.java (revision 1043848)
+++ ql/src/java/org/apache/hadoop/hive/ql/exec/MoveTask.java (working copy)
@@ -185,7 +185,9 @@
List> dps = Utilities.getFullDPSpecs(conf, dpCtx);
// publish DP columns to its subscribers
- pushFeed(FeedType.DYNAMIC_PARTITIONS, dps);
+ if (dps != null && dps.size() > 0) {
+ pushFeed(FeedType.DYNAMIC_PARTITIONS, dps);
+ }
// load the list of DP partitions and return the list of partition specs
// TODO: In a follow-up to HIVE-1361, we should refactor loadDynamicPartitions
@@ -204,6 +206,10 @@
dpCtx.getNumDPCols(),
tbd.getHoldDDLTime());
+ if (dp.size() == 0 && conf.getBoolVar(HiveConf.ConfVars.HIVE_ERROR_ON_EMPTY_PARTITION)) {
+ throw new HiveException("This query creates no partitions." +
+ " To turn off this error, set hive.error.on.empty.partition=false.");
+ }
// for each partition spec, get the partition
// and put it to WriteEntity for post-exec hook