You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by zs...@apache.org on 2010/01/28 06:07:38 UTC

svn commit: r903959 - in /hadoop/hive/trunk: ./ ql/src/java/org/apache/hadoop/hive/ql/exec/ ql/src/java/org/apache/hadoop/hive/ql/parse/ ql/src/java/org/apache/hadoop/hive/ql/plan/ ql/src/test/queries/clientpositive/ ql/src/test/results/clientnegative/...

Author: zshao
Date: Thu Jan 28 05:07:37 2010
New Revision: 903959

URL: http://svn.apache.org/viewvc?rev=903959&view=rev
Log:
HIVE-1106. Support ALTER TABLE t ADD IF NOT EXIST PARTITION. (Paul Yang via zshao)

Added:
    hadoop/hive/trunk/ql/src/test/queries/clientpositive/add_part_exist.q
    hadoop/hive/trunk/ql/src/test/results/clientpositive/add_part_exist.q.out
Modified:
    hadoop/hive/trunk/CHANGES.txt
    hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
    hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java
    hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g
    hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/AddPartitionDesc.java
    hadoop/hive/trunk/ql/src/test/results/clientnegative/addpart1.q.out

Modified: hadoop/hive/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/CHANGES.txt?rev=903959&r1=903958&r2=903959&view=diff
==============================================================================
--- hadoop/hive/trunk/CHANGES.txt (original)
+++ hadoop/hive/trunk/CHANGES.txt Thu Jan 28 05:07:37 2010
@@ -189,6 +189,9 @@
     HIVE-1036. Add API Method to Query HiveConf Values of the Metastore.
     (Paul Yang via zshao)
 
+    HIVE-1106. Support ALTER TABLE t ADD IF NOT EXIST PARTITION.
+    (Paul Yang via zshao)
+
   IMPROVEMENTS
 
     HIVE-760. Add version info to META-INF/MANIFEST.MF.

Modified: hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java?rev=903959&r1=903958&r2=903959&view=diff
==============================================================================
--- hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java (original)
+++ hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/exec/DDLTask.java Thu Jan 28 05:07:37 2010
@@ -219,6 +219,13 @@
     if (tbl.isView()) {
       throw new HiveException("Cannot use ALTER TABLE on a view");
     }
+    
+    // If the add partition was created with IF NOT EXISTS, then we should
+    // not throw an error if the specified part does exist.
+    Partition checkPart = db.getPartition(tbl, addPartitionDesc.getPartSpec(), false);
+    if(checkPart != null && addPartitionDesc.getIfNotExists()) {
+      return 0;
+    }
 
     if (addPartitionDesc.getLocation() == null) {
       db.createPartition(tbl, addPartitionDesc.getPartSpec());

Modified: hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java?rev=903959&r1=903958&r2=903959&view=diff
==============================================================================
--- hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java (original)
+++ hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java Thu Jan 28 05:07:37 2010
@@ -522,16 +522,20 @@
 
     String currentLocation = null;
     Map<String, String> currentPart = null;
+    boolean ifNotExists = false;
 
     int numCh = ast.getChildCount();
     for (int num = 1; num < numCh; num++) {
       CommonTree child = (CommonTree) ast.getChild(num);
       switch (child.getToken().getType()) {
+      case HiveParser.TOK_IFNOTEXISTS:
+        ifNotExists = true;
+        break;
       case HiveParser.TOK_PARTSPEC:
         if (currentPart != null) {
           AddPartitionDesc addPartitionDesc = new AddPartitionDesc(
               MetaStoreUtils.DEFAULT_DATABASE_NAME, tblName, currentPart,
-              currentLocation);
+              currentLocation, ifNotExists);
           rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(),
               addPartitionDesc), conf));
         }
@@ -552,7 +556,7 @@
     if (currentPart != null) {
       AddPartitionDesc addPartitionDesc = new AddPartitionDesc(
           MetaStoreUtils.DEFAULT_DATABASE_NAME, tblName, currentPart,
-          currentLocation);
+          currentLocation, ifNotExists);
       rootTasks.add(TaskFactory.get(new DDLWork(getInputs(), getOutputs(),
           addPartitionDesc), conf));
     }

Modified: hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g?rev=903959&r1=903958&r2=903959&view=diff
==============================================================================
--- hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g (original)
+++ hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/parse/Hive.g Thu Jan 28 05:07:37 2010
@@ -307,8 +307,8 @@
 alterStatementSuffixAddPartitions
 @init { msgs.push("add partition statement"); }
 @after { msgs.pop(); }
