Author: navis
Date: Thu Sep 12 02:07:42 2013
New Revision: 1522118

URL: http://svn.apache.org/r1522118
Log:
HIVE-5240 : Column statistics on a partitioned column should fail early with 
proper error message (Prasanth J via Navis)

Modified:
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java
    
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/ColumnStatsSemanticAnalyzer.java

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java?rev=1522118&r1=1522117&r2=1522118&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java (original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java Thu Sep 12 
02:07:42 2013
@@ -403,6 +403,8 @@ public enum ErrorMsg {
   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;

Modified: 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/ColumnStatsSemanticAnalyzer.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/ColumnStatsSemanticAnalyzer.java?rev=1522118&r1=1522117&r2=1522118&view=diff
==============================================================================
--- 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/ColumnStatsSemanticAnalyzer.java
 (original)
+++ 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/ColumnStatsSemanticAnalyzer.java
 Thu Sep 12 02:07:42 2013
@@ -31,6 +31,7 @@ import org.apache.hadoop.hive.conf.HiveC
 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 class ColumnStatsSemanticAnalyzer
       originalTree = tree;
       boolean isPartitionStats = isPartitionLevelStats(tree);
       PartitionList partList = null;
+      checkForPartitionColumns(colNames, getPartitionKeys(tableName));
 
       if (isPartitionStats) {
         isTableLevel = false;
@@ -543,6 +545,30 @@ public class ColumnStatsSemanticAnalyzer
     }
   }
 
+  private List<String> getPartitionKeys(String tableName) throws 
SemanticException {
+    List<FieldSchema> fields;
+    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<String> specifiedCols, 
List<String> partCols)
+      throws SemanticException {
+    // Raise error if user has specified partition column for stats
+    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;


Reply via email to