You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by ek...@apache.org on 2018/07/11 21:02:46 UTC
hive git commit: HIVE-19387: Truncate table for Acid tables conflicts
with ResultSet cache (Eugene Koifman, reviewed by Jason Dere)
Repository: hive
Updated Branches:
refs/heads/master 385a26ad8 -> 733c4f316
HIVE-19387: Truncate table for Acid tables conflicts with ResultSet cache (Eugene Koifman, reviewed by Jason Dere)
Project: http://git-wip-us.apache.org/repos/asf/hive/repo
Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/733c4f31
Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/733c4f31
Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/733c4f31
Branch: refs/heads/master
Commit: 733c4f3169142d426995f8e12961c209688d29d0
Parents: 385a26a
Author: Eugene Koifman <ek...@apache.org>
Authored: Wed Jul 11 14:02:31 2018 -0700
Committer: Eugene Koifman <ek...@apache.org>
Committed: Wed Jul 11 14:02:31 2018 -0700
----------------------------------------------------------------------
.../test/resources/testconfiguration.properties | 1 +
.../hive/ql/parse/DDLSemanticAnalyzer.java | 11 +-
.../hadoop/hive/ql/plan/AlterTableDesc.java | 5 +
.../hadoop/hive/ql/plan/TruncateTableDesc.java | 33 +-
.../clientpositive/results_cache_truncate.q | 61 +++
.../llap/results_cache_truncate.q.out | 470 +++++++++++++++++++
6 files changed, 579 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hive/blob/733c4f31/itests/src/test/resources/testconfiguration.properties
----------------------------------------------------------------------
diff --git a/itests/src/test/resources/testconfiguration.properties b/itests/src/test/resources/testconfiguration.properties
index 9e012ce..72dd144 100644
--- a/itests/src/test/resources/testconfiguration.properties
+++ b/itests/src/test/resources/testconfiguration.properties
@@ -610,6 +610,7 @@ minillaplocal.query.files=\
results_cache_quoted_identifiers.q,\
results_cache_temptable.q,\
results_cache_transactional.q,\
+ results_cache_truncate.q,\
results_cache_with_masking.q,\
sample10.q,\
sample10_mm.q,\
http://git-wip-us.apache.org/repos/asf/hive/blob/733c4f31/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 9ad4689..b6825ae 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
@@ -1478,7 +1478,13 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer {
}
}
- TruncateTableDesc truncateTblDesc = new TruncateTableDesc(tableName, partSpec, null);
+ TruncateTableDesc truncateTblDesc = new TruncateTableDesc(tableName, partSpec, null, table);
+ if(truncateTblDesc.mayNeedWriteId()) {
+ if(this.ddlDescWithWriteId != null) {
+ throw new IllegalStateException("ddlDescWithWriteId is already set: " + this.ddlDescWithWriteId);
+ }
+ this.ddlDescWithWriteId = truncateTblDesc;
+ }
DDLWork ddlWork = new DDLWork(getInputs(), getOutputs(), truncateTblDesc);
Task<?> truncateTask = TaskFactory.get(ddlWork);
@@ -1757,6 +1763,9 @@ public class DDLSemanticAnalyzer extends BaseSemanticAnalyzer {
DDLWork ddlWork = new DDLWork(getInputs(), getOutputs(), alterTblDesc);
if (isPotentialMmSwitch) {
+ if(this.ddlDescWithWriteId != null) {
+ throw new IllegalStateException("ddlDescWithWriteId is already set: " + this.ddlDescWithWriteId);
+ }
this.ddlDescWithWriteId = alterTblDesc;
ddlWork.setNeedLock(true); // Hmm... why don't many other operations here need locks?
}
http://git-wip-us.apache.org/repos/asf/hive/blob/733c4f31/ql/src/java/org/apache/hadoop/hive/ql/plan/AlterTableDesc.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/AlterTableDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/AlterTableDesc.java
index 0b04c0c..ec04a01 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/plan/AlterTableDesc.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/AlterTableDesc.java
@@ -967,4 +967,9 @@ public class AlterTableDesc extends DDLDesc implements Serializable, DDLDesc.DDL
public Long getWriteId() {
return this.writeId;
}
+
+ @Override
+ public String toString() {
+ return this.getClass().getSimpleName() + " for " + getFullTableName();
+ }
}
http://git-wip-us.apache.org/repos/asf/hive/blob/733c4f31/ql/src/java/org/apache/hadoop/hive/ql/plan/TruncateTableDesc.java
----------------------------------------------------------------------
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/TruncateTableDesc.java b/ql/src/java/org/apache/hadoop/hive/ql/plan/TruncateTableDesc.java
index ed68f1a..8c3d852 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/plan/TruncateTableDesc.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/TruncateTableDesc.java
@@ -22,6 +22,9 @@ import java.util.List;
import java.util.Map;
import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.hive.metastore.Warehouse;
+import org.apache.hadoop.hive.ql.io.AcidUtils;
+import org.apache.hadoop.hive.ql.metadata.Table;
import org.apache.hadoop.hive.ql.parse.ReplicationSpec;
import org.apache.hadoop.hive.ql.plan.Explain.Level;
@@ -30,25 +33,34 @@ import org.apache.hadoop.hive.ql.plan.Explain.Level;
* Truncates managed table or partition
*/
@Explain(displayName = "Truncate Table or Partition", explainLevels = { Level.USER, Level.DEFAULT, Level.EXTENDED })
-public class TruncateTableDesc extends DDLDesc {
+public class TruncateTableDesc extends DDLDesc implements DDLDesc.DDLDescWithWriteId {
private static final long serialVersionUID = 1L;
private String tableName;
+ private String fullTableName;
private Map<String, String> partSpec;
private List<Integer> columnIndexes;
private Path inputDir;
private Path outputDir;
private ListBucketingCtx lbCtx;
private ReplicationSpec replicationSpec;
+ private long writeId = 0;
+ private boolean isTransactional;
public TruncateTableDesc() {
}
public TruncateTableDesc(String tableName, Map<String, String> partSpec, ReplicationSpec replicationSpec) {
+ this(tableName, partSpec, replicationSpec, null);
+ }
+ public TruncateTableDesc(String tableName, Map<String, String> partSpec,
+ ReplicationSpec replicationSpec, Table table) {
this.tableName = tableName;
this.partSpec = partSpec;
this.replicationSpec = replicationSpec;
+ this.isTransactional = AcidUtils.isTransactionalTable(table);
+ this.fullTableName = table == null ? tableName : Warehouse.getQualifiedName(table.getTTable());
}
@Explain(displayName = "TableName", explainLevels = { Level.USER, Level.DEFAULT, Level.EXTENDED })
@@ -107,4 +119,23 @@ public class TruncateTableDesc extends DDLDesc {
* This can result in a "TRUNCATE IF NEWER THAN" kind of semantic
*/
public ReplicationSpec getReplicationSpec() { return this.replicationSpec; }
+
+ @Override
+ public void setWriteId(long writeId) {
+ this.writeId = writeId;
+ }
+ @Override
+ public String getFullTableName() {
+ return fullTableName;
+ }
+ @Override
+ public boolean mayNeedWriteId() {
+ return isTransactional;
+ }
+
+ @Override
+ public String toString() {
+ return this.getClass().getSimpleName() + " for " + getFullTableName();
+ }
+
}
http://git-wip-us.apache.org/repos/asf/hive/blob/733c4f31/ql/src/test/queries/clientpositive/results_cache_truncate.q
----------------------------------------------------------------------
diff --git a/ql/src/test/queries/clientpositive/results_cache_truncate.q b/ql/src/test/queries/clientpositive/results_cache_truncate.q
new file mode 100644
index 0000000..f806d49
--- /dev/null
+++ b/ql/src/test/queries/clientpositive/results_cache_truncate.q
@@ -0,0 +1,61 @@
+--! qt:dataset:src
+
+set hive.support.concurrency=true;
+set hive.txn.manager=org.apache.hadoop.hive.ql.lockmgr.DbTxnManager;
+
+create table rct1_1 (key string, value string) stored as orc tblproperties ('transactional'='true');
+
+insert into rct1_1 select * from default.src;
+
+set hive.query.results.cache.enabled=true;
+set hive.query.results.cache.nontransactional.tables.enabled=false;
+
+explain
+select count(*) from rct1_1;
+select count(*) from rct1_1;
+
+set test.comment="Query on transactional table should use cache";
+set test.comment;
+explain
+select count(*) from rct1_1;
+select count(*) from rct1_1;
+
+truncate table rct1_1;
+
+set test.comment="Table truncated - query cache invalidated";
+set test.comment;
+explain
+select count(*) from rct1_1;
+select count(*) from rct1_1;
+
+create table rct1_2 (key string, value string) partitioned by (p1 string) stored as orc tblproperties ('transactional'='true');
+
+insert into rct1_2 partition (p1='part1') select * from default.src;
+insert into rct1_2 partition (p1='part2') select * from default.src;
+
+explain
+select count(*) from rct1_2;
+select count(*) from rct1_2;
+
+set test.comment="Query on transactional table should use cache";
+set test.comment;
+explain
+select count(*) from rct1_2;
+select count(*) from rct1_2;
+
+truncate table rct1_2 partition (p1='part1');
+
+set test.comment="Partition truncated - query cache invalidated";
+set test.comment;
+explain
+select count(*) from rct1_2;
+select count(*) from rct1_2;
+
+truncate table rct1_2;
+
+set test.comment="Table truncated - query cache invalidated";
+set test.comment;
+explain
+select count(*) from rct1_2;
+select count(*) from rct1_2;
+
http://git-wip-us.apache.org/repos/asf/hive/blob/733c4f31/ql/src/test/results/clientpositive/llap/results_cache_truncate.q.out
----------------------------------------------------------------------
diff --git a/ql/src/test/results/clientpositive/llap/results_cache_truncate.q.out b/ql/src/test/results/clientpositive/llap/results_cache_truncate.q.out
new file mode 100644
index 0000000..0b7a81a
--- /dev/null
+++ b/ql/src/test/results/clientpositive/llap/results_cache_truncate.q.out
@@ -0,0 +1,470 @@
+PREHOOK: query: create table rct1_1 (key string, value string) stored as orc tblproperties ('transactional'='true')
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@rct1_1
+POSTHOOK: query: create table rct1_1 (key string, value string) stored as orc tblproperties ('transactional'='true')
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@rct1_1
+PREHOOK: query: insert into rct1_1 select * from default.src
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: default@rct1_1
+POSTHOOK: query: insert into rct1_1 select * from default.src
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: default@rct1_1
+POSTHOOK: Lineage: rct1_1.key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: rct1_1.value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+PREHOOK: query: explain
+select count(*) from rct1_1
+PREHOOK: type: QUERY
+POSTHOOK: query: explain
+select count(*) from rct1_1
+POSTHOOK: type: QUERY
+STAGE DEPENDENCIES:
+ Stage-1 is a root stage
+ Stage-0 depends on stages: Stage-1
+
+STAGE PLANS:
+ Stage: Stage-1
+ Tez
+#### A masked pattern was here ####
+ Edges:
+ Reducer 2 <- Map 1 (CUSTOM_SIMPLE_EDGE)
+#### A masked pattern was here ####
+ Vertices:
+ Map 1
+ Map Operator Tree:
+ TableScan
+ alias: rct1_1
+ Statistics: Num rows: 500 Data size: 35250 Basic stats: COMPLETE Column stats: COMPLETE
+ Select Operator
+ Statistics: Num rows: 500 Data size: 35250 Basic stats: COMPLETE Column stats: COMPLETE
+ Group By Operator
+ aggregations: count()
+ mode: hash
+ outputColumnNames: _col0
+ Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE
+ Reduce Output Operator
+ sort order:
+ Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE
+ value expressions: _col0 (type: bigint)
+ Execution mode: vectorized, llap
+ LLAP IO: may be used (ACID table)
+ Reducer 2
+ Execution mode: vectorized, llap
+ Reduce Operator Tree:
+ Group By Operator
+ aggregations: count(VALUE._col0)
+ mode: mergepartial
+ outputColumnNames: _col0
+ Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE
+ File Output Operator
+ compressed: false
+ Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE
+ table:
+ input format: org.apache.hadoop.mapred.SequenceFileInputFormat
+ output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+ serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+
+ Stage: Stage-0
+ Fetch Operator
+ limit: -1
+ Processor Tree:
+ ListSink
+
+PREHOOK: query: select count(*) from rct1_1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@rct1_1
+#### A masked pattern was here ####
+POSTHOOK: query: select count(*) from rct1_1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@rct1_1
+#### A masked pattern was here ####
+500
+test.comment="Query on transactional table should use cache"
+PREHOOK: query: explain
+select count(*) from rct1_1
+PREHOOK: type: QUERY
+POSTHOOK: query: explain
+select count(*) from rct1_1
+POSTHOOK: type: QUERY
+STAGE DEPENDENCIES:
+ Stage-0 is a root stage
+
+STAGE PLANS:
+ Stage: Stage-0
+ Fetch Operator
+ limit: -1
+ Processor Tree:
+ ListSink
+ Cached Query Result: true
+
+PREHOOK: query: select count(*) from rct1_1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@rct1_1
+POSTHOOK: query: select count(*) from rct1_1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@rct1_1
+500
+PREHOOK: query: truncate table rct1_1
+PREHOOK: type: TRUNCATETABLE
+PREHOOK: Output: default@rct1_1
+POSTHOOK: query: truncate table rct1_1
+POSTHOOK: type: TRUNCATETABLE
+POSTHOOK: Output: default@rct1_1
+test.comment="Table truncated - query cache invalidated"
+PREHOOK: query: explain
+select count(*) from rct1_1
+PREHOOK: type: QUERY
+POSTHOOK: query: explain
+select count(*) from rct1_1
+POSTHOOK: type: QUERY
+STAGE DEPENDENCIES:
+ Stage-1 is a root stage
+ Stage-0 depends on stages: Stage-1
+
+STAGE PLANS:
+ Stage: Stage-1
+ Tez
+#### A masked pattern was here ####
+ Edges:
+ Reducer 2 <- Map 1 (CUSTOM_SIMPLE_EDGE)
+#### A masked pattern was here ####
+ Vertices:
+ Map 1
+ Map Operator Tree:
+ TableScan
+ alias: rct1_1
+ Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: COMPLETE
+ Select Operator
+ Statistics: Num rows: 1 Data size: 0 Basic stats: PARTIAL Column stats: COMPLETE
+ Group By Operator
+ aggregations: count()
+ mode: hash
+ outputColumnNames: _col0
+ Statistics: Num rows: 1 Data size: 8 Basic stats: PARTIAL Column stats: COMPLETE
+ Reduce Output Operator
+ sort order:
+ Statistics: Num rows: 1 Data size: 8 Basic stats: PARTIAL Column stats: COMPLETE
+ value expressions: _col0 (type: bigint)
+ Execution mode: vectorized, llap
+ LLAP IO: may be used (ACID table)
+ Reducer 2
+ Execution mode: vectorized, llap
+ Reduce Operator Tree:
+ Group By Operator
+ aggregations: count(VALUE._col0)
+ mode: mergepartial
+ outputColumnNames: _col0
+ Statistics: Num rows: 1 Data size: 8 Basic stats: PARTIAL Column stats: COMPLETE
+ File Output Operator
+ compressed: false
+ Statistics: Num rows: 1 Data size: 8 Basic stats: PARTIAL Column stats: COMPLETE
+ table:
+ input format: org.apache.hadoop.mapred.SequenceFileInputFormat
+ output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+ serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+
+ Stage: Stage-0
+ Fetch Operator
+ limit: -1
+ Processor Tree:
+ ListSink
+
+PREHOOK: query: select count(*) from rct1_1
+PREHOOK: type: QUERY
+PREHOOK: Input: default@rct1_1
+#### A masked pattern was here ####
+POSTHOOK: query: select count(*) from rct1_1
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@rct1_1
+#### A masked pattern was here ####
+0
+PREHOOK: query: create table rct1_2 (key string, value string) partitioned by (p1 string) stored as orc tblproperties ('transactional'='true')
+PREHOOK: type: CREATETABLE
+PREHOOK: Output: database:default
+PREHOOK: Output: default@rct1_2
+POSTHOOK: query: create table rct1_2 (key string, value string) partitioned by (p1 string) stored as orc tblproperties ('transactional'='true')
+POSTHOOK: type: CREATETABLE
+POSTHOOK: Output: database:default
+POSTHOOK: Output: default@rct1_2
+PREHOOK: query: insert into rct1_2 partition (p1='part1') select * from default.src
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: default@rct1_2@p1=part1
+POSTHOOK: query: insert into rct1_2 partition (p1='part1') select * from default.src
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: default@rct1_2@p1=part1
+POSTHOOK: Lineage: rct1_2 PARTITION(p1=part1).key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: rct1_2 PARTITION(p1=part1).value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+PREHOOK: query: insert into rct1_2 partition (p1='part2') select * from default.src
+PREHOOK: type: QUERY
+PREHOOK: Input: default@src
+PREHOOK: Output: default@rct1_2@p1=part2
+POSTHOOK: query: insert into rct1_2 partition (p1='part2') select * from default.src
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@src
+POSTHOOK: Output: default@rct1_2@p1=part2
+POSTHOOK: Lineage: rct1_2 PARTITION(p1=part2).key SIMPLE [(src)src.FieldSchema(name:key, type:string, comment:default), ]
+POSTHOOK: Lineage: rct1_2 PARTITION(p1=part2).value SIMPLE [(src)src.FieldSchema(name:value, type:string, comment:default), ]
+PREHOOK: query: explain
+select count(*) from rct1_2
+PREHOOK: type: QUERY
+POSTHOOK: query: explain
+select count(*) from rct1_2
+POSTHOOK: type: QUERY
+STAGE DEPENDENCIES:
+ Stage-1 is a root stage
+ Stage-0 depends on stages: Stage-1
+
+STAGE PLANS:
+ Stage: Stage-1
+ Tez
+#### A masked pattern was here ####
+ Edges:
+ Reducer 2 <- Map 1 (CUSTOM_SIMPLE_EDGE)
+#### A masked pattern was here ####
+ Vertices:
+ Map 1
+ Map Operator Tree:
+ TableScan
+ alias: rct1_2
+ Statistics: Num rows: 1000 Data size: 78450 Basic stats: COMPLETE Column stats: COMPLETE
+ Select Operator
+ Statistics: Num rows: 1000 Data size: 78450 Basic stats: COMPLETE Column stats: COMPLETE
+ Group By Operator
+ aggregations: count()
+ mode: hash
+ outputColumnNames: _col0
+ Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE
+ Reduce Output Operator
+ sort order:
+ Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE
+ value expressions: _col0 (type: bigint)
+ Execution mode: vectorized, llap
+ LLAP IO: may be used (ACID table)
+ Reducer 2
+ Execution mode: vectorized, llap
+ Reduce Operator Tree:
+ Group By Operator
+ aggregations: count(VALUE._col0)
+ mode: mergepartial
+ outputColumnNames: _col0
+ Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE
+ File Output Operator
+ compressed: false
+ Statistics: Num rows: 1 Data size: 8 Basic stats: COMPLETE Column stats: COMPLETE
+ table:
+ input format: org.apache.hadoop.mapred.SequenceFileInputFormat
+ output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+ serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+
+ Stage: Stage-0
+ Fetch Operator
+ limit: -1
+ Processor Tree:
+ ListSink
+
+PREHOOK: query: select count(*) from rct1_2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@rct1_2
+PREHOOK: Input: default@rct1_2@p1=part1
+PREHOOK: Input: default@rct1_2@p1=part2
+#### A masked pattern was here ####
+POSTHOOK: query: select count(*) from rct1_2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@rct1_2
+POSTHOOK: Input: default@rct1_2@p1=part1
+POSTHOOK: Input: default@rct1_2@p1=part2
+#### A masked pattern was here ####
+1000
+test.comment="Query on transactional table should use cache"
+PREHOOK: query: explain
+select count(*) from rct1_2
+PREHOOK: type: QUERY
+POSTHOOK: query: explain
+select count(*) from rct1_2
+POSTHOOK: type: QUERY
+STAGE DEPENDENCIES:
+ Stage-0 is a root stage
+
+STAGE PLANS:
+ Stage: Stage-0
+ Fetch Operator
+ limit: -1
+ Processor Tree:
+ ListSink
+ Cached Query Result: true
+
+PREHOOK: query: select count(*) from rct1_2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@rct1_2
+PREHOOK: Input: default@rct1_2@p1=part1
+PREHOOK: Input: default@rct1_2@p1=part2
+POSTHOOK: query: select count(*) from rct1_2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@rct1_2
+POSTHOOK: Input: default@rct1_2@p1=part1
+POSTHOOK: Input: default@rct1_2@p1=part2
+1000
+PREHOOK: query: truncate table rct1_2 partition (p1='part1')
+PREHOOK: type: TRUNCATETABLE
+PREHOOK: Output: default@rct1_2@p1=part1
+POSTHOOK: query: truncate table rct1_2 partition (p1='part1')
+POSTHOOK: type: TRUNCATETABLE
+POSTHOOK: Output: default@rct1_2@p1=part1
+test.comment="Partition truncated - query cache invalidated"
+PREHOOK: query: explain
+select count(*) from rct1_2
+PREHOOK: type: QUERY
+POSTHOOK: query: explain
+select count(*) from rct1_2
+POSTHOOK: type: QUERY
+STAGE DEPENDENCIES:
+ Stage-1 is a root stage
+ Stage-0 depends on stages: Stage-1
+
+STAGE PLANS:
+ Stage: Stage-1
+ Tez
+#### A masked pattern was here ####
+ Edges:
+ Reducer 2 <- Map 1 (CUSTOM_SIMPLE_EDGE)
+#### A masked pattern was here ####
+ Vertices:
+ Map 1
+ Map Operator Tree:
+ TableScan
+ alias: rct1_2
+ Statistics: Num rows: 500 Data size: 39200 Basic stats: PARTIAL Column stats: COMPLETE
+ Select Operator
+ Statistics: Num rows: 500 Data size: 39200 Basic stats: PARTIAL Column stats: COMPLETE
+ Group By Operator
+ aggregations: count()
+ mode: hash
+ outputColumnNames: _col0
+ Statistics: Num rows: 1 Data size: 8 Basic stats: PARTIAL Column stats: COMPLETE
+ Reduce Output Operator
+ sort order:
+ Statistics: Num rows: 1 Data size: 8 Basic stats: PARTIAL Column stats: COMPLETE
+ value expressions: _col0 (type: bigint)
+ Execution mode: vectorized, llap
+ LLAP IO: may be used (ACID table)
+ Reducer 2
+ Execution mode: vectorized, llap
+ Reduce Operator Tree:
+ Group By Operator
+ aggregations: count(VALUE._col0)
+ mode: mergepartial
+ outputColumnNames: _col0
+ Statistics: Num rows: 1 Data size: 8 Basic stats: PARTIAL Column stats: COMPLETE
+ File Output Operator
+ compressed: false
+ Statistics: Num rows: 1 Data size: 8 Basic stats: PARTIAL Column stats: COMPLETE
+ table:
+ input format: org.apache.hadoop.mapred.SequenceFileInputFormat
+ output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+ serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+
+ Stage: Stage-0
+ Fetch Operator
+ limit: -1
+ Processor Tree:
+ ListSink
+
+PREHOOK: query: select count(*) from rct1_2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@rct1_2
+PREHOOK: Input: default@rct1_2@p1=part1
+PREHOOK: Input: default@rct1_2@p1=part2
+#### A masked pattern was here ####
+POSTHOOK: query: select count(*) from rct1_2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@rct1_2
+POSTHOOK: Input: default@rct1_2@p1=part1
+POSTHOOK: Input: default@rct1_2@p1=part2
+#### A masked pattern was here ####
+500
+PREHOOK: query: truncate table rct1_2
+PREHOOK: type: TRUNCATETABLE
+PREHOOK: Output: default@rct1_2@p1=part1
+PREHOOK: Output: default@rct1_2@p1=part2
+POSTHOOK: query: truncate table rct1_2
+POSTHOOK: type: TRUNCATETABLE
+POSTHOOK: Output: default@rct1_2@p1=part1
+POSTHOOK: Output: default@rct1_2@p1=part2
+test.comment="Table truncated - query cache invalidated"
+PREHOOK: query: explain
+select count(*) from rct1_2
+PREHOOK: type: QUERY
+POSTHOOK: query: explain
+select count(*) from rct1_2
+POSTHOOK: type: QUERY
+STAGE DEPENDENCIES:
+ Stage-1 is a root stage
+ Stage-0 depends on stages: Stage-1
+
+STAGE PLANS:
+ Stage: Stage-1
+ Tez
+#### A masked pattern was here ####
+ Edges:
+ Reducer 2 <- Map 1 (CUSTOM_SIMPLE_EDGE)
+#### A masked pattern was here ####
+ Vertices:
+ Map 1
+ Map Operator Tree:
+ TableScan
+ alias: rct1_2
+ Statistics: Num rows: 1 Data size: 8 Basic stats: PARTIAL Column stats: COMPLETE
+ Select Operator
+ Statistics: Num rows: 1 Data size: 8 Basic stats: PARTIAL Column stats: COMPLETE
+ Group By Operator
+ aggregations: count()
+ mode: hash
+ outputColumnNames: _col0
+ Statistics: Num rows: 1 Data size: 8 Basic stats: PARTIAL Column stats: COMPLETE
+ Reduce Output Operator
+ sort order:
+ Statistics: Num rows: 1 Data size: 8 Basic stats: PARTIAL Column stats: COMPLETE
+ value expressions: _col0 (type: bigint)
+ Execution mode: vectorized, llap
+ LLAP IO: may be used (ACID table)
+ Reducer 2
+ Execution mode: vectorized, llap
+ Reduce Operator Tree:
+ Group By Operator
+ aggregations: count(VALUE._col0)
+ mode: mergepartial
+ outputColumnNames: _col0
+ Statistics: Num rows: 1 Data size: 8 Basic stats: PARTIAL Column stats: COMPLETE
+ File Output Operator
+ compressed: false
+ Statistics: Num rows: 1 Data size: 8 Basic stats: PARTIAL Column stats: COMPLETE
+ table:
+ input format: org.apache.hadoop.mapred.SequenceFileInputFormat
+ output format: org.apache.hadoop.hive.ql.io.HiveSequenceFileOutputFormat
+ serde: org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
+
+ Stage: Stage-0
+ Fetch Operator
+ limit: -1
+ Processor Tree:
+ ListSink
+
+PREHOOK: query: select count(*) from rct1_2
+PREHOOK: type: QUERY
+PREHOOK: Input: default@rct1_2
+PREHOOK: Input: default@rct1_2@p1=part1
+PREHOOK: Input: default@rct1_2@p1=part2
+#### A masked pattern was here ####
+POSTHOOK: query: select count(*) from rct1_2
+POSTHOOK: type: QUERY
+POSTHOOK: Input: default@rct1_2
+POSTHOOK: Input: default@rct1_2@p1=part1
+POSTHOOK: Input: default@rct1_2@p1=part2
+#### A masked pattern was here ####
+0