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