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