diff --git ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java index d01a203a4c..384dec0187 100644 --- ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java +++ ql/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java @@ -469,6 +469,7 @@ INVALID_JOIN_CONDITION(10407, "Error parsing condition in outer join"), INVALID_TARGET_COLUMN_IN_SET_CLAUSE(10408, "Target column \"{0}\" of set clause is not found in table \"{1}\".", true), HIVE_GROUPING_FUNCTION_EXPR_NOT_IN_GROUPBY(10409, "Expression in GROUPING function not present in GROUP BY"), + LOAD_DATA_ON_ACID_TABLE(10500, "LOAD DATA... statement is not supported on transactional table {0}.", true), //========================== 20000 range starts here ========================// SCRIPT_INIT_ERROR(20000, "Unable to initialize custom script."), SCRIPT_IO_ERROR(20001, "An error occurred while reading or writing to your custom script. " diff --git ql/src/java/org/apache/hadoop/hive/ql/parse/LoadSemanticAnalyzer.java ql/src/java/org/apache/hadoop/hive/ql/parse/LoadSemanticAnalyzer.java index bda94ff765..fa79700df7 100644 --- ql/src/java/org/apache/hadoop/hive/ql/parse/LoadSemanticAnalyzer.java +++ ql/src/java/org/apache/hadoop/hive/ql/parse/LoadSemanticAnalyzer.java @@ -46,6 +46,7 @@ import org.apache.hadoop.hive.ql.exec.TaskFactory; import org.apache.hadoop.hive.ql.exec.Utilities; import org.apache.hadoop.hive.ql.hooks.WriteEntity; +import org.apache.hadoop.hive.ql.io.AcidUtils; import org.apache.hadoop.hive.ql.io.HiveFileFormatUtils; import org.apache.hadoop.hive.ql.metadata.Hive; import org.apache.hadoop.hive.ql.metadata.HiveException; @@ -56,6 +57,7 @@ import org.apache.hadoop.mapred.InputFormat; import com.google.common.collect.Lists; +import org.apache.orc.impl.OrcAcidUtils; /** * LoadSemanticAnalyzer. @@ -226,6 +228,9 @@ public void analyzeInternal(ASTNode ast) throws SemanticException { + " and use 'insert... select' to allow Hive to enforce bucketing. " + error); } + if(AcidUtils.isAcidTable(ts.tableHandle)) { + throw new SemanticException(ErrorMsg.LOAD_DATA_ON_ACID_TABLE, ts.tableHandle.getCompleteName()); + } // make sure the arguments make sense List files = applyConstraintsAndGetFiles(fromURI, fromTree, isLocal); diff --git ql/src/test/queries/clientnegative/load_data_into_acid.q ql/src/test/queries/clientnegative/load_data_into_acid.q new file mode 100644 index 0000000000..fba1496fc6 --- /dev/null +++ ql/src/test/queries/clientnegative/load_data_into_acid.q @@ -0,0 +1,22 @@ +set hive.strict.checks.bucketing=false; +set hive.support.concurrency=true; +set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager; +set hive.input.format=org.apache.hadoop.hive.ql.io.HiveInputFormat; + +create table acid_ivot( + ctinyint TINYINT, + csmallint SMALLINT, + cint INT, + cbigint BIGINT, + cfloat FLOAT, + cdouble DOUBLE, + cstring1 STRING, + cstring2 STRING, + ctimestamp1 TIMESTAMP, + ctimestamp2 TIMESTAMP, + cboolean1 BOOLEAN, + cboolean2 BOOLEAN) clustered by (cint) into 1 buckets stored as orc TBLPROPERTIES ('transactional'='true'); + +LOAD DATA LOCAL INPATH "../../data/files/alltypesorc" into table acid_ivot; + + diff --git ql/src/test/results/clientnegative/load_data_into_acid.q.out ql/src/test/results/clientnegative/load_data_into_acid.q.out new file mode 100644 index 0000000000..ca53ec7aca --- /dev/null +++ ql/src/test/results/clientnegative/load_data_into_acid.q.out @@ -0,0 +1,33 @@ +PREHOOK: query: create table acid_ivot( + ctinyint TINYINT, + csmallint SMALLINT, + cint INT, + cbigint BIGINT, + cfloat FLOAT, + cdouble DOUBLE, + cstring1 STRING, + cstring2 STRING, + ctimestamp1 TIMESTAMP, + ctimestamp2 TIMESTAMP, + cboolean1 BOOLEAN, + cboolean2 BOOLEAN) clustered by (cint) into 1 buckets stored as orc TBLPROPERTIES ('transactional'='true') +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@acid_ivot +POSTHOOK: query: create table acid_ivot( + ctinyint TINYINT, + csmallint SMALLINT, + cint INT, + cbigint BIGINT, + cfloat FLOAT, + cdouble DOUBLE, + cstring1 STRING, + cstring2 STRING, + ctimestamp1 TIMESTAMP, + ctimestamp2 TIMESTAMP, + cboolean1 BOOLEAN, + cboolean2 BOOLEAN) clustered by (cint) into 1 buckets stored as orc TBLPROPERTIES ('transactional'='true') +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@acid_ivot +FAILED: SemanticException [Error 10500]: LOAD DATA... statement is not supported on transactional table default@acid_ivot.