Repository: hive Updated Branches: refs/heads/master 1e8a31e8f -> ff55d0a67
HIVE-13175: Disallow making external tables transactional (Wei Zheng, reviewed by Eugene Koifman) Project: http://git-wip-us.apache.org/repos/asf/hive/repo Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/ff55d0a6 Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/ff55d0a6 Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/ff55d0a6 Branch: refs/heads/master Commit: ff55d0a67e59c15b5ccfbdf1317bfd60cf057a30 Parents: 1e8a31e Author: Wei <wzh...@hortonworks.com> Authored: Thu Mar 10 13:39:13 2016 -0800 Committer: Wei <wzh...@hortonworks.com> Committed: Thu Mar 10 13:39:13 2016 -0800 ---------------------------------------------------------------------- .../hadoop/hive/metastore/TestHiveMetaStore.java | 1 + .../metastore/TransactionalValidationListener.java | 11 +++++++++++ .../test/queries/clientnegative/alter_external_acid.q | 9 +++++++++ .../test/queries/clientnegative/create_external_acid.q | 6 ++++++ .../results/clientnegative/alter_external_acid.q.out | 13 +++++++++++++ .../results/clientnegative/create_external_acid.q.out | 5 +++++ 6 files changed, 45 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hive/blob/ff55d0a6/itests/hive-unit/src/test/java/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java ---------------------------------------------------------------------- diff --git a/itests/hive-unit/src/test/java/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java b/itests/hive-unit/src/test/java/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java index a55c186..5da4165 100644 --- a/itests/hive-unit/src/test/java/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java +++ b/itests/hive-unit/src/test/java/org/apache/hadoop/hive/metastore/TestHiveMetaStore.java @@ -2944,6 +2944,7 @@ public abstract class TestHiveMetaStore extends TestCase { tbl.setSd(sd); tbl.setLastAccessTime(lastAccessTime); + tbl.setTableType(TableType.MANAGED_TABLE.toString()); client.createTable(tbl); http://git-wip-us.apache.org/repos/asf/hive/blob/ff55d0a6/metastore/src/java/org/apache/hadoop/hive/metastore/TransactionalValidationListener.java ---------------------------------------------------------------------- diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/TransactionalValidationListener.java b/metastore/src/java/org/apache/hadoop/hive/metastore/TransactionalValidationListener.java index 96158f8..3e74675 100644 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/TransactionalValidationListener.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/TransactionalValidationListener.java @@ -86,6 +86,12 @@ final class TransactionalValidationListener extends MetaStorePreEventListener { 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 @@ final class TransactionalValidationListener extends MetaStorePreEventListener { " 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; http://git-wip-us.apache.org/repos/asf/hive/blob/ff55d0a6/ql/src/test/queries/clientnegative/alter_external_acid.q ---------------------------------------------------------------------- diff --git a/ql/src/test/queries/clientnegative/alter_external_acid.q b/ql/src/test/queries/clientnegative/alter_external_acid.q new file mode 100644 index 0000000..7807278 --- /dev/null +++ b/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 http://git-wip-us.apache.org/repos/asf/hive/blob/ff55d0a6/ql/src/test/queries/clientnegative/create_external_acid.q ---------------------------------------------------------------------- diff --git a/ql/src/test/queries/clientnegative/create_external_acid.q b/ql/src/test/queries/clientnegative/create_external_acid.q new file mode 100644 index 0000000..d6b2d84 --- /dev/null +++ b/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'); + http://git-wip-us.apache.org/repos/asf/hive/blob/ff55d0a6/ql/src/test/results/clientnegative/alter_external_acid.q.out ---------------------------------------------------------------------- diff --git a/ql/src/test/results/clientnegative/alter_external_acid.q.out b/ql/src/test/results/clientnegative/alter_external_acid.q.out new file mode 100644 index 0000000..69bba3b --- /dev/null +++ b/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 http://git-wip-us.apache.org/repos/asf/hive/blob/ff55d0a6/ql/src/test/results/clientnegative/create_external_acid.q.out ---------------------------------------------------------------------- diff --git a/ql/src/test/results/clientnegative/create_external_acid.q.out b/ql/src/test/results/clientnegative/create_external_acid.q.out new file mode 100644 index 0000000..123fe5a --- /dev/null +++ b/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)