Author: hashutosh
Date: Fri Sep 27 20:58:54 2013
New Revision: 1527078

URL: http://svn.apache.org/r1527078
Log:
HIVE-5272 : Column statistics on a invalid column name results in 
IndexOutOfBoundsException (Prasanth J via Ashutosh Chauhan)

Modified:
    
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/ColumnStatsSemanticAnalyzer.java
    hive/trunk/ql/src/test/results/clientnegative/columnstats_tbllvl.q.out
    
hive/trunk/ql/src/test/results/clientnegative/columnstats_tbllvl_incorrect_column.q.out

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=1527078&r1=1527077&r2=1527078&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
 Fri Sep 27 20:58:54 2013
@@ -522,6 +522,7 @@ public class ColumnStatsSemanticAnalyzer
       boolean isPartitionStats = isPartitionLevelStats(tree);
       PartitionList partList = null;
       checkForPartitionColumns(colNames, getPartitionKeys(tableName));
+      validateSpecifiedColumnNames(tableName, colNames);
 
       if (isPartitionStats) {
         isTableLevel = false;
@@ -545,6 +546,25 @@ public class ColumnStatsSemanticAnalyzer
     }
   }
 
+  // fail early if the columns specified for column statistics are not valid
+  private void validateSpecifiedColumnNames(String tableName, List<String> 
specifiedCols)
+      throws SemanticException {
+    List<FieldSchema> fields = null;
+    try {
+      fields = db.getTable(tableName).getAllCols();
+    } catch (HiveException e) {
+      throw new SemanticException(ErrorMsg.INVALID_TABLE.getMsg(tableName));
+    }
+    List<String> tableCols = Utilities.getColumnNamesFromFieldSchema(fields);
+
+    for(String sc : specifiedCols) {
+      if (!tableCols.contains(sc.toLowerCase())) {
+        String msg = "'" + sc + "' (possible columns are " + 
tableCols.toString() + ")";
+        throw new SemanticException(ErrorMsg.INVALID_COLUMN.getMsg(msg));
+      }
+    }
+  }
+
   private List<String> getPartitionKeys(String tableName) throws 
SemanticException {
     List<FieldSchema> fields;
     try {

Modified: hive/trunk/ql/src/test/results/clientnegative/columnstats_tbllvl.q.out
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientnegative/columnstats_tbllvl.q.out?rev=1527078&r1=1527077&r2=1527078&view=diff
==============================================================================
--- hive/trunk/ql/src/test/results/clientnegative/columnstats_tbllvl.q.out 
(original)
+++ hive/trunk/ql/src/test/results/clientnegative/columnstats_tbllvl.q.out Fri 
Sep 27 20:58:54 2013
@@ -33,4 +33,4 @@ PREHOOK: Output: default@uservisits_web_
 POSTHOOK: query: LOAD DATA LOCAL INPATH "../data/files/UserVisits.dat" INTO 
TABLE UserVisits_web_text_none
 POSTHOOK: type: LOAD
 POSTHOOK: Output: default@uservisits_web_text_none
-FAILED: SemanticException [Error 10004]: Line 1:21 Invalid table alias or 
column reference 'destIP': (possible column names are: sourceip, desturl, 
visitdate, adrevenue, useragent, ccode, lcode, skeyword, avgtimeonsite)
+FAILED: SemanticException [Error 10002]: Invalid column reference 'destIP' 
(possible columns are [sourceip, desturl, visitdate, adrevenue, useragent, 
ccode, lcode, skeyword, avgtimeonsite])

Modified: 
hive/trunk/ql/src/test/results/clientnegative/columnstats_tbllvl_incorrect_column.q.out
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientnegative/columnstats_tbllvl_incorrect_column.q.out?rev=1527078&r1=1527077&r2=1527078&view=diff
==============================================================================
--- 
hive/trunk/ql/src/test/results/clientnegative/columnstats_tbllvl_incorrect_column.q.out
 (original)
+++ 
hive/trunk/ql/src/test/results/clientnegative/columnstats_tbllvl_incorrect_column.q.out
 Fri Sep 27 20:58:54 2013
@@ -33,4 +33,4 @@ PREHOOK: Output: default@uservisits_web_
 POSTHOOK: query: LOAD DATA LOCAL INPATH "../data/files/UserVisits.dat" INTO 
TABLE UserVisits_web_text_none
 POSTHOOK: type: LOAD
 POSTHOOK: Output: default@uservisits_web_text_none
-FAILED: SemanticException [Error 10004]: Line 1:21 Invalid table alias or 
column reference 'destIP': (possible column names are: sourceip, desturl, 
visitdate, adrevenue, useragent, ccode, lcode, skeyword, avgtimeonsite)
+FAILED: SemanticException [Error 10002]: Invalid column reference 'destIP' 
(possible columns are [sourceip, desturl, visitdate, adrevenue, useragent, 
ccode, lcode, skeyword, avgtimeonsite])


Reply via email to