diff --git a/itests/src/test/resources/testconfiguration.properties b/itests/src/test/resources/testconfiguration.properties index 889884c94ef1fb51a92f2a1f233280dd87e5a0ee..e46e6ce476ad1c9632eed6ace277b591dccd5c5f 100644 --- a/itests/src/test/resources/testconfiguration.properties +++ b/itests/src/test/resources/testconfiguration.properties @@ -522,7 +522,8 @@ encrypted.query.files=encryption_join_unencrypted_tbl.q,\ encryption_insert_values.q \ encryption_drop_view.q \ encryption_drop_partition.q \ - encryption_with_trash.q + encryption_with_trash.q \ + encryption_ctas.q beeline.positive.exclude=add_part_exist.q,\ alter1.q,\ diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java index 987f25daeb92f6ff1393790efab4668c87eb9d3b..1678e2c26a6ff1d54041ab24fb7f6bf2b2d6f2ed 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java @@ -2068,7 +2068,12 @@ private void getMetaData(QB qb, ReadEntity parentInput) Path location; try { Warehouse wh = new Warehouse(conf); - location = wh.getDatabasePath(db.getDatabase(names[0])); + //Use destination table's db location. + String destTableDb = qb.getTableDesc() != null? qb.getTableDesc().getDatabaseName(): null; + if (destTableDb == null) { + destTableDb = names[0]; + } + location = wh.getDatabasePath(db.getDatabase(destTableDb)); } catch (MetaException e) { throw new SemanticException(e); } diff --git a/ql/src/test/queries/clientpositive/encryption_ctas.q b/ql/src/test/queries/clientpositive/encryption_ctas.q new file mode 100644 index 0000000000000000000000000000000000000000..93058b6d4acfe1a477d758f4bbd0d0937e57e48f --- /dev/null +++ b/ql/src/test/queries/clientpositive/encryption_ctas.q @@ -0,0 +1,16 @@ +DROP TABLE IF EXISTS testCT.encrypted_tablectas PURGE; +DROP DATABASE IF EXISTS testCT; +CREATE DATABASE testCT; +dfs ${system:test.dfs.mkdir} ${hiveconf:hive.metastore.warehouse.dir}/default/encrypted_tablectas; + +CRYPTO CREATE_KEY --keyName key_128 --bitLength 128; +CRYPTO CREATE_ZONE --keyName key_128 --path ${hiveconf:hive.metastore.warehouse.dir}/default/encrypted_tablectas; + +CREATE TABLE testCT.encrypted_tablectas LOCATION '${hiveconf:hive.metastore.warehouse.dir}/default/encrypted_tablectas' +AS SELECT * from src where key = 100 limit 1; + +select * from testCT.encrypted_tablectas; + +DROP TABLE testCT.encrypted_tablectas PURGE; +CRYPTO DELETE_KEY --keyName key_128; +DROP DATABASE testCT; diff --git a/ql/src/test/results/clientpositive/encrypted/encryption_ctas.q.out b/ql/src/test/results/clientpositive/encrypted/encryption_ctas.q.out new file mode 100644 index 0000000000000000000000000000000000000000..5b503ac64f332ca7991cc0a4ad29b9cc7f0cb16e --- /dev/null +++ b/ql/src/test/results/clientpositive/encrypted/encryption_ctas.q.out @@ -0,0 +1,56 @@ +PREHOOK: query: DROP TABLE IF EXISTS testCT.encrypted_tablectas PURGE +PREHOOK: type: DROPTABLE +POSTHOOK: query: DROP TABLE IF EXISTS testCT.encrypted_tablectas PURGE +POSTHOOK: type: DROPTABLE +PREHOOK: query: DROP DATABASE IF EXISTS testCT +PREHOOK: type: DROPDATABASE +POSTHOOK: query: DROP DATABASE IF EXISTS testCT +POSTHOOK: type: DROPDATABASE +PREHOOK: query: CREATE DATABASE testCT +PREHOOK: type: CREATEDATABASE +PREHOOK: Output: database:testCT +POSTHOOK: query: CREATE DATABASE testCT +POSTHOOK: type: CREATEDATABASE +POSTHOOK: Output: database:testCT +Encryption key created: 'key_128' +Encryption zone created: '/build/ql/test/data/warehouse/default/encrypted_tablectas' using key: 'key_128' +#### A masked pattern was here #### +AS SELECT * from src where key = 100 limit 1 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@src +#### A masked pattern was here #### +PREHOOK: Output: database:testct +PREHOOK: Output: testCT@encrypted_tablectas +#### A masked pattern was here #### +AS SELECT * from src where key = 100 limit 1 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: Output: database:testct +POSTHOOK: Output: testCT@encrypted_tablectas +PREHOOK: query: select * from testCT.encrypted_tablectas +PREHOOK: type: QUERY +PREHOOK: Input: testct@encrypted_tablectas +#### A masked pattern was here #### +POSTHOOK: query: select * from testCT.encrypted_tablectas +POSTHOOK: type: QUERY +POSTHOOK: Input: testct@encrypted_tablectas +#### A masked pattern was here #### +100 val_100 +PREHOOK: query: DROP TABLE testCT.encrypted_tablectas PURGE +PREHOOK: type: DROPTABLE +PREHOOK: Input: testct@encrypted_tablectas +PREHOOK: Output: testct@encrypted_tablectas +POSTHOOK: query: DROP TABLE testCT.encrypted_tablectas PURGE +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: testct@encrypted_tablectas +POSTHOOK: Output: testct@encrypted_tablectas +Encryption key deleted: 'key_128' +PREHOOK: query: DROP DATABASE testCT +PREHOOK: type: DROPDATABASE +PREHOOK: Input: database:testct +PREHOOK: Output: database:testct +POSTHOOK: query: DROP DATABASE testCT +POSTHOOK: type: DROPDATABASE +POSTHOOK: Input: database:testct +POSTHOOK: Output: database:testct