diff --git itests/hive-unit/src/test/java/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java itests/hive-unit/src/test/java/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java index a55c186..5da4165 100644 --- itests/hive-unit/src/test/java/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java +++ itests/hive-unit/src/test/java/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java @@ -2944,6 +2944,7 @@ private Table createTable(String dbName, String tblName, String owner, tbl.setSd(sd); tbl.setLastAccessTime(lastAccessTime); + tbl.setTableType(TableType.MANAGED_TABLE.toString()); client.createTable(tbl); diff --git metastore/src/java/org/apache/hadoop/hive/metastore/TransactionalValidationListener.java metastore/src/java/org/apache/hadoop/hive/metastore/TransactionalValidationListener.java index 96158f8..3e74675 100644 --- metastore/src/java/org/apache/hadoop/hive/metastore/TransactionalValidationListener.java +++ metastore/src/java/org/apache/hadoop/hive/metastore/TransactionalValidationListener.java @@ -86,6 +86,12 @@ private void handleAlterTableTransactionalProp(PreAlterTableEvent context) throw throw new MetaException("The table must be bucketed and stored using an ACID compliant" + " format (such as ORC)"); } + + if (newTable.getTableType().equals(TableType.EXTERNAL_TABLE.toString())) { + throw new MetaException(newTable.getDbName() + "." + newTable.getTableName() + + " cannot be declared transactional because it's an external table"); + } + return; } Table oldTable = context.getOldTable(); @@ -144,6 +150,11 @@ private void handleCreateTableTransactionalProp(PreCreateTableEvent context) thr " format (such as ORC)"); } + if (newTable.getTableType().equals(TableType.EXTERNAL_TABLE.toString())) { + throw new MetaException(newTable.getDbName() + "." + newTable.getTableName() + + " cannot be declared transactional because it's an external table"); + } + // normalize prop name parameters.put(hive_metastoreConstants.TABLE_IS_TRANSACTIONAL, Boolean.TRUE.toString()); return; diff --git ql/src/test/queries/clientnegative/alter_external_acid.q ql/src/test/queries/clientnegative/alter_external_acid.q new file mode 100644 index 0000000..7807278 --- /dev/null +++ ql/src/test/queries/clientnegative/alter_external_acid.q @@ -0,0 +1,9 @@ +set hive.support.concurrency=true; +set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager; + + +create external table acid_external (a int, b varchar(128)) clustered by (b) into 2 buckets stored as orc; + +alter table acid_external set TBLPROPERTIES ('transactional'='true'); + +drop table acid_external; \ No newline at end of file diff --git ql/src/test/queries/clientnegative/create_external_acid.q ql/src/test/queries/clientnegative/create_external_acid.q new file mode 100644 index 0000000..d6b2d84 --- /dev/null +++ ql/src/test/queries/clientnegative/create_external_acid.q @@ -0,0 +1,6 @@ +set hive.support.concurrency=true; +set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager; + + +create external table acid_external (a int, b varchar(128)) clustered by (b) into 2 buckets stored as orc TBLPROPERTIES ('transactional'='true'); + diff --git ql/src/test/results/clientnegative/alter_external_acid.q.out ql/src/test/results/clientnegative/alter_external_acid.q.out new file mode 100644 index 0000000..69bba3b --- /dev/null +++ ql/src/test/results/clientnegative/alter_external_acid.q.out @@ -0,0 +1,13 @@ +PREHOOK: query: create external table acid_external (a int, b varchar(128)) clustered by (b) into 2 buckets stored as orc +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@acid_external +POSTHOOK: query: create external table acid_external (a int, b varchar(128)) clustered by (b) into 2 buckets stored as orc +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@acid_external +PREHOOK: query: alter table acid_external set TBLPROPERTIES ('transactional'='true') +PREHOOK: type: ALTERTABLE_PROPERTIES +PREHOOK: Input: default@acid_external +PREHOOK: Output: default@acid_external +FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. Unable to alter table. default.acid_external cannot be declared transactional because it's an external table diff --git ql/src/test/results/clientnegative/create_external_acid.q.out ql/src/test/results/clientnegative/create_external_acid.q.out new file mode 100644 index 0000000..123fe5a --- /dev/null +++ ql/src/test/results/clientnegative/create_external_acid.q.out @@ -0,0 +1,5 @@ +PREHOOK: query: create external table acid_external (a int, b varchar(128)) clustered by (b) into 2 buckets stored as orc TBLPROPERTIES ('transactional'='true') +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@acid_external +FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:default.acid_external cannot be declared transactional because it's an external table)