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..fefaf66 100644 --- metastore/src/java/org/apache/hadoop/hive/metastore/TransactionalValidationListener.java +++ metastore/src/java/org/apache/hadoop/hive/metastore/TransactionalValidationListener.java @@ -144,6 +144,10 @@ private void handleCreateTableTransactionalProp(PreCreateTableEvent context) thr " format (such as ORC)"); } + if (newTable.getTableType().equals(TableType.EXTERNAL_TABLE.toString())) { + throw new MetaException("An external table cannot be an ACID table)"); + } + // normalize prop name parameters.put(hive_metastoreConstants.TABLE_IS_TRANSACTIONAL, Boolean.TRUE.toString()); return; 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/create_external_acid.q.out ql/src/test/results/clientnegative/create_external_acid.q.out new file mode 100644 index 0000000..8e591ef --- /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:An external table cannot be an ACID table))