-    : Identifier KW_ADD partitionSpec partitionLocation? (partitionSpec partitionLocation?)*
-    -> ^(TOK_ALTERTABLE_ADDPARTS Identifier (partitionSpec partitionLocation?)+)
+    : Identifier KW_ADD ifNotExists? partitionSpec partitionLocation? (partitionSpec partitionLocation?)*
+    -> ^(TOK_ALTERTABLE_ADDPARTS Identifier ifNotExists? (partitionSpec partitionLocation?)+)
     ;
 
 partitionLocation

Modified: hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/AddPartitionDesc.java
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/AddPartitionDesc.java?rev=903959&r1=903958&r2=903959&view=diff
==============================================================================
--- hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/AddPartitionDesc.java (original)
+++ hadoop/hive/trunk/ql/src/java/org/apache/hadoop/hive/ql/plan/AddPartitionDesc.java Thu Jan 28 05:07:37 2010
@@ -27,6 +27,7 @@
   String tableName;
   String dbName;
   String location;
+  boolean ifNotExists;
   Map<String, String> partSpec;
 
   /**
@@ -38,14 +39,17 @@
    *          partition specification.
    * @param location
    *          partition location, relative to table location.
+   * @param ifNotExists 
+   *          if true, the partition is only added if it doesn't exist
    */
   public AddPartitionDesc(String dbName, String tableName,
-      Map<String, String> partSpec, String location) {
+      Map<String, String> partSpec, String location, boolean ifNotExists) {
     super();
     this.dbName = dbName;
     this.tableName = tableName;
     this.partSpec = partSpec;
     this.location = location;
+    this.ifNotExists = ifNotExists;
   }
 
   /**
@@ -108,4 +112,18 @@
     this.partSpec = partSpec;
   }
 
+  /**
+   * @return if the partition should only be added if it doesn't exist already
+   */
+  public boolean getIfNotExists() {
+    return this.ifNotExists;
+  }
+  
+  /**
+   * @param ifNotExists 
+   *          if the part should be added only if it doesn't exist
+   */
+  public void setIfNotExists(boolean ifNotExists) {
+    this.ifNotExists = ifNotExists;
+  }
 }
\ No newline at end of file

Added: hadoop/hive/trunk/ql/src/test/queries/clientpositive/add_part_exist.q
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/ql/src/test/queries/clientpositive/add_part_exist.q?rev=903959&view=auto
==============================================================================
--- hadoop/hive/trunk/ql/src/test/queries/clientpositive/add_part_exist.q (added)
+++ hadoop/hive/trunk/ql/src/test/queries/clientpositive/add_part_exist.q Thu Jan 28 05:07:37 2010
@@ -0,0 +1,16 @@
+CREATE TABLE add_part_test (key STRING, value STRING) PARTITIONED BY (ds STRING);
+SHOW PARTITIONS add_part_test;
+
+ALTER TABLE add_part_test ADD PARTITION (ds='2010-01-01');
+SHOW PARTITIONS add_part_test;
+
+ALTER TABLE add_part_test ADD IF NOT EXISTS PARTITION (ds='2010-01-01');
+SHOW PARTITIONS add_part_test;
+
+ALTER TABLE add_part_test ADD IF NOT EXISTS PARTITION (ds='2010-01-02');
+SHOW PARTITIONS add_part_test;
+
+ALTER TABLE add_part_test ADD IF NOT EXISTS PARTITION (ds='2010-01-01') PARTITION (ds='2010-01-02') PARTITION (ds='2010-01-03');
+SHOW PARTITIONS add_part_test;
+
+DROP TABLE add_part_test;

Modified: hadoop/hive/trunk/ql/src/test/results/clientnegative/addpart1.q.out
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/ql/src/test/results/clientnegative/addpart1.q.out?rev=903959&r1=903958&r2=903959&view=diff
==============================================================================
--- hadoop/hive/trunk/ql/src/test/results/clientnegative/addpart1.q.out (original)
+++ hadoop/hive/trunk/ql/src/test/results/clientnegative/addpart1.q.out Thu Jan 28 05:07:37 2010
@@ -19,5 +19,5 @@
 b=f/c=s
 PREHOOK: query: alter table addpart1 add partition (b='f', c='')
 PREHOOK: type: ALTERTABLE_ADDPARTS
-FAILED: Error in metadata: add partition: Value for key c is null or empty
+FAILED: Error in metadata: get partition: Value for key c is null or empty
 FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask

Added: hadoop/hive/trunk/ql/src/test/results/clientpositive/add_part_exist.q.out
URL: http://svn.apache.org/viewvc/hadoop/hive/trunk/ql/src/test/results/clientpositive/add_part_exist.q.out?rev=903959&view=auto
==============================================================================
--- hadoop/hive/trunk/ql/src/test/results/clientpositive/add_part_exist.q.out (added)
+++ hadoop/hive/trunk/ql/src/test/results/clientpositive/add_part_exist.q.out Thu Jan 28 05:07:37 2010
@@ -0,0 +1,56 @@
+PREHOOK: query: CREATE TABLE add_part_test (key STRING, value STRING) PARTITIONED BY (ds STRING)
+PREHOOK: type: CREATETABLE
+POSTHOOK: query: CREATE TABLE add_part_test (key STRING, value STRING) PARTITIONED BY (ds STRING)
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: default@add_part_test
+PREHOOK: query: SHOW PARTITIONS add_part_test
+PREHOOK: type: SHOWPARTITIONS
+POSTHOOK: query: SHOW PARTITIONS add_part_test
+POSTHOOK: type: SHOWPARTITIONS
+PREHOOK: query: ALTER TABLE add_part_test ADD PARTITION (ds='2010-01-01')
+PREHOOK: type: ALTERTABLE_ADDPARTS
+POSTHOOK: query: ALTER TABLE add_part_test ADD PARTITION (ds='2010-01-01')
+POSTHOOK: type: ALTERTABLE_ADDPARTS
+POSTHOOK: Output: default@add_part_test@ds=2010-01-01
+PREHOOK: query: SHOW PARTITIONS add_part_test
+PREHOOK: type: SHOWPARTITIONS
+POSTHOOK: query: SHOW PARTITIONS add_part_test
+POSTHOOK: type: SHOWPARTITIONS
+ds=2010-01-01
+PREHOOK: query: ALTER TABLE add_part_test ADD IF NOT EXISTS PARTITION (ds='2010-01-01')
+PREHOOK: type: ALTERTABLE_ADDPARTS
+POSTHOOK: query: ALTER TABLE add_part_test ADD IF NOT EXISTS PARTITION (ds='2010-01-01')
+POSTHOOK: type: ALTERTABLE_ADDPARTS
+PREHOOK: query: SHOW PARTITIONS add_part_test
+PREHOOK: type: SHOWPARTITIONS
+POSTHOOK: query: SHOW PARTITIONS add_part_test
+POSTHOOK: type: SHOWPARTITIONS
+ds=2010-01-01
+PREHOOK: query: ALTER TABLE add_part_test ADD IF NOT EXISTS PARTITION (ds='2010-01-02')
+PREHOOK: type: ALTERTABLE_ADDPARTS
+POSTHOOK: query: ALTER TABLE add_part_test ADD IF NOT EXISTS PARTITION (ds='2010-01-02')
+POSTHOOK: type: ALTERTABLE_ADDPARTS
+POSTHOOK: Output: default@add_part_test@ds=2010-01-02
+PREHOOK: query: SHOW PARTITIONS add_part_test
+PREHOOK: type: SHOWPARTITIONS
+POSTHOOK: query: SHOW PARTITIONS add_part_test
+POSTHOOK: type: SHOWPARTITIONS
+ds=2010-01-01
+ds=2010-01-02
+PREHOOK: query: ALTER TABLE add_part_test ADD IF NOT EXISTS PARTITION (ds='2010-01-01') PARTITION (ds='2010-01-02') PARTITION (ds='2010-01-03')
+PREHOOK: type: ALTERTABLE_ADDPARTS
+POSTHOOK: query: ALTER TABLE add_part_test ADD IF NOT EXISTS PARTITION (ds='2010-01-01') PARTITION (ds='2010-01-02') PARTITION (ds='2010-01-03')
+POSTHOOK: type: ALTERTABLE_ADDPARTS
+POSTHOOK: Output: default@add_part_test@ds=2010-01-03
+PREHOOK: query: SHOW PARTITIONS add_part_test
+PREHOOK: type: SHOWPARTITIONS
+POSTHOOK: query: SHOW PARTITIONS add_part_test
+POSTHOOK: type: SHOWPARTITIONS
+ds=2010-01-01
+ds=2010-01-02
+ds=2010-01-03
+PREHOOK: query: DROP TABLE add_part_test
+PREHOOK: type: DROPTABLE
+POSTHOOK: query: DROP TABLE add_part_test
+POSTHOOK: type: DROPTABLE
+POSTHOOK: Output: default@add_part_test