commit c987e2e8b2338803b09a1d7d8bd5d5d5f6702362 Author: Vihang Karajgaonkar Date: Thu May 11 16:43:28 2017 -0700 HIVE-16324 : Truncate table should not work when EXTERNAL property of table is true diff --git metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java index a83e12e8f3e3a2f3149e4bbc09524998d0e8928f..4f7ed9a97138a26821a12aa864e708709199183e 100644 --- metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java +++ metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java @@ -1150,7 +1150,7 @@ public boolean dropTable(String dbName, String tableName) throws MetaException, return mConstraints; } -@Override + @Override public Table getTable(String dbName, String tableName) throws MetaException { boolean commited = false; Table tbl = null; @@ -1429,7 +1429,7 @@ private Table convertToTable(MTable mtbl) throws MetaException { // for backwards compatibility with old metastore persistence if (mtbl.getViewOriginalText() != null) { tableType = TableType.VIRTUAL_VIEW.toString(); - } else if ("TRUE".equals(mtbl.getParameters().get("EXTERNAL"))) { + } else if (Boolean.parseBoolean(mtbl.getParameters().get("EXTERNAL"))) { tableType = TableType.EXTERNAL_TABLE.toString(); } else { tableType = TableType.MANAGED_TABLE.toString(); @@ -1461,7 +1461,7 @@ private MTable convertToMTable(Table tbl) throws InvalidObjectException, // If the table has property EXTERNAL set, update table type // accordingly String tableType = tbl.getTableType(); - boolean isExternal = "TRUE".equals(tbl.getParameters().get("EXTERNAL")); + boolean isExternal = Boolean.parseBoolean(tbl.getParameters().get("EXTERNAL")); if (TableType.MANAGED_TABLE.toString().equals(tableType)) { if (isExternal) { tableType = TableType.EXTERNAL_TABLE.toString(); diff --git metastore/src/java/org/apache/hadoop/hive/metastore/cache/CachedStore.java metastore/src/java/org/apache/hadoop/hive/metastore/cache/CachedStore.java index 39b1676eb9d3c344a6e66f06f096f3a9fb1931ca..1c3cce35cb411870fb8bf85d91a99975d8505e32 100644 --- metastore/src/java/org/apache/hadoop/hive/metastore/cache/CachedStore.java +++ metastore/src/java/org/apache/hadoop/hive/metastore/cache/CachedStore.java @@ -447,7 +447,7 @@ private void validateTableType(Table tbl) { // If the table has property EXTERNAL set, update table type // accordingly String tableType = tbl.getTableType(); - boolean isExternal = "TRUE".equals(tbl.getParameters().get("EXTERNAL")); + boolean isExternal = Boolean.parseBoolean(tbl.getParameters().get("EXTERNAL")); if (TableType.MANAGED_TABLE.toString().equals(tableType)) { if (isExternal) { tableType = TableType.EXTERNAL_TABLE.toString(); diff --git ql/src/test/queries/clientnegative/truncate_table_failure5.q ql/src/test/queries/clientnegative/truncate_table_failure5.q new file mode 100644 index 0000000000000000000000000000000000000000..efabb3426e6e10d18a69b54f0981fb5ccb7fa528 --- /dev/null +++ ql/src/test/queries/clientnegative/truncate_table_failure5.q @@ -0,0 +1,5 @@ +create table external1 (col1 int, col2 string); +alter table external1 set tblproperties ('EXTERNAL'='true'); + +-- truncate on a non-managed table should throw exception +truncate table external1; diff --git ql/src/test/queries/clientnegative/truncate_table_failure6.q ql/src/test/queries/clientnegative/truncate_table_failure6.q new file mode 100644 index 0000000000000000000000000000000000000000..b73ec63d60b64eb97312311279e7fb90d38159a4 --- /dev/null +++ ql/src/test/queries/clientnegative/truncate_table_failure6.q @@ -0,0 +1,5 @@ +create table external1 (col1 int, col2 string); +alter table external1 set tblproperties ('EXTERNAL'='TRUE'); + +-- truncate on external table should throw exception. Property value of 'EXTERNAL' is not case sensitive +truncate table external1; diff --git ql/src/test/results/clientnegative/truncate_table_failure5.q.out ql/src/test/results/clientnegative/truncate_table_failure5.q.out new file mode 100644 index 0000000000000000000000000000000000000000..d2f625d3b1fec58a4181f86d06262d565f6b61f2 --- /dev/null +++ ql/src/test/results/clientnegative/truncate_table_failure5.q.out @@ -0,0 +1,17 @@ +PREHOOK: query: create table external1 (col1 int, col2 string) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@external1 +POSTHOOK: query: create table external1 (col1 int, col2 string) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@external1 +PREHOOK: query: alter table external1 set tblproperties ('EXTERNAL'='true') +PREHOOK: type: ALTERTABLE_PROPERTIES +PREHOOK: Input: default@external1 +PREHOOK: Output: default@external1 +POSTHOOK: query: alter table external1 set tblproperties ('EXTERNAL'='true') +POSTHOOK: type: ALTERTABLE_PROPERTIES +POSTHOOK: Input: default@external1 +POSTHOOK: Output: default@external1 +FAILED: SemanticException [Error 10146]: Cannot truncate non-managed table external1. diff --git ql/src/test/results/clientnegative/truncate_table_failure6.q.out ql/src/test/results/clientnegative/truncate_table_failure6.q.out new file mode 100644 index 0000000000000000000000000000000000000000..88987f5a8b27796d365f5174764f2ce24657da14 --- /dev/null +++ ql/src/test/results/clientnegative/truncate_table_failure6.q.out @@ -0,0 +1,17 @@ +PREHOOK: query: create table external1 (col1 int, col2 string) +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@external1 +POSTHOOK: query: create table external1 (col1 int, col2 string) +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@external1 +PREHOOK: query: alter table external1 set tblproperties ('EXTERNAL'='TRUE') +PREHOOK: type: ALTERTABLE_PROPERTIES +PREHOOK: Input: default@external1 +PREHOOK: Output: default@external1 +POSTHOOK: query: alter table external1 set tblproperties ('EXTERNAL'='TRUE') +POSTHOOK: type: ALTERTABLE_PROPERTIES +POSTHOOK: Input: default@external1 +POSTHOOK: Output: default@external1 +FAILED: SemanticException [Error 10146]: Cannot truncate non-managed table external1.