You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by jd...@apache.org on 2018/07/21 00:10:11 UTC

hive git commit: HIVE-4367: enhance TRUNCATE syntax to drop data of external table (Jason Dere, reviewed by Teddy Choi)

Repository: hive
Updated Branches:
  refs/heads/master 06a4f98e7 -> e569ef090


HIVE-4367: enhance TRUNCATE syntax to drop data of external table (Jason Dere, reviewed by Teddy Choi)


Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/e569ef09
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/e569ef09
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/e569ef09

Branch: refs/heads/master
Commit: e569ef09052b9ed705d61cb8a3bd5d963127abde
Parents: 06a4f98
Author: Jason Dere <jd...@hortonworks.com>
Authored: Fri Jul 20 17:08:15 2018 -0700
Committer: Jason Dere <jd...@hortonworks.com>
Committed: Fri Jul 20 17:08:15 2018 -0700

----------------------------------------------------------------------
 .../test/resources/testconfiguration.properties |  1 +
 .../hive/ql/parse/DDLSemanticAnalyzer.java      | 12 ++-
 .../org/apache/hadoop/hive/ql/parse/HiveLexer.g |  1 +
 .../apache/hadoop/hive/ql/parse/HiveParser.g    | 11 ++-
 .../clientpositive/truncate_external_force.q    | 16 ++++
 .../llap/truncate_external_force.q.out          | 85 ++++++++++++++++++++
 6 files changed, 121 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hive/blob/e569ef09/itests/src/test/resources/testconfiguration.properties
----------------------------------------------------------------------
diff --git a/itests/src/test/resources/testconfiguration.properties b/itests/src/test/resources/testconfiguration.properties
index d5a33bd..654185d 100644
--- a/itests/src/test/resources/testconfiguration.properties
+++ b/itests/src/test/resources/testconfiguration.properties
@@ -728,6 +728,7 @@ minillaplocal.query.files=\
   tez_union_multiinsert.q,\
   tez_vector_dynpart_hashjoin_1.q,\
   tez_vector_dynpart_hashjoin_2.q,\
+  truncate_external_force.q,\
   uber_reduce.q,\
   udaf_collect_set_2.q,\
   udaf_all_keyword.q,\

http://git-wip-us.apache.org/repos/asf/hive/blob/e569ef09/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java b/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java
index b6825ae..9373df6 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/DDLSemanticAnalyzer.java
@@ -1447,8 +1447,11 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer {
     String tableName = getUnescapedName((ASTNode) root.getChild(0));
 
     Table table = getTable(tableName, true);
-    if (table.getTableType() != TableType.MANAGED_TABLE) {
-      throw new SemanticException(ErrorMsg.TRUNCATE_FOR_NON_MANAGED_TABLE.format(tableName));
+    boolean isForce = ast.getFirstChildWithType(HiveParser.TOK_FORCE) != null;
+    if (!isForce) {
+      if (table.getTableType() != TableType.MANAGED_TABLE) {
+        throw new SemanticException(ErrorMsg.TRUNCATE_FOR_NON_MANAGED_TABLE.format(tableName));
+      }
     }
     if (table.isNonNative()) {
       throw new SemanticException(ErrorMsg.TRUNCATE_FOR_NON_NATIVE_TABLE.format(tableName)); //TODO
@@ -1491,9 +1494,10 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer {
 
     // Is this a truncate column command
     List<String> columnNames = null;
-    if (ast.getChildCount() == 2) {
+    ASTNode colNamesNode = (ASTNode) ast.getFirstChildWithType(HiveParser.TOK_TABCOLNAME);
+    if (colNamesNode != null) {
       try {
-        columnNames = getColumnNames((ASTNode)ast.getChild(1));
+        columnNames = getColumnNames(colNamesNode);
 
         // It would be possible to support this, but this is such a pointless command.
         if (AcidUtils.isInsertOnlyTable(table.getParameters())) {

http://git-wip-us.apache.org/repos/asf/hive/blob/e569ef09/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g b/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g
index 7a63cc4..6641e0d 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveLexer.g
@@ -335,6 +335,7 @@ KW_PRIMARY: 'PRIMARY';
 KW_FOREIGN: 'FOREIGN';
 KW_REFERENCES: 'REFERENCES';
 KW_CONSTRAINT: 'CONSTRAINT';
+KW_FORCE: 'FORCE';
 KW_ENFORCED: 'ENFORCED';
 KW_VALIDATE: 'VALIDATE';
 KW_NOVALIDATE: 'NOVALIDATE';

http://git-wip-us.apache.org/repos/asf/hive/blob/e569ef09/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g b/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g
index 75a25d5..1f53321 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveParser.g
@@ -334,6 +334,7 @@ TOK_TABNAME;
 TOK_TABSRC;
 TOK_RESTRICT;
 TOK_CASCADE;
+TOK_FORCE;
 TOK_TABLESKEWED;
 TOK_TABCOLVALUE;
 TOK_TABCOLVALUE_PAIR;
@@ -985,6 +986,13 @@ ifNotExists
     -> ^(TOK_IFNOTEXISTS)
     ;
 
+force
+@init { msgs.push("force clause"); }
+@after { msgs.pop(); }
+    : KW_FORCE
+    -> ^(TOK_FORCE)
+    ;
+
 rewriteEnabled
 @init { pushMsg("rewrite enabled clause", state); }
 @after { popMsg(state); }
@@ -1106,7 +1114,8 @@ createTableStatement
 truncateTableStatement
 @init { pushMsg("truncate table statement", state); }
 @after { popMsg(state); }
-    : KW_TRUNCATE KW_TABLE tablePartitionPrefix (KW_COLUMNS LPAREN columnNameList RPAREN)? -> ^(TOK_TRUNCATETABLE tablePartitionPrefix columnNameList?);
+    : KW_TRUNCATE KW_TABLE tablePartitionPrefix (KW_COLUMNS LPAREN columnNameList RPAREN)? force?
+    -> ^(TOK_TRUNCATETABLE tablePartitionPrefix columnNameList? force?);
 
 dropTableStatement
 @init { pushMsg("drop statement", state); }

http://git-wip-us.apache.org/repos/asf/hive/blob/e569ef09/ql/src/test/queries/clientpositive/truncate_external_force.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/truncate_external_force.q b/ql/src/test/queries/clientpositive/truncate_external_force.q
new file mode 100644
index 0000000..834cfaa
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/truncate_external_force.q
@@ -0,0 +1,16 @@
+--! qt:dataset:src
+
+create external table external1 (key string, value string) stored as textfile;
+load data local inpath '../../data/files/kv1.txt' into table external1;
+select count(*) from external1;
+truncate table external1 force;
+select count(*) from external1;
+
+
+-- Partitioned table
+create external table external2 (key string, value string) partitioned by (p1 string) stored as textfile;
+load data local inpath '../../data/files/kv1.txt' into table external2 partition (p1='abc');
+select count(*) from external2;
+truncate table external2 partition (p1='abc') force;
+select count(*) from external2;
+

http://git-wip-us.apache.org/repos/asf/hive/blob/e569ef09/ql/src/test/results/clientpositive/llap/truncate_external_force.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/llap/truncate_external_force.q.out b/ql/src/test/results/clientpositive/llap/truncate_external_force.q.out
new file mode 100644
index 0000000..f1f04d9
--- /dev/null
+++ b/ql/src/test/results/clientpositive/llap/truncate_external_force.q.out
@@ -0,0 +1,85 @@
+PREHOOK: query: create external table external1 (key string, value string) stored as textfile
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@external1
+POSTHOOK: query: create external table external1 (key string, value string) stored as textfile
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@external1
+PREHOOK: query: load data local inpath '../../data/files/kv1.txt' into table external1
+PREHOOK: type: LOAD
+#### A masked pattern was here ####
+PREHOOK: Output: default@external1
+POSTHOOK: query: load data local inpath '../../data/files/kv1.txt' into table external1
+POSTHOOK: type: LOAD
+#### A masked pattern was here ####
+POSTHOOK: Output: default@external1
+PREHOOK: query: select count(*) from external1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@external1
+#### A masked pattern was here ####
+POSTHOOK: query: select count(*) from external1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@external1
+#### A masked pattern was here ####
+500
+PREHOOK: query: truncate table external1 force
+PREHOOK: type: TRUNCATETABLE
+PREHOOK: Output: default@external1
+POSTHOOK: query: truncate table external1 force
+POSTHOOK: type: TRUNCATETABLE
+POSTHOOK: Output: default@external1
+PREHOOK: query: select count(*) from external1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@external1
+#### A masked pattern was here ####
+POSTHOOK: query: select count(*) from external1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@external1
+#### A masked pattern was here ####
+0
+PREHOOK: query: create external table external2 (key string, value string) partitioned by (p1 string) stored as textfile
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@external2
+POSTHOOK: query: create external table external2 (key string, value string) partitioned by (p1 string) stored as textfile
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@external2
+PREHOOK: query: load data local inpath '../../data/files/kv1.txt' into table external2 partition (p1='abc')
+PREHOOK: type: LOAD
+#### A masked pattern was here ####
+PREHOOK: Output: default@external2
+POSTHOOK: query: load data local inpath '../../data/files/kv1.txt' into table external2 partition (p1='abc')
+POSTHOOK: type: LOAD
+#### A masked pattern was here ####
+POSTHOOK: Output: default@external2
+POSTHOOK: Output: default@external2@p1=abc
+PREHOOK: query: select count(*) from external2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@external2
+PREHOOK: Input: default@external2@p1=abc
+#### A masked pattern was here ####
+POSTHOOK: query: select count(*) from external2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@external2
+POSTHOOK: Input: default@external2@p1=abc
+#### A masked pattern was here ####
+500
+PREHOOK: query: truncate table external2 partition (p1='abc') force
+PREHOOK: type: TRUNCATETABLE
+PREHOOK: Output: default@external2@p1=abc
+POSTHOOK: query: truncate table external2 partition (p1='abc') force
+POSTHOOK: type: TRUNCATETABLE
+POSTHOOK: Output: default@external2@p1=abc
+PREHOOK: query: select count(*) from external2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@external2
+PREHOOK: Input: default@external2@p1=abc
+#### A masked pattern was here ####
+POSTHOOK: query: select count(*) from external2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@external2
+POSTHOOK: Input: default@external2@p1=abc
+#### A masked pattern was here ####
+0