Repository: hive Updated Branches: refs/heads/llap 7a2391376 -> be00a031d
HIVE-12011: unable to create temporary table using CTAS if regular table with that name already exists (Pengcheng Xiong, reviewed by Laljo John Pullokkaran) Project: http://git-wip-us.apache.org/repos/asf/hive/repo Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/b2f63ba9 Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/b2f63ba9 Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/b2f63ba9 Branch: refs/heads/llap Commit: b2f63ba914045e8285445d48bf656627a84bd2f7 Parents: bcff871 Author: Pengcheng Xiong <[email protected]> Authored: Tue Oct 6 14:19:12 2015 -0700 Committer: Pengcheng Xiong <[email protected]> Committed: Tue Oct 6 14:19:12 2015 -0700 ---------------------------------------------------------------------- .../ql/metadata/SessionHiveMetaStoreClient.java | 2 +- .../hadoop/hive/ql/parse/SemanticAnalyzer.java | 31 ++++-- ql/src/test/queries/clientpositive/temp_table.q | 26 +++++ .../clientpositive/spark/temp_table.q.out | 107 +++++++++++++++++++ .../results/clientpositive/temp_table.q.out | 107 +++++++++++++++++++ .../results/clientpositive/tez/temp_table.q.out | 107 +++++++++++++++++++ 6 files changed, 372 insertions(+), 8 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hive/blob/b2f63ba9/ql/src/java/org/apache/hadoop/hive/ql/metadata/SessionHiveMetaStoreClient.java ---------------------------------------------------------------------- diff --git a/ql/src/java/org/apache/hadoop/hive/ql/metadata/SessionHiveMetaStoreClient.java b/ql/src/java/org/apache/hadoop/hive/ql/metadata/SessionHiveMetaStoreClient.java index 51ff262..6091c3f 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/metadata/SessionHiveMetaStoreClient.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/metadata/SessionHiveMetaStoreClient.java @@ -515,7 +515,7 @@ public class SessionHiveMetaStoreClient extends HiveMetaStoreClient implements I return newCopy; } - private Map<String, Table> getTempTablesForDatabase(String dbName) { + public static Map<String, Table> getTempTablesForDatabase(String dbName) { SessionState ss = SessionState.get(); if (ss == null) { LOG.debug("No current SessionState, skipping temp tables"); http://git-wip-us.apache.org/repos/asf/hive/blob/b2f63ba9/ql/src/java/org/apache/hadoop/hive/ql/parse/SemanticAnalyzer.java ---------------------------------------------------------------------- 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 4bec228..7a54aec 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 @@ -112,6 +112,7 @@ import org.apache.hadoop.hive.ql.metadata.HiveException; import org.apache.hadoop.hive.ql.metadata.HiveUtils; import org.apache.hadoop.hive.ql.metadata.InvalidTableException; import org.apache.hadoop.hive.ql.metadata.Partition; +import org.apache.hadoop.hive.ql.metadata.SessionHiveMetaStoreClient; import org.apache.hadoop.hive.ql.metadata.Table; import org.apache.hadoop.hive.ql.metadata.VirtualColumn; import org.apache.hadoop.hive.ql.optimizer.Optimizer; @@ -10943,14 +10944,30 @@ public class SemanticAnalyzer extends BaseSemanticAnalyzer { case CTAS: // create table as select - // Verify that the table does not already exist - try { - Table dumpTable = db.newTable(dbDotTab); - if (null != db.getTable(dumpTable.getDbName(), dumpTable.getTableName(), false)) { - throw new SemanticException(ErrorMsg.TABLE_ALREADY_EXISTS.getMsg(dbDotTab)); + if (isTemporary) { + String dbName = qualifiedTabName[0]; + String tblName = qualifiedTabName[1]; + SessionState ss = SessionState.get(); + if (ss == null) { + throw new SemanticException("No current SessionState, cannot create temporary table " + + dbName + "." + tblName); + } + Map<String, Table> tables = SessionHiveMetaStoreClient.getTempTablesForDatabase(dbName); + if (tables != null && tables.containsKey(tblName)) { + throw new SemanticException("Temporary table " + dbName + "." + tblName + + " already exists"); + } + } else { + // Verify that the table does not already exist + // dumpTable is only used to check the conflict for non-temporary tables + try { + Table dumpTable = db.newTable(dbDotTab); + if (null != db.getTable(dumpTable.getDbName(), dumpTable.getTableName(), false)) { + throw new SemanticException(ErrorMsg.TABLE_ALREADY_EXISTS.getMsg(dbDotTab)); + } + } catch (HiveException e) { + throw new SemanticException(e); } - } catch (HiveException e) { - throw new SemanticException(e); } if(location != null && location.length() != 0) { http://git-wip-us.apache.org/repos/asf/hive/blob/b2f63ba9/ql/src/test/queries/clientpositive/temp_table.q ---------------------------------------------------------------------- diff --git a/ql/src/test/queries/clientpositive/temp_table.q b/ql/src/test/queries/clientpositive/temp_table.q index e587f3f..65f3eb4 100644 --- a/ql/src/test/queries/clientpositive/temp_table.q +++ b/ql/src/test/queries/clientpositive/temp_table.q @@ -42,3 +42,29 @@ use default; DROP DATABASE two CASCADE; DROP TABLE bay; + +create table s as select * from src limit 10; + +select count(*) from s; + +create temporary table s as select * from s limit 2; + +select count(*) from s; + +with s as ( select * from src limit 1) +select count(*) from s; + +with src as ( select * from s) +select count(*) from src; + +drop table s; + +select count(*) from s; + +with s as ( select * from src limit 1) +select count(*) from s; + +with src as ( select * from s) +select count(*) from src; + +drop table s; http://git-wip-us.apache.org/repos/asf/hive/blob/b2f63ba9/ql/src/test/results/clientpositive/spark/temp_table.q.out ---------------------------------------------------------------------- diff --git a/ql/src/test/results/clientpositive/spark/temp_table.q.out b/ql/src/test/results/clientpositive/spark/temp_table.q.out index 65e256d..718a8a4 100644 --- a/ql/src/test/results/clientpositive/spark/temp_table.q.out +++ b/ql/src/test/results/clientpositive/spark/temp_table.q.out @@ -448,3 +448,110 @@ POSTHOOK: query: DROP TABLE bay POSTHOOK: type: DROPTABLE POSTHOOK: Input: default@bay POSTHOOK: Output: default@bay +PREHOOK: query: create table s as select * from src limit 10 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@src +PREHOOK: Output: database:default +PREHOOK: Output: default@s +POSTHOOK: query: create table s as select * from src limit 10 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@src +POSTHOOK: Output: database:default +POSTHOOK: Output: default@s +PREHOOK: query: select count(*) from s +PREHOOK: type: QUERY +PREHOOK: Input: default@s +#### A masked pattern was here #### +POSTHOOK: query: select count(*) from s +POSTHOOK: type: QUERY +POSTHOOK: Input: default@s +#### A masked pattern was here #### +10 +PREHOOK: query: create temporary table s as select * from s limit 2 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@s +PREHOOK: Output: database:default +PREHOOK: Output: default@s +POSTHOOK: query: create temporary table s as select * from s limit 2 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@s +POSTHOOK: Output: database:default +POSTHOOK: Output: default@s +PREHOOK: query: select count(*) from s +PREHOOK: type: QUERY +PREHOOK: Input: default@s +#### A masked pattern was here #### +POSTHOOK: query: select count(*) from s +POSTHOOK: type: QUERY +POSTHOOK: Input: default@s +#### A masked pattern was here #### +2 +PREHOOK: query: with s as ( select * from src limit 1) +select count(*) from s +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: with s as ( select * from src limit 1) +select count(*) from s +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +1 +PREHOOK: query: with src as ( select * from s) +select count(*) from src +PREHOOK: type: QUERY +PREHOOK: Input: default@s +#### A masked pattern was here #### +POSTHOOK: query: with src as ( select * from s) +select count(*) from src +POSTHOOK: type: QUERY +POSTHOOK: Input: default@s +#### A masked pattern was here #### +2 +PREHOOK: query: drop table s +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@s +PREHOOK: Output: default@s +POSTHOOK: query: drop table s +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@s +POSTHOOK: Output: default@s +PREHOOK: query: select count(*) from s +PREHOOK: type: QUERY +PREHOOK: Input: default@s +#### A masked pattern was here #### +POSTHOOK: query: select count(*) from s +POSTHOOK: type: QUERY +POSTHOOK: Input: default@s +#### A masked pattern was here #### +10 +PREHOOK: query: with s as ( select * from src limit 1) +select count(*) from s +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: with s as ( select * from src limit 1) +select count(*) from s +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +1 +PREHOOK: query: with src as ( select * from s) +select count(*) from src +PREHOOK: type: QUERY +PREHOOK: Input: default@s +#### A masked pattern was here #### +POSTHOOK: query: with src as ( select * from s) +select count(*) from src +POSTHOOK: type: QUERY +POSTHOOK: Input: default@s +#### A masked pattern was here #### +10 +PREHOOK: query: drop table s +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@s +PREHOOK: Output: default@s +POSTHOOK: query: drop table s +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@s +POSTHOOK: Output: default@s http://git-wip-us.apache.org/repos/asf/hive/blob/b2f63ba9/ql/src/test/results/clientpositive/temp_table.q.out ---------------------------------------------------------------------- diff --git a/ql/src/test/results/clientpositive/temp_table.q.out b/ql/src/test/results/clientpositive/temp_table.q.out index e2987fe..a9f2bae 100644 --- a/ql/src/test/results/clientpositive/temp_table.q.out +++ b/ql/src/test/results/clientpositive/temp_table.q.out @@ -520,3 +520,110 @@ POSTHOOK: query: DROP TABLE bay POSTHOOK: type: DROPTABLE POSTHOOK: Input: default@bay POSTHOOK: Output: default@bay +PREHOOK: query: create table s as select * from src limit 10 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@src +PREHOOK: Output: database:default +PREHOOK: Output: default@s +POSTHOOK: query: create table s as select * from src limit 10 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@src +POSTHOOK: Output: database:default +POSTHOOK: Output: default@s +PREHOOK: query: select count(*) from s +PREHOOK: type: QUERY +PREHOOK: Input: default@s +#### A masked pattern was here #### +POSTHOOK: query: select count(*) from s +POSTHOOK: type: QUERY +POSTHOOK: Input: default@s +#### A masked pattern was here #### +10 +PREHOOK: query: create temporary table s as select * from s limit 2 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@s +PREHOOK: Output: database:default +PREHOOK: Output: default@s +POSTHOOK: query: create temporary table s as select * from s limit 2 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@s +POSTHOOK: Output: database:default +POSTHOOK: Output: default@s +PREHOOK: query: select count(*) from s +PREHOOK: type: QUERY +PREHOOK: Input: default@s +#### A masked pattern was here #### +POSTHOOK: query: select count(*) from s +POSTHOOK: type: QUERY +POSTHOOK: Input: default@s +#### A masked pattern was here #### +2 +PREHOOK: query: with s as ( select * from src limit 1) +select count(*) from s +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: with s as ( select * from src limit 1) +select count(*) from s +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +1 +PREHOOK: query: with src as ( select * from s) +select count(*) from src +PREHOOK: type: QUERY +PREHOOK: Input: default@s +#### A masked pattern was here #### +POSTHOOK: query: with src as ( select * from s) +select count(*) from src +POSTHOOK: type: QUERY +POSTHOOK: Input: default@s +#### A masked pattern was here #### +2 +PREHOOK: query: drop table s +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@s +PREHOOK: Output: default@s +POSTHOOK: query: drop table s +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@s +POSTHOOK: Output: default@s +PREHOOK: query: select count(*) from s +PREHOOK: type: QUERY +PREHOOK: Input: default@s +#### A masked pattern was here #### +POSTHOOK: query: select count(*) from s +POSTHOOK: type: QUERY +POSTHOOK: Input: default@s +#### A masked pattern was here #### +10 +PREHOOK: query: with s as ( select * from src limit 1) +select count(*) from s +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: with s as ( select * from src limit 1) +select count(*) from s +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +1 +PREHOOK: query: with src as ( select * from s) +select count(*) from src +PREHOOK: type: QUERY +PREHOOK: Input: default@s +#### A masked pattern was here #### +POSTHOOK: query: with src as ( select * from s) +select count(*) from src +POSTHOOK: type: QUERY +POSTHOOK: Input: default@s +#### A masked pattern was here #### +10 +PREHOOK: query: drop table s +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@s +PREHOOK: Output: default@s +POSTHOOK: query: drop table s +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@s +POSTHOOK: Output: default@s http://git-wip-us.apache.org/repos/asf/hive/blob/b2f63ba9/ql/src/test/results/clientpositive/tez/temp_table.q.out ---------------------------------------------------------------------- diff --git a/ql/src/test/results/clientpositive/tez/temp_table.q.out b/ql/src/test/results/clientpositive/tez/temp_table.q.out index 49f57c2..200ccdd 100644 --- a/ql/src/test/results/clientpositive/tez/temp_table.q.out +++ b/ql/src/test/results/clientpositive/tez/temp_table.q.out @@ -460,3 +460,110 @@ POSTHOOK: query: DROP TABLE bay POSTHOOK: type: DROPTABLE POSTHOOK: Input: default@bay POSTHOOK: Output: default@bay +PREHOOK: query: create table s as select * from src limit 10 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@src +PREHOOK: Output: database:default +PREHOOK: Output: default@s +POSTHOOK: query: create table s as select * from src limit 10 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@src +POSTHOOK: Output: database:default +POSTHOOK: Output: default@s +PREHOOK: query: select count(*) from s +PREHOOK: type: QUERY +PREHOOK: Input: default@s +#### A masked pattern was here #### +POSTHOOK: query: select count(*) from s +POSTHOOK: type: QUERY +POSTHOOK: Input: default@s +#### A masked pattern was here #### +10 +PREHOOK: query: create temporary table s as select * from s limit 2 +PREHOOK: type: CREATETABLE_AS_SELECT +PREHOOK: Input: default@s +PREHOOK: Output: database:default +PREHOOK: Output: default@s +POSTHOOK: query: create temporary table s as select * from s limit 2 +POSTHOOK: type: CREATETABLE_AS_SELECT +POSTHOOK: Input: default@s +POSTHOOK: Output: database:default +POSTHOOK: Output: default@s +PREHOOK: query: select count(*) from s +PREHOOK: type: QUERY +PREHOOK: Input: default@s +#### A masked pattern was here #### +POSTHOOK: query: select count(*) from s +POSTHOOK: type: QUERY +POSTHOOK: Input: default@s +#### A masked pattern was here #### +2 +PREHOOK: query: with s as ( select * from src limit 1) +select count(*) from s +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: with s as ( select * from src limit 1) +select count(*) from s +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +1 +PREHOOK: query: with src as ( select * from s) +select count(*) from src +PREHOOK: type: QUERY +PREHOOK: Input: default@s +#### A masked pattern was here #### +POSTHOOK: query: with src as ( select * from s) +select count(*) from src +POSTHOOK: type: QUERY +POSTHOOK: Input: default@s +#### A masked pattern was here #### +2 +PREHOOK: query: drop table s +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@s +PREHOOK: Output: default@s +POSTHOOK: query: drop table s +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@s +POSTHOOK: Output: default@s +PREHOOK: query: select count(*) from s +PREHOOK: type: QUERY +PREHOOK: Input: default@s +#### A masked pattern was here #### +POSTHOOK: query: select count(*) from s +POSTHOOK: type: QUERY +POSTHOOK: Input: default@s +#### A masked pattern was here #### +10 +PREHOOK: query: with s as ( select * from src limit 1) +select count(*) from s +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: with s as ( select * from src limit 1) +select count(*) from s +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +1 +PREHOOK: query: with src as ( select * from s) +select count(*) from src +PREHOOK: type: QUERY +PREHOOK: Input: default@s +#### A masked pattern was here #### +POSTHOOK: query: with src as ( select * from s) +select count(*) from src +POSTHOOK: type: QUERY +POSTHOOK: Input: default@s +#### A masked pattern was here #### +10 +PREHOOK: query: drop table s +PREHOOK: type: DROPTABLE +PREHOOK: Input: default@s +PREHOOK: Output: default@s +POSTHOOK: query: drop table s +POSTHOOK: type: DROPTABLE +POSTHOOK: Input: default@s +POSTHOOK: Output: default@s
