Author: hashutosh
Date: Fri Dec  6 14:59:57 2013
New Revision: 1548549

URL: http://svn.apache.org/r1548549
Log:
HIVE-5686 : partition column type validation doesn't quite work for dates 
(Sergey Shelukhin via Ashutosh Chauhan)

Added:
    hive/trunk/ql/src/test/queries/clientnegative/illegal_partition_type4.q
    hive/trunk/ql/src/test/results/clientnegative/illegal_partition_type4.q.out
Modified:
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java
    
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
    hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java

Modified: hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java?rev=1548549&r1=1548548&r2=1548549&view=diff
==============================================================================
--- hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java 
(original)
+++ hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/Utilities.java Fri 
Dec  6 14:59:57 2013
@@ -2351,7 +2351,7 @@ public final class Utilities {
     jobConf.set(serdeConstants.LIST_COLUMN_TYPES, columnTypesString);
   }
 
-  public static void validatePartSpec(Table tbl, Map<String, String> partSpec)
+  public static void validatePartSpecColumnNames(Table tbl, Map<String, 
String> partSpec)
       throws SemanticException {
 
     List<FieldSchema> parts = tbl.getPartitionKeys();

Modified: 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java?rev=1548549&r1=1548548&r2=1548549&view=diff
==============================================================================
--- 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
 (original)
+++ 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
 Fri Dec  6 14:59:57 2013
@@ -1134,48 +1134,53 @@ public abstract class BaseSemanticAnalyz
     return storedAsDirs;
   }
 
-  private static void getPartExprNodeDesc(ASTNode astNode,
-      Map<ASTNode, ExprNodeDesc> astExprNodeMap)
-          throws SemanticException, HiveException {
+  private static boolean getPartExprNodeDesc(ASTNode astNode,
+      Map<ASTNode, ExprNodeDesc> astExprNodeMap) throws SemanticException {
 
-    if ((astNode == null) || (astNode.getChildren() == null) || 
-        (astNode.getChildren().size() == 0)) {
-      return;
+    if (astNode == null) {
+      return true;
+    } else if ((astNode.getChildren() == null) || 
(astNode.getChildren().size() == 0)) {
+      return astNode.getType() != HiveParser.TOK_PARTVAL;
     }
 
     TypeCheckCtx typeCheckCtx = new TypeCheckCtx(null);
+    boolean result = true;
     for (Node childNode : astNode.getChildren()) {
       ASTNode childASTNode = (ASTNode)childNode;
 
       if (childASTNode.getType() != HiveParser.TOK_PARTVAL) {
-        getPartExprNodeDesc(childASTNode, astExprNodeMap);
+        result = getPartExprNodeDesc(childASTNode, astExprNodeMap) && result;
       } else {
-        if (childASTNode.getChildren().size() <= 1) {
-          throw new HiveException("This is dynamic partitioning");
+        boolean isDynamicPart = childASTNode.getChildren().size() <= 1;
+        result = !isDynamicPart && result;
+        if (!isDynamicPart) {
+          ASTNode partVal = (ASTNode)childASTNode.getChildren().get(1);
+          astExprNodeMap.put((ASTNode)childASTNode.getChildren().get(0),
+            TypeCheckProcFactory.genExprNode(partVal, 
typeCheckCtx).get(partVal));
         }
-
-        ASTNode partValASTChild = (ASTNode)childASTNode.getChildren().get(1);
-        astExprNodeMap.put((ASTNode)childASTNode.getChildren().get(0),
-            TypeCheckProcFactory.genExprNode(partValASTChild, 
typeCheckCtx).get(partValASTChild));
       }
     }
+    return result;
   }
 
   public static void validatePartSpec(Table tbl, Map<String, String> partSpec,
       ASTNode astNode, HiveConf conf) throws SemanticException {
-    Map<ASTNode, ExprNodeDesc> astExprNodeMap = new HashMap<ASTNode, 
ExprNodeDesc>();
-
-    Utilities.validatePartSpec(tbl, partSpec);
+    Utilities.validatePartSpecColumnNames(tbl, partSpec);
 
     if (!HiveConf.getBoolVar(conf, 
HiveConf.ConfVars.HIVE_TYPE_CHECK_ON_INSERT)) {
       return;
     }
 
-    try {
-      getPartExprNodeDesc(astNode, astExprNodeMap);
-    } catch (HiveException e) {
-      return;
+    Map<ASTNode, ExprNodeDesc> astExprNodeMap = new HashMap<ASTNode, 
ExprNodeDesc>();
+    if (!getPartExprNodeDesc(astNode, astExprNodeMap)) {
+      STATIC_LOG.warn("Dynamic partitioning is used; only validating "
+          + astExprNodeMap.size() + " columns");
+    }
+
+    if (astExprNodeMap.isEmpty()) {
+      return; // All columns are dynamic, nothing to do.
     }
+
     List<FieldSchema> parts = tbl.getPartitionKeys();
     Map<String, String> partCols = new HashMap<String, String>(parts.size());
     for (FieldSchema col : parts) {

Modified: 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java?rev=1548549&r1=1548548&r2=1548549&view=diff
==============================================================================
--- 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java 
(original)
+++ 
hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java 
Fri Dec  6 14:59:57 2013
@@ -5267,7 +5267,7 @@ public class SemanticAnalyzer extends Ba
         }
         dpCtx = qbm.getDPCtx(dest);
         if (dpCtx == null) {
-          Utilities.validatePartSpec(dest_tab, partSpec);
+          Utilities.validatePartSpecColumnNames(dest_tab, partSpec);
           dpCtx = new DynamicPartitionCtx(dest_tab, partSpec,
               conf.getVar(HiveConf.ConfVars.DEFAULTPARTITIONNAME),
               
conf.getIntVar(HiveConf.ConfVars.DYNAMICPARTITIONMAXPARTSPERNODE));

Added: hive/trunk/ql/src/test/queries/clientnegative/illegal_partition_type4.q
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/queries/clientnegative/illegal_partition_type4.q?rev=1548549&view=auto
==============================================================================
--- hive/trunk/ql/src/test/queries/clientnegative/illegal_partition_type4.q 
(added)
+++ hive/trunk/ql/src/test/queries/clientnegative/illegal_partition_type4.q Fri 
Dec  6 14:59:57 2013
@@ -0,0 +1,3 @@
+create table tab1(s string) PARTITIONED BY(dt date, st string);
+alter table tab1 add partition (dt=date 'foo', st='foo');
+drop table tab1;

Added: 
hive/trunk/ql/src/test/results/clientnegative/illegal_partition_type4.q.out
URL: 
http://svn.apache.org/viewvc/hive/trunk/ql/src/test/results/clientnegative/illegal_partition_type4.q.out?rev=1548549&view=auto
==============================================================================
--- hive/trunk/ql/src/test/results/clientnegative/illegal_partition_type4.q.out 
(added)
+++ hive/trunk/ql/src/test/results/clientnegative/illegal_partition_type4.q.out 
Fri Dec  6 14:59:57 2013
@@ -0,0 +1,6 @@
+PREHOOK: query: create table tab1(s string) PARTITIONED BY(dt date, st string)
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: create table tab1(s string) PARTITIONED BY(dt date, st string)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@tab1
+FAILED: SemanticException Unable to convert date literal string to date value.


Reply via email to