diff --git ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java index 946f9a6..393ef57 100644 --- ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java +++ ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java @@ -403,6 +403,8 @@ COLUMNSTATSCOLLECTOR_PARSE_ERROR(30009, "Encountered parse error while parsing rewritten query"), COLUMNSTATSCOLLECTOR_IO_ERROR(30010, "Encountered I/O exception while parsing rewritten query"), DROP_COMMAND_NOT_ALLOWED_FOR_PARTITION(30011, "Partition protected from being dropped"), + COLUMNSTATSCOLLECTOR_INVALID_COLUMN(30012, "Column statistics are not supported " + + "for partition columns"), ; private int errorCode; diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/ColumnStatsSemanticAnalyzer.java ql/src/java/org/apache/hadoop/hive/ql/parse/ColumnStatsSemanticAnalyzer.java index 5e3a513..e22e73b 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/ColumnStatsSemanticAnalyzer.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/ColumnStatsSemanticAnalyzer.java @@ -31,6 +31,7 @@ import org.apache.hadoop.hive.metastore.api.FieldSchema; import org.apache.hadoop.hive.ql.Context; import org.apache.hadoop.hive.ql.ErrorMsg; +import org.apache.hadoop.hive.ql.exec.Utilities; import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.metadata.Partition; import org.apache.hadoop.hive.ql.metadata.Table; @@ -520,6 +521,7 @@ public ColumnStatsSemanticAnalyzer(HiveConf conf, ASTNode tree) throws SemanticE originalTree = tree; boolean isPartitionStats = isPartitionLevelStats(tree); PartitionList partList = null; + checkForPartitionColumns(colNames, getPartitionKeys(tableName)); if (isPartitionStats) { isTableLevel = false; @@ -543,6 +545,30 @@ public ColumnStatsSemanticAnalyzer(HiveConf conf, ASTNode tree) throws SemanticE } } + private List getPartitionKeys(String tableName) throws SemanticException { + List fields = null; + try { + fields = db.getTable(tableName).getPartitionKeys(); + } catch (HiveException e) { + throw new SemanticException(ErrorMsg.INVALID_TABLE.getMsg(tableName)); + } + + return Utilities.getColumnNamesFromFieldSchema(fields); + } + + private void checkForPartitionColumns(List specifiedCols, List partCols) + throws SemanticException { + // Raise error if user has specified partition name in the list of columns + for(String pc : partCols) { + for(String sc : specifiedCols) { + if (pc.equalsIgnoreCase(sc)) { + throw new SemanticException(ErrorMsg.COLUMNSTATSCOLLECTOR_INVALID_COLUMN.getMsg() + + " [Try removing column '" + sc + "' from column list]"); + } + } + } + } + @Override public void analyze(ASTNode ast, Context origCtx) throws SemanticException { QB qb;