This is an automated email from the ASF dual-hosted git repository.
dengzhhu653 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git
The following commit(s) were added to refs/heads/master by this push:
new 9e843dd82b6 HIVE-29807: Materialized CTE inputs not fully propagated
to query authorization (#6700)
9e843dd82b6 is described below
commit 9e843dd82b615bb467d29dd4ba88adc6b3e575b0
Author: dengzh <[email protected]>
AuthorDate: Thu Aug 27 15:52:51 2026 +0800
HIVE-29807: Materialized CTE inputs not fully propagated to query
authorization (#6700)
---
.../apache/hadoop/hive/ql/exec/ExplainTask.java | 2 +-
.../hadoop/hive/ql/parse/BaseSemanticAnalyzer.java | 2 +-
.../hadoop/hive/ql/parse/ColumnAccessAnalyzer.java | 18 ++-
.../hadoop/hive/ql/parse/ColumnAccessInfo.java | 10 ++
.../hive/ql/parse/DeleteSemanticAnalyzer.java | 2 +-
.../hive/ql/parse/ExplainSemanticAnalyzer.java | 2 +-
.../parse/HiveSemanticAnalyzerHookContextImpl.java | 2 +-
.../hadoop/hive/ql/parse/SemanticAnalyzer.java | 17 ++-
.../apache/hadoop/hive/ql/plan/ExplainWork.java | 2 +-
.../authorization/command/CommandAuthorizer.java | 5 +-
.../hive/ql/parse/TestMaterializedCTEInputs.java | 125 +++++++++++++++++++++
.../test/results/clientpositive/llap/cte_3.q.out | 8 ++
.../results/clientpositive/llap/cte_mat_11.q.out | 64 +++++++++++
.../results/clientpositive/llap/cte_mat_3.q.out | 2 +
.../results/clientpositive/llap/cte_mat_4.q.out | 4 +
.../results/clientpositive/llap/cte_mat_5.q.out | 2 +
.../results/clientpositive/llap/cte_mat_9.q.out | 2 +
.../results/clientpositive/llap/cte_mat_type.q.out | 4 +
18 files changed, 255 insertions(+), 18 deletions(-)
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/exec/ExplainTask.java
b/ql/src/java/org/apache/hadoop/hive/ql/exec/ExplainTask.java
index 1db21728499..6130feac975 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/exec/ExplainTask.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/exec/ExplainTask.java
@@ -666,7 +666,7 @@ JSONObject collectAuthRelatedEntities(PrintStream out,
ExplainWork work)
HiveOperation operation = queryState.getHiveOperation();
JSONObject object = new JSONObject(new LinkedHashMap<>());
- Object jsonInput = toJson("INPUTS", toString(analyzer.getInputs()), out,
work);
+ Object jsonInput = toJson("INPUTS", toString(analyzer.getAllInputs()),
out, work);
if (work.isFormatted()) {
object.put("INPUTS", jsonInput);
}
diff --git
a/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
b/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
index bbac9da2e47..0862d345582 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/BaseSemanticAnalyzer.java
@@ -1650,7 +1650,7 @@ public boolean hasTransactionalInQuery() {
public boolean isRequiresOpenTransaction() {
return hasTransactionalInQuery() || getAcidDdlDesc() != null ||
- Stream.of(getInputs(), getOutputs()).flatMap(Collection::stream)
+ Stream.of(getAllInputs(), getOutputs()).flatMap(Collection::stream)
.filter(entity -> entity.getType() == Entity.Type.TABLE ||
entity.getType() == Entity.Type.PARTITION)
.flatMap(entity -> {
Table tbl = entity.getTable();
diff --git
a/ql/src/java/org/apache/hadoop/hive/ql/parse/ColumnAccessAnalyzer.java
b/ql/src/java/org/apache/hadoop/hive/ql/parse/ColumnAccessAnalyzer.java
index e5ba8643f2b..2ce0dd78a73 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/ColumnAccessAnalyzer.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/ColumnAccessAnalyzer.java
@@ -35,7 +35,8 @@ public ColumnAccessAnalyzer(ParseContext pactx) {
pGraphContext = pactx;
}
- public ColumnAccessInfo analyzeColumnAccess(ColumnAccessInfo
columnAccessInfo) throws SemanticException {
+ public ColumnAccessInfo analyzeColumnAccess(SemanticAnalyzer analyzer)
throws SemanticException {
+ ColumnAccessInfo columnAccessInfo = analyzer.getColumnAccessInfo();
if (columnAccessInfo == null) {
columnAccessInfo = new ColumnAccessInfo();
}
@@ -59,6 +60,21 @@ public ColumnAccessInfo analyzeColumnAccess(ColumnAccessInfo
columnAccessInfo) t
}
}
}
+
columnAccessInfo.merge(getMaterializedCteColumnAccessInfo(analyzer.rootClause.asExecutionOrder()));
+ return columnAccessInfo;
+ }
+
+ /**
+ * Merge column access recorded by materialized CTE sub-analyzers into this
analyzer's
+ * column access info so authorization sees base-table columns, not only the
temp CTE table.
+ */
+ private ColumnAccessInfo
getMaterializedCteColumnAccessInfo(List<SemanticAnalyzer.CTEClause> cteClauses)
{
+ ColumnAccessInfo columnAccessInfo = new ColumnAccessInfo();
+ for (SemanticAnalyzer.CTEClause cte : cteClauses) {
+ if (cte.source != null && cte.source.getColumnAccessInfo() != null) {
+ columnAccessInfo.merge(cte.source.getColumnAccessInfo());
+ }
+ }
return columnAccessInfo;
}
}
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/parse/ColumnAccessInfo.java
b/ql/src/java/org/apache/hadoop/hive/ql/parse/ColumnAccessInfo.java
index d43ffb77064..d9a3dd840eb 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/ColumnAccessInfo.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/ColumnAccessInfo.java
@@ -93,6 +93,16 @@ public Map<String, List<String>>
getTableToColumnAllAccessMap() {
return mapping;
}
+ /**
+ * Merge column accesses from another ColumnAccessInfo into this one.
+ */
+ public void merge(ColumnAccessInfo other) {
+ if (other == null) {
+ return;
+ }
+ tableToColumnAccessMap.putAll(other.tableToColumnAccessMap);
+ }
+
/**
* Strip a virtual column out of the set of columns. This is useful in
cases where we do not
* want to be checking against the user reading virtual columns, namely
update and delete.
diff --git
a/ql/src/java/org/apache/hadoop/hive/ql/parse/DeleteSemanticAnalyzer.java
b/ql/src/java/org/apache/hadoop/hive/ql/parse/DeleteSemanticAnalyzer.java
index 5f4847093dd..12386371627 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/DeleteSemanticAnalyzer.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/DeleteSemanticAnalyzer.java
@@ -134,7 +134,7 @@ private boolean tryMetadataUpdate(Table table, ASTNode
tabNameNode, ASTNode wher
DDLWork ddlWork = createDDLWorkOfMetadataUpdate(tableName, sarg);
rootTasks = Collections.singletonList(TaskFactory.get(ddlWork));
- inputs = sem.getInputs();
+ inputs = sem.getAllInputs();
outputs = sem.getOutputs();
updateOutputs(table);
return true;
diff --git
a/ql/src/java/org/apache/hadoop/hive/ql/parse/ExplainSemanticAnalyzer.java
b/ql/src/java/org/apache/hadoop/hive/ql/parse/ExplainSemanticAnalyzer.java
index f28e606aecc..226f033e909 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/parse/ExplainSemanticAnalyzer.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/parse/ExplainSemanticAnalyzer.java
@@ -187,7 +187,7 @@ public void analyzeInternal(ASTNode ast) throws
SemanticException {
BaseSemanticAnalyzer sem = SemanticAnalyzerFactory.get(queryState, input);
sem.analyze(input, ctx);
sem.validate();
- inputs = sem.getInputs();
+ inputs = sem.getAllInputs();
outputs = sem.getOutputs();
ctx.setResFile(ctx.getLocalTmpPath());
diff --git
a/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveSemanticAnalyzerHookContextImpl.java
b/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveSemanticAnalyzerHookContextImpl.java
index 448f3bdc514..ea9c5097693 100644
---
a/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveSemanticAnalyzerHookContextImpl.java
+++
b/ql/src/java/org/apache/hadoop/hive/ql/parse/HiveSemanticAnalyzerHookContextImpl.java
@@ -57,7 +57,7 @@ public void setConf(Configuration conf) {
@Override
public void update(BaseSemanticAnalyzer sem) {
- this.inputs = sem.getInputs();
+ this.inputs = sem.getAllInputs();
this.outputs = sem.getOutputs();
this.commandType = sem.getQueryState().getHiveOperation();
}
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 d74351bd590..4bef39b98b7 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
@@ -1407,7 +1407,7 @@ private void addCTEAsSubQuery(QB qb, String cteName,
String cteAlias)
qb.rewriteCTEToSubq(cteAlias, cteName, cteQBExpr);
}
- private final CTEClause rootClause = new CTEClause(null, null, null);
+ final CTEClause rootClause = new CTEClause(null, null, null);
@Override
public List<Task<?>> getAllRootTasks() {
@@ -1422,10 +1422,10 @@ public List<Task<?>> getAllRootTasks() {
@Override
public Set<ReadEntity> getAllInputs() {
- Set<ReadEntity> readEntities = new HashSet<ReadEntity>(getInputs());
+ Set<ReadEntity> readEntities = new LinkedHashSet<>(getInputs());
for (CTEClause cte : rootClause.asExecutionOrder()) {
if (cte.source != null) {
- readEntities.addAll(cte.source.getInputs());
+ readEntities.addAll(cte.source.getAllInputs());
}
}
return readEntities;
@@ -1436,7 +1436,7 @@ public Set<WriteEntity> getAllOutputs() {
Set<WriteEntity> writeEntities = new HashSet<WriteEntity>(getOutputs());
for (CTEClause cte : rootClause.asExecutionOrder()) {
if (cte.source != null) {
- writeEntities.addAll(cte.source.getOutputs());
+ writeEntities.addAll(cte.source.getAllOutputs());
}
}
return writeEntities;
@@ -1596,9 +1596,8 @@ Table materializeCTE(String cteName, CTEClause cte)
throws HiveException {
LOG.info("{} will be materialized into {}", cteName, location);
cte.source = analyzer;
-
+
ctx.addMaterializedTable(cteName, table,
getMaterializedTableStats(analyzer.getSinkOp()));
-
return table;
}
@@ -13441,7 +13440,7 @@ void analyzeInternal(ASTNode ast,
Supplier<PlannerContext> pcf) throws SemanticE
|| HiveConf.getBoolVar(this.conf,
HiveConf.ConfVars.HIVE_STATS_COLLECT_SCANCOLS)) {
ColumnAccessAnalyzer columnAccessAnalyzer = new
ColumnAccessAnalyzer(pCtx);
// view column access info is carried by this.getColumnAccessInfo().
-
setColumnAccessInfo(columnAccessAnalyzer.analyzeColumnAccess(this.getColumnAccessInfo()));
+ setColumnAccessInfo(columnAccessAnalyzer.analyzeColumnAccess(this));
}
}
perfLogger.perfLogEnd(this.getClass().getName(),
PerfLogger.LOGICAL_OPTIMIZATION);
@@ -13480,7 +13479,7 @@ void analyzeInternal(ASTNode ast,
Supplier<PlannerContext> pcf) throws SemanticE
// 11. put accessed columns to readEntity
if (HiveConf.getBoolVar(this.conf,
HiveConf.ConfVars.HIVE_STATS_COLLECT_SCANCOLS)) {
- putAccessedColumnsToReadEntity(inputs, columnAccessInfo);
+ putAccessedColumnsToReadEntity(getAllInputs(), columnAccessInfo);
}
if (isCacheEnabled && lookupInfo != null) {
@@ -15342,7 +15341,7 @@ private void
useCachedResult(QueryResultsCache.CacheEntry cacheEntry, boolean ne
private QueryResultsCache.QueryInfo
createCacheQueryInfoForQuery(QueryResultsCache.LookupInfo lookupInfo) {
long queryTime =
SessionState.get().getQueryCurrentTimestamp().toEpochMilli();
return new QueryResultsCache.QueryInfo(queryTime, lookupInfo,
queryState.getHiveOperation(),
- resultSchema, getTableAccessInfo(), getColumnAccessInfo(), inputs);
+ resultSchema, getTableAccessInfo(), getColumnAccessInfo(),
getAllInputs());
}
/**
diff --git a/ql/src/java/org/apache/hadoop/hive/ql/plan/ExplainWork.java
b/ql/src/java/org/apache/hadoop/hive/ql/plan/ExplainWork.java
index 2faab2160dd..0fb126e1878 100644
--- a/ql/src/java/org/apache/hadoop/hive/ql/plan/ExplainWork.java
+++ b/ql/src/java/org/apache/hadoop/hive/ql/plan/ExplainWork.java
@@ -82,7 +82,7 @@ public ExplainWork(Path resFile,
}
this.analyzer = analyzer;
if (analyzer != null) {
- this.inputs = analyzer.getInputs();
+ this.inputs = analyzer.getAllInputs();
}
if (analyzer != null) {
this.outputs = analyzer.getAllOutputs();
diff --git
a/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/command/CommandAuthorizer.java
b/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/command/CommandAuthorizer.java
index fbfc77e953d..8247a33c361 100644
---
a/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/command/CommandAuthorizer.java
+++
b/ql/src/java/org/apache/hadoop/hive/ql/security/authorization/command/CommandAuthorizer.java
@@ -76,14 +76,15 @@ private static boolean skip(HiveOperation op,
BaseSemanticAnalyzer sem) throws H
private static Set<ReadEntity> getInputs(BaseSemanticAnalyzer sem) {
Set<ReadEntity> additionalInputs = new HashSet<ReadEntity>();
- for (Entity e : sem.getInputs()) {
+ for (Entity e : sem.getAllInputs()) {
if (e.getType() == Entity.Type.PARTITION) {
additionalInputs.add(new ReadEntity(e.getTable()));
}
}
+ // getAllInputs() includes tables read by materialized CTE sub-analyzers.
// Sets.union keeps the values from the first set if they are present in
both
- return Sets.union(sem.getInputs(), additionalInputs);
+ return Sets.union(sem.getAllInputs(), additionalInputs);
}
private static Set<WriteEntity> getOutputs(BaseSemanticAnalyzer sem) {
diff --git
a/ql/src/test/org/apache/hadoop/hive/ql/parse/TestMaterializedCTEInputs.java
b/ql/src/test/org/apache/hadoop/hive/ql/parse/TestMaterializedCTEInputs.java
new file mode 100644
index 00000000000..6a888cb3131
--- /dev/null
+++ b/ql/src/test/org/apache/hadoop/hive/ql/parse/TestMaterializedCTEInputs.java
@@ -0,0 +1,125 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.hive.ql.parse;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Stream;
+
+import org.apache.hadoop.hive.conf.HiveConf;
+import org.apache.hadoop.hive.conf.HiveConfForTest;
+import org.apache.hadoop.hive.metastore.client.builder.DatabaseBuilder;
+import org.apache.hadoop.hive.metastore.client.builder.TableBuilder;
+import org.apache.hadoop.hive.ql.Context;
+import org.apache.hadoop.hive.ql.QueryState;
+import org.apache.hadoop.hive.ql.ddl.database.drop.DropDatabaseDesc;
+import org.apache.hadoop.hive.ql.hooks.ReadEntity;
+import org.apache.hadoop.hive.ql.metadata.Hive;
+import org.apache.hadoop.hive.ql.session.SessionState;
+import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
+
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+public class TestMaterializedCTEInputs {
+ private static final String DB_NAME = "test_materialized_cte";
+ private static final String TABLE_FQ_NAME = DB_NAME + "@src";
+
+ private static Hive db;
+ private static HiveConf conf;
+
+ @BeforeAll
+ public static void beforeClass() throws Exception {
+ conf = new HiveConfForTest(TestMaterializedCTEInputs.class);
+ conf.set("hive.security.authorization.enabled", "false");
+ conf.set("hive.security.authorization.manager",
+
"org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdConfOnlyAuthorizerFactory");
+ conf.setIntVar(HiveConf.ConfVars.HIVE_CTE_MATERIALIZE_THRESHOLD, 1);
+
conf.setBoolVar(HiveConf.ConfVars.HIVE_CTE_MATERIALIZE_FULL_AGGREGATE_ONLY,
false);
+ conf.setBoolVar(HiveConf.ConfVars.HIVE_STATS_COLLECT_SCANCOLS, true);
+ db = Hive.get(conf);
+ SessionState.start(conf);
+ new DatabaseBuilder().setName(DB_NAME).create(db.getMSC(), conf);
+ SessionState.get().setCurrentDatabase(DB_NAME);
+ new TableBuilder().setDbName(DB_NAME).setTableName("src")
+ .addCol("key", "string")
+ .addCol("value", "string")
+ .addCol("col1", "int")
+ .create(db.getMSC(), conf);
+ }
+
+ public static Stream<Arguments> casesForMaterializedCteInputs() {
+ return Stream.of(
+ Arguments.of("chain cte", "with q1 as ( select key from q2 where key =
'5'),"
+ + "q2 as ( select key from test_materialized_cte.src where key =
'5') "
+ + "select * from (select key from q1) a", Set.of("key")),
+ Arguments.of("nested cte", "WITH q1 AS ("
+ + "WITH q2 AS (SELECT key, value FROM test_materialized_cte.src
WHERE key = '4') "
+ + "SELECT * FROM q2 UNION ALL SELECT * FROM q2) "
+ + "SELECT * FROM q1 t1 JOIN q1 t2 ON t1.key = t2.key",
Set.of("key", "value")),
+ Arguments.of("merge columns", "WITH q1 AS ("
+ + "WITH q2 AS (SELECT key FROM test_materialized_cte.src WHERE
key = '4') "
+ + "SELECT * FROM q2 UNION ALL SELECT * FROM q2) "
+ + "SELECT * FROM q1 t1 JOIN test_materialized_cte.src t2 ON
t1.key = t2.key", Set.of("key", "value"))
+ );
+ }
+
+ @ParameterizedTest(name = "{0}")
+ @MethodSource("casesForMaterializedCteInputs")
+ void testMaterializedCteInputs(String type, String query, Set<String>
expectedCols) throws Exception {
+ HiveConf testConf = new HiveConf(conf);
+ Context ctx = new Context(testConf);
+ ASTNode astNode = ParseUtils.parse(query, ctx);
+ QueryState queryState = new
QueryState.Builder().withHiveConf(testConf).build();
+ SemanticAnalyzer analyzer = (SemanticAnalyzer)
SemanticAnalyzerFactory.get(queryState, astNode);
+ analyzer.initCtx(ctx);
+ analyzer.analyze(astNode, ctx);
+
+ Set<ReadEntity> allInputs = analyzer.getAllInputs();
+
+ assertTrue(allInputs.stream().anyMatch(e -> isTableNamed(e, "src")),
+ "Materialized CTE base table must appear in getAllInputs");
+
+ ColumnAccessInfo columnAccessInfo = analyzer.getColumnAccessInfo();
+ assertNotNull(columnAccessInfo);
+ List<String> srcCols =
columnAccessInfo.getTableToColumnAccessMap().get(TABLE_FQ_NAME);
+ assertNotNull(srcCols, "Column must include materialized CTE base table");
+ assertTrue(new HashSet<>(srcCols).containsAll(expectedCols),
+ () -> "Expected columns " + expectedCols + " but got " + srcCols);
+ ctx.clear();
+ }
+
+ private static boolean isTableNamed(ReadEntity entity, String tableName) {
+ return entity.getTable() != null &&
tableName.equals(entity.getTable().getTableName());
+ }
+
+ @AfterAll
+ public static void afterClass() throws Exception {
+ try {
+ db.dropDatabase(new DropDatabaseDesc(DB_NAME, DB_NAME, true, true,
true));
+ } catch (Exception ignored) {
+ }
+ db.close(true);
+ }
+}
diff --git a/ql/src/test/results/clientpositive/llap/cte_3.q.out
b/ql/src/test/results/clientpositive/llap/cte_3.q.out
index ee1fe65efff..1a7f931ce03 100644
--- a/ql/src/test/results/clientpositive/llap/cte_3.q.out
+++ b/ql/src/test/results/clientpositive/llap/cte_3.q.out
@@ -4,6 +4,7 @@ select *
from q1
PREHOOK: type: QUERY
PREHOOK: Input: default@q1
+PREHOOK: Input: default@src
#### A masked pattern was here ####
POSTHOOK: query: explain
with q1 as ( select key from src where key = '5')
@@ -11,6 +12,7 @@ select *
from q1
POSTHOOK: type: QUERY
POSTHOOK: Input: default@q1
+POSTHOOK: Input: default@src
#### A masked pattern was here ####
Plan optimized by CBO.
@@ -63,12 +65,14 @@ with q1 as ( select key from src where key = '5')
select * from (select key from q1) a
PREHOOK: type: QUERY
PREHOOK: Input: default@q1
+PREHOOK: Input: default@src
#### A masked pattern was here ####
POSTHOOK: query: explain
with q1 as ( select key from src where key = '5')
select * from (select key from q1) a
POSTHOOK: type: QUERY
POSTHOOK: Input: default@q1
+POSTHOOK: Input: default@src
#### A masked pattern was here ####
Plan optimized by CBO.
@@ -120,6 +124,8 @@ q2 as ( select key from src where key = '5')
select * from (select key from q1) a
PREHOOK: type: QUERY
PREHOOK: Input: default@q1
+PREHOOK: Input: default@q2
+PREHOOK: Input: default@src
#### A masked pattern was here ####
POSTHOOK: query: explain
with q1 as ( select key from q2 where key = '5'),
@@ -127,6 +133,8 @@ q2 as ( select key from src where key = '5')
select * from (select key from q1) a
POSTHOOK: type: QUERY
POSTHOOK: Input: default@q1
+POSTHOOK: Input: default@q2
+POSTHOOK: Input: default@src
#### A masked pattern was here ####
Plan optimized by CBO.
diff --git a/ql/src/test/results/clientpositive/llap/cte_mat_11.q.out
b/ql/src/test/results/clientpositive/llap/cte_mat_11.q.out
index f4cadc024bf..809fadf4042 100644
--- a/ql/src/test/results/clientpositive/llap/cte_mat_11.q.out
+++ b/ql/src/test/results/clientpositive/llap/cte_mat_11.q.out
@@ -48,7 +48,9 @@ SELECT a.key
FROM materialized_cte2 a
JOIN materialized_cte2 b ON (a.key = b.key)
PREHOOK: type: QUERY
+PREHOOK: Input: default@materialized_cte1
PREHOOK: Input: default@materialized_cte2
+PREHOOK: Input: default@src
#### A masked pattern was here ####
POSTHOOK: query: EXPLAIN WITH materialized_cte1 AS (
SELECT * FROM src
@@ -62,7 +64,9 @@ SELECT a.key
FROM materialized_cte2 a
JOIN materialized_cte2 b ON (a.key = b.key)
POSTHOOK: type: QUERY
+POSTHOOK: Input: default@materialized_cte1
POSTHOOK: Input: default@materialized_cte2
+POSTHOOK: Input: default@src
#### A masked pattern was here ####
STAGE DEPENDENCIES:
Stage-1 is a root stage
@@ -272,7 +276,9 @@ SELECT a.key
FROM materialized_cte2 a
JOIN materialized_cte2 b ON (a.key = b.key)
PREHOOK: type: QUERY
+PREHOOK: Input: default@materialized_cte1
PREHOOK: Input: default@materialized_cte2
+PREHOOK: Input: default@src
#### A masked pattern was here ####
POSTHOOK: query: EXPLAIN CBO WITH materialized_cte1 AS (
SELECT * FROM src
@@ -286,7 +292,9 @@ SELECT a.key
FROM materialized_cte2 a
JOIN materialized_cte2 b ON (a.key = b.key)
POSTHOOK: type: QUERY
+POSTHOOK: Input: default@materialized_cte1
POSTHOOK: Input: default@materialized_cte2
+POSTHOOK: Input: default@src
#### A masked pattern was here ####
CBO PLAN:
HiveProject(a.key=[$0])
@@ -310,7 +318,9 @@ SELECT * FROM materialized_cte2
UNION ALL
SELECT * FROM materialized_cte2
PREHOOK: type: QUERY
+PREHOOK: Input: default@materialized_cte1
PREHOOK: Input: default@materialized_cte2
+PREHOOK: Input: default@src
#### A masked pattern was here ####
POSTHOOK: query: EXPLAIN WITH materialized_cte1 AS (
SELECT * FROM src
@@ -324,7 +334,9 @@ SELECT * FROM materialized_cte2
UNION ALL
SELECT * FROM materialized_cte2
POSTHOOK: type: QUERY
+POSTHOOK: Input: default@materialized_cte1
POSTHOOK: Input: default@materialized_cte2
+POSTHOOK: Input: default@src
#### A masked pattern was here ####
STAGE DEPENDENCIES:
Stage-1 is a root stage
@@ -493,7 +505,9 @@ SELECT * FROM materialized_cte2
UNION ALL
SELECT * FROM materialized_cte2
PREHOOK: type: QUERY
+PREHOOK: Input: default@materialized_cte1
PREHOOK: Input: default@materialized_cte2
+PREHOOK: Input: default@src
#### A masked pattern was here ####
POSTHOOK: query: EXPLAIN CBO WITH materialized_cte1 AS (
SELECT * FROM src
@@ -507,7 +521,9 @@ SELECT * FROM materialized_cte2
UNION ALL
SELECT * FROM materialized_cte2
POSTHOOK: type: QUERY
+POSTHOOK: Input: default@materialized_cte1
POSTHOOK: Input: default@materialized_cte2
+POSTHOOK: Input: default@src
#### A masked pattern was here ####
CBO PLAN:
HiveProject(key=[$0], value=[$1])
@@ -577,7 +593,9 @@ SELECT a.key
FROM materialized_cte2 a
JOIN materialized_cte2 b ON (a.key = b.key)
PREHOOK: type: QUERY
+PREHOOK: Input: default@materialized_cte1
PREHOOK: Input: default@materialized_cte2
+PREHOOK: Input: default@src_no_stats
#### A masked pattern was here ####
POSTHOOK: query: EXPLAIN WITH materialized_cte1 AS (
SELECT * FROM src_no_stats
@@ -591,7 +609,9 @@ SELECT a.key
FROM materialized_cte2 a
JOIN materialized_cte2 b ON (a.key = b.key)
POSTHOOK: type: QUERY
+POSTHOOK: Input: default@materialized_cte1
POSTHOOK: Input: default@materialized_cte2
+POSTHOOK: Input: default@src_no_stats
#### A masked pattern was here ####
STAGE DEPENDENCIES:
Stage-1 is a root stage
@@ -801,7 +821,9 @@ SELECT a.key
FROM materialized_cte2 a
JOIN materialized_cte2 b ON (a.key = b.key)
PREHOOK: type: QUERY
+PREHOOK: Input: default@materialized_cte1
PREHOOK: Input: default@materialized_cte2
+PREHOOK: Input: default@src_no_stats
#### A masked pattern was here ####
POSTHOOK: query: EXPLAIN CBO WITH materialized_cte1 AS (
SELECT * FROM src_no_stats
@@ -815,7 +837,9 @@ SELECT a.key
FROM materialized_cte2 a
JOIN materialized_cte2 b ON (a.key = b.key)
POSTHOOK: type: QUERY
+POSTHOOK: Input: default@materialized_cte1
POSTHOOK: Input: default@materialized_cte2
+POSTHOOK: Input: default@src_no_stats
#### A masked pattern was here ####
CBO PLAN:
HiveProject(a.key=[$0])
@@ -839,7 +863,9 @@ SELECT * FROM materialized_cte2
UNION ALL
SELECT * FROM materialized_cte2
PREHOOK: type: QUERY
+PREHOOK: Input: default@materialized_cte1
PREHOOK: Input: default@materialized_cte2
+PREHOOK: Input: default@src_no_stats
#### A masked pattern was here ####
POSTHOOK: query: EXPLAIN WITH materialized_cte1 AS (
SELECT * FROM src_no_stats
@@ -853,7 +879,9 @@ SELECT * FROM materialized_cte2
UNION ALL
SELECT * FROM materialized_cte2
POSTHOOK: type: QUERY
+POSTHOOK: Input: default@materialized_cte1
POSTHOOK: Input: default@materialized_cte2
+POSTHOOK: Input: default@src_no_stats
#### A masked pattern was here ####
STAGE DEPENDENCIES:
Stage-1 is a root stage
@@ -1022,7 +1050,9 @@ SELECT * FROM materialized_cte2
UNION ALL
SELECT * FROM materialized_cte2
PREHOOK: type: QUERY
+PREHOOK: Input: default@materialized_cte1
PREHOOK: Input: default@materialized_cte2
+PREHOOK: Input: default@src_no_stats
#### A masked pattern was here ####
POSTHOOK: query: EXPLAIN CBO WITH materialized_cte1 AS (
SELECT * FROM src_no_stats
@@ -1036,7 +1066,9 @@ SELECT * FROM materialized_cte2
UNION ALL
SELECT * FROM materialized_cte2
POSTHOOK: type: QUERY
+POSTHOOK: Input: default@materialized_cte1
POSTHOOK: Input: default@materialized_cte2
+POSTHOOK: Input: default@src_no_stats
#### A masked pattern was here ####
CBO PLAN:
HiveProject(key=[$0], value=[$1])
@@ -1118,7 +1150,9 @@ SELECT a.key
FROM materialized_cte2 a
JOIN materialized_cte2 b ON (a.key = b.key)
PREHOOK: type: QUERY
+PREHOOK: Input: default@materialized_cte1
PREHOOK: Input: default@materialized_cte2
+PREHOOK: Input: default@src_partial_stats_key
#### A masked pattern was here ####
POSTHOOK: query: EXPLAIN WITH materialized_cte1 AS (
SELECT * FROM src_partial_stats_key
@@ -1132,7 +1166,9 @@ SELECT a.key
FROM materialized_cte2 a
JOIN materialized_cte2 b ON (a.key = b.key)
POSTHOOK: type: QUERY
+POSTHOOK: Input: default@materialized_cte1
POSTHOOK: Input: default@materialized_cte2
+POSTHOOK: Input: default@src_partial_stats_key
#### A masked pattern was here ####
STAGE DEPENDENCIES:
Stage-1 is a root stage
@@ -1342,7 +1378,9 @@ SELECT a.key
FROM materialized_cte2 a
JOIN materialized_cte2 b ON (a.key = b.key)
PREHOOK: type: QUERY
+PREHOOK: Input: default@materialized_cte1
PREHOOK: Input: default@materialized_cte2
+PREHOOK: Input: default@src_partial_stats_key
#### A masked pattern was here ####
POSTHOOK: query: EXPLAIN CBO WITH materialized_cte1 AS (
SELECT * FROM src_partial_stats_key
@@ -1356,7 +1394,9 @@ SELECT a.key
FROM materialized_cte2 a
JOIN materialized_cte2 b ON (a.key = b.key)
POSTHOOK: type: QUERY
+POSTHOOK: Input: default@materialized_cte1
POSTHOOK: Input: default@materialized_cte2
+POSTHOOK: Input: default@src_partial_stats_key
#### A masked pattern was here ####
CBO PLAN:
HiveProject(a.key=[$0])
@@ -1380,7 +1420,9 @@ SELECT * FROM materialized_cte2
UNION ALL
SELECT * FROM materialized_cte2
PREHOOK: type: QUERY
+PREHOOK: Input: default@materialized_cte1
PREHOOK: Input: default@materialized_cte2
+PREHOOK: Input: default@src_partial_stats_key
#### A masked pattern was here ####
POSTHOOK: query: EXPLAIN WITH materialized_cte1 AS (
SELECT * FROM src_partial_stats_key
@@ -1394,7 +1436,9 @@ SELECT * FROM materialized_cte2
UNION ALL
SELECT * FROM materialized_cte2
POSTHOOK: type: QUERY
+POSTHOOK: Input: default@materialized_cte1
POSTHOOK: Input: default@materialized_cte2
+POSTHOOK: Input: default@src_partial_stats_key
#### A masked pattern was here ####
STAGE DEPENDENCIES:
Stage-1 is a root stage
@@ -1563,7 +1607,9 @@ SELECT * FROM materialized_cte2
UNION ALL
SELECT * FROM materialized_cte2
PREHOOK: type: QUERY
+PREHOOK: Input: default@materialized_cte1
PREHOOK: Input: default@materialized_cte2
+PREHOOK: Input: default@src_partial_stats_key
#### A masked pattern was here ####
POSTHOOK: query: EXPLAIN CBO WITH materialized_cte1 AS (
SELECT * FROM src_partial_stats_key
@@ -1577,7 +1623,9 @@ SELECT * FROM materialized_cte2
UNION ALL
SELECT * FROM materialized_cte2
POSTHOOK: type: QUERY
+POSTHOOK: Input: default@materialized_cte1
POSTHOOK: Input: default@materialized_cte2
+POSTHOOK: Input: default@src_partial_stats_key
#### A masked pattern was here ####
CBO PLAN:
HiveProject(key=[$0], value=[$1])
@@ -1659,7 +1707,9 @@ SELECT a.key
FROM materialized_cte2 a
JOIN materialized_cte2 b ON (a.key = b.key)
PREHOOK: type: QUERY
+PREHOOK: Input: default@materialized_cte1
PREHOOK: Input: default@materialized_cte2
+PREHOOK: Input: default@src_partial_stats_value
#### A masked pattern was here ####
POSTHOOK: query: EXPLAIN WITH materialized_cte1 AS (
SELECT * FROM src_partial_stats_value
@@ -1673,7 +1723,9 @@ SELECT a.key
FROM materialized_cte2 a
JOIN materialized_cte2 b ON (a.key = b.key)
POSTHOOK: type: QUERY
+POSTHOOK: Input: default@materialized_cte1
POSTHOOK: Input: default@materialized_cte2
+POSTHOOK: Input: default@src_partial_stats_value
#### A masked pattern was here ####
STAGE DEPENDENCIES:
Stage-1 is a root stage
@@ -1883,7 +1935,9 @@ SELECT a.key
FROM materialized_cte2 a
JOIN materialized_cte2 b ON (a.key = b.key)
PREHOOK: type: QUERY
+PREHOOK: Input: default@materialized_cte1
PREHOOK: Input: default@materialized_cte2
+PREHOOK: Input: default@src_partial_stats_value
#### A masked pattern was here ####
POSTHOOK: query: EXPLAIN CBO WITH materialized_cte1 AS (
SELECT * FROM src_partial_stats_value
@@ -1897,7 +1951,9 @@ SELECT a.key
FROM materialized_cte2 a
JOIN materialized_cte2 b ON (a.key = b.key)
POSTHOOK: type: QUERY
+POSTHOOK: Input: default@materialized_cte1
POSTHOOK: Input: default@materialized_cte2
+POSTHOOK: Input: default@src_partial_stats_value
#### A masked pattern was here ####
CBO PLAN:
HiveProject(a.key=[$0])
@@ -1921,7 +1977,9 @@ SELECT * FROM materialized_cte2
UNION ALL
SELECT * FROM materialized_cte2
PREHOOK: type: QUERY
+PREHOOK: Input: default@materialized_cte1
PREHOOK: Input: default@materialized_cte2
+PREHOOK: Input: default@src_partial_stats_value
#### A masked pattern was here ####
POSTHOOK: query: EXPLAIN WITH materialized_cte1 AS (
SELECT * FROM src_partial_stats_value
@@ -1935,7 +1993,9 @@ SELECT * FROM materialized_cte2
UNION ALL
SELECT * FROM materialized_cte2
POSTHOOK: type: QUERY
+POSTHOOK: Input: default@materialized_cte1
POSTHOOK: Input: default@materialized_cte2
+POSTHOOK: Input: default@src_partial_stats_value
#### A masked pattern was here ####
STAGE DEPENDENCIES:
Stage-1 is a root stage
@@ -2104,7 +2164,9 @@ SELECT * FROM materialized_cte2
UNION ALL
SELECT * FROM materialized_cte2
PREHOOK: type: QUERY
+PREHOOK: Input: default@materialized_cte1
PREHOOK: Input: default@materialized_cte2
+PREHOOK: Input: default@src_partial_stats_value
#### A masked pattern was here ####
POSTHOOK: query: EXPLAIN CBO WITH materialized_cte1 AS (
SELECT * FROM src_partial_stats_value
@@ -2118,7 +2180,9 @@ SELECT * FROM materialized_cte2
UNION ALL
SELECT * FROM materialized_cte2
POSTHOOK: type: QUERY
+POSTHOOK: Input: default@materialized_cte1
POSTHOOK: Input: default@materialized_cte2
+POSTHOOK: Input: default@src_partial_stats_value
#### A masked pattern was here ####
CBO PLAN:
HiveProject(key=[$0], value=[$1])
diff --git a/ql/src/test/results/clientpositive/llap/cte_mat_3.q.out
b/ql/src/test/results/clientpositive/llap/cte_mat_3.q.out
index d63d003dc26..955bd177902 100644
--- a/ql/src/test/results/clientpositive/llap/cte_mat_3.q.out
+++ b/ql/src/test/results/clientpositive/llap/cte_mat_3.q.out
@@ -5,6 +5,7 @@ from q1 a join q1 b
on a.key=b.key
PREHOOK: type: QUERY
PREHOOK: Input: default@q1
+PREHOOK: Input: default@src
#### A masked pattern was here ####
POSTHOOK: query: explain
with q1 as (select * from src where key= '5')
@@ -13,6 +14,7 @@ from q1 a join q1 b
on a.key=b.key
POSTHOOK: type: QUERY
POSTHOOK: Input: default@q1
+POSTHOOK: Input: default@src
#### A masked pattern was here ####
Plan optimized by CBO.
diff --git a/ql/src/test/results/clientpositive/llap/cte_mat_4.q.out
b/ql/src/test/results/clientpositive/llap/cte_mat_4.q.out
index 4a1d6e0b06a..0c6a5384f66 100644
--- a/ql/src/test/results/clientpositive/llap/cte_mat_4.q.out
+++ b/ql/src/test/results/clientpositive/llap/cte_mat_4.q.out
@@ -30,6 +30,7 @@ from q1 a join q1 b
on a.key=b.key
PREHOOK: type: QUERY
PREHOOK: Input: default@q1
+PREHOOK: Input: default@src
#### A masked pattern was here ####
POSTHOOK: query: explain
with q1 as (select * from src where key= '5')
@@ -38,6 +39,7 @@ from q1 a join q1 b
on a.key=b.key
POSTHOOK: type: QUERY
POSTHOOK: Input: default@q1
+POSTHOOK: Input: default@src
#### A masked pattern was here ####
Plan optimized by CBO.
@@ -154,6 +156,7 @@ from q1 a join q1 b
on a.key=b.key
PREHOOK: type: QUERY
PREHOOK: Input: default@q1
+PREHOOK: Input: default@src
#### A masked pattern was here ####
POSTHOOK: query: explain
with q1 as (select * from src where key= '5')
@@ -162,6 +165,7 @@ from q1 a join q1 b
on a.key=b.key
POSTHOOK: type: QUERY
POSTHOOK: Input: default@q1
+POSTHOOK: Input: default@src
#### A masked pattern was here ####
Plan optimized by CBO.
diff --git a/ql/src/test/results/clientpositive/llap/cte_mat_5.q.out
b/ql/src/test/results/clientpositive/llap/cte_mat_5.q.out
index 59d2e04afb5..f45d4c2cfb7 100644
--- a/ql/src/test/results/clientpositive/llap/cte_mat_5.q.out
+++ b/ql/src/test/results/clientpositive/llap/cte_mat_5.q.out
@@ -48,6 +48,7 @@ from mydb.q1 as a join q1 as b
on a.colnum=b.key
PREHOOK: type: QUERY
PREHOOK: Input: default@q1
+PREHOOK: Input: default@src
PREHOOK: Input: mydb@q1
#### A masked pattern was here ####
POSTHOOK: query: explain
@@ -57,6 +58,7 @@ from mydb.q1 as a join q1 as b
on a.colnum=b.key
POSTHOOK: type: QUERY
POSTHOOK: Input: default@q1
+POSTHOOK: Input: default@src
POSTHOOK: Input: mydb@q1
#### A masked pattern was here ####
Plan optimized by CBO.
diff --git a/ql/src/test/results/clientpositive/llap/cte_mat_9.q.out
b/ql/src/test/results/clientpositive/llap/cte_mat_9.q.out
index a5064535c42..363b96322fa 100644
--- a/ql/src/test/results/clientpositive/llap/cte_mat_9.q.out
+++ b/ql/src/test/results/clientpositive/llap/cte_mat_9.q.out
@@ -76,6 +76,7 @@ PREHOOK: type: QUERY
PREHOOK: Input: default@b1
PREHOOK: Input: default@b2
PREHOOK: Input: default@cte_mat_9_a
+PREHOOK: Input: default@cte_mat_9_b
#### A masked pattern was here ####
POSTHOOK: query: explain with a0 AS (
select id, 'a0' as tag from cte_mat_9_a
@@ -108,6 +109,7 @@ POSTHOOK: type: QUERY
POSTHOOK: Input: default@b1
POSTHOOK: Input: default@b2
POSTHOOK: Input: default@cte_mat_9_a
+POSTHOOK: Input: default@cte_mat_9_b
#### A masked pattern was here ####
STAGE DEPENDENCIES:
Stage-1 is a root stage
diff --git a/ql/src/test/results/clientpositive/llap/cte_mat_type.q.out
b/ql/src/test/results/clientpositive/llap/cte_mat_type.q.out
index 0bf4bea932b..eb5bc18d555 100644
--- a/ql/src/test/results/clientpositive/llap/cte_mat_type.q.out
+++ b/ql/src/test/results/clientpositive/llap/cte_mat_type.q.out
@@ -50,6 +50,8 @@ FROM dept_avg da
WHERE da.avg_salary < 100000
PREHOOK: type: QUERY
PREHOOK: Input: default@dept_avg
+PREHOOK: Input: default@depts
+PREHOOK: Input: default@emps
#### A masked pattern was here ####
POSTHOOK: query: EXPLAIN CBO
WITH dept_avg AS (
@@ -67,6 +69,8 @@ FROM dept_avg da
WHERE da.avg_salary < 100000
POSTHOOK: type: QUERY
POSTHOOK: Input: default@dept_avg
+POSTHOOK: Input: default@depts
+POSTHOOK: Input: default@emps
#### A masked pattern was here ####
CBO PLAN:
HiveProject(d_name=[$0], _c1=[$1])