diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java index 7f6a180..6b7f0dd 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java @@ -6040,7 +6040,6 @@ private Operator genBucketingSortingDest(String dest, Operator input, QB qb, boolean enforceBucketing = false; boolean enforceSorting = false; ArrayList partnCols = new ArrayList(); - ArrayList partnColsNoConvert = new ArrayList(); ArrayList sortCols = new ArrayList(); ArrayList sortOrders = new ArrayList(); boolean multiFileSpray = false; @@ -6052,11 +6051,8 @@ private Operator genBucketingSortingDest(String dest, Operator input, QB qb, enforceBucketing = true; if (updating() || deleting()) { partnCols = getPartitionColsFromBucketColsForUpdateDelete(input, true); - partnColsNoConvert = getPartitionColsFromBucketColsForUpdateDelete(input, false); } else { partnCols = getPartitionColsFromBucketCols(dest, qb, dest_tab, table_desc, input, true); - partnColsNoConvert = getPartitionColsFromBucketCols(dest, qb, dest_tab, table_desc, input, - false); } } @@ -6068,7 +6064,6 @@ private Operator genBucketingSortingDest(String dest, Operator input, QB qb, sortOrders = getSortOrders(dest, qb, dest_tab, input); if (!enforceBucketing) { partnCols = sortCols; - partnColsNoConvert = getSortCols(dest, qb, dest_tab, table_desc, input, false); } } @@ -6104,12 +6099,41 @@ private Operator genBucketingSortingDest(String dest, Operator input, QB qb, reduceSinkOperatorsAddedByEnforceBucketingSorting.add((ReduceSinkOperator)input.getParentOperators().get(0)); ctx.setMultiFileSpray(multiFileSpray); ctx.setNumFiles(numFiles); - ctx.setPartnCols(partnColsNoConvert); ctx.setTotalFiles(totalFiles); } return input; } + private void genPartnCols(String dest, Operator input, QB qb, + TableDesc table_desc, Table dest_tab, SortBucketRSCtx ctx) throws SemanticException { + boolean enforceBucketing = false; + boolean enforceSorting = false; + ArrayList partnColsNoConvert = new ArrayList(); + + if ((dest_tab.getNumBuckets() > 0) && + (conf.getBoolVar(HiveConf.ConfVars.HIVEENFORCEBUCKETING))) { + enforceBucketing = true; + if (updating() || deleting()) { + partnColsNoConvert = getPartitionColsFromBucketColsForUpdateDelete(input, false); + } else { + partnColsNoConvert = getPartitionColsFromBucketCols(dest, qb, dest_tab, table_desc, input, + false); + } + } + + if ((dest_tab.getSortCols() != null) && + (dest_tab.getSortCols().size() > 0) && + (conf.getBoolVar(HiveConf.ConfVars.HIVEENFORCESORTING))) { + enforceSorting = true; + if (!enforceBucketing) { + partnColsNoConvert = getSortCols(dest, qb, dest_tab, table_desc, input, false); + } + } + + if (enforceBucketing || enforceSorting) { + ctx.setPartnCols(partnColsNoConvert); + } + } /** * Check for HOLD_DDLTIME hint. * @@ -6553,6 +6577,12 @@ protected Operator genFileSinkPlan(String dest, QB qb, Operator input) // If this table is working with ACID semantics, turn off merging canBeMerged &= !destTableIsAcid; + // Generate the partition columns from the parent input + if (dest_type.intValue() == QBMetaData.DEST_TABLE + || dest_type.intValue() == QBMetaData.DEST_PARTITION) { + genPartnCols(dest, input, qb, table_desc, dest_tab, rsCtx); + } + FileSinkDesc fileSinkDesc = new FileSinkDesc( queryTmpdir, table_desc,