commit c2398b19412cee20e520dd567cf2b26cc00c81d0 Author: Daniel Dai Date: Mon Apr 15 14:06:24 2019 -0700 HIVE-21489: explain command throw ClassCastException in 2.3.4 diff --git a/itests/src/test/resources/testconfiguration.properties b/itests/src/test/resources/testconfiguration.properties index 96dfbc4..d505255 100644 --- a/itests/src/test/resources/testconfiguration.properties +++ b/itests/src/test/resources/testconfiguration.properties @@ -524,6 +524,7 @@ minillaplocal.query.files=\ explainanalyze_2.q,\ explainuser_1.q,\ explainuser_4.q,\ + explain_defaultauthorizer.q,\ external_jdbc_auth.q,\ external_jdbc_table.q,\ external_jdbc_table2.q,\ diff --git a/ql/src/java/org/apache/hadoop/hive/ql/Driver.java b/ql/src/java/org/apache/hadoop/hive/ql/Driver.java index cac14a6..70a8028 100644 --- a/ql/src/java/org/apache/hadoop/hive/ql/Driver.java +++ b/ql/src/java/org/apache/hadoop/hive/ql/Driver.java @@ -114,6 +114,7 @@ import org.apache.hadoop.hive.ql.parse.BaseSemanticAnalyzer; import org.apache.hadoop.hive.ql.parse.ColumnAccessInfo; import org.apache.hadoop.hive.ql.parse.ExplainConfiguration.AnalyzeState; +import org.apache.hadoop.hive.ql.parse.ExplainSemanticAnalyzer; import org.apache.hadoop.hive.ql.parse.HiveSemanticAnalyzerHookContext; import org.apache.hadoop.hive.ql.parse.HiveSemanticAnalyzerHookContextImpl; import org.apache.hadoop.hive.ql.parse.ImportSemanticAnalyzer; @@ -1292,10 +1293,14 @@ private static void getTablePartitionUsedColumns(HiveOperation op, BaseSemanticA // (par2Cols) or // table to columns mapping (tab2Cols) if (op.equals(HiveOperation.CREATETABLE_AS_SELECT) || op.equals(HiveOperation.QUERY)) { - SemanticAnalyzer querySem = (SemanticAnalyzer) sem; - ParseContext parseCtx = querySem.getParseContext(); + ParseContext parseCtx; + if (sem instanceof ExplainSemanticAnalyzer) { + parseCtx = ((ExplainSemanticAnalyzer)sem).getParseContext(); + } else { + parseCtx = ((SemanticAnalyzer)sem).getParseContext(); + } - for (Map.Entry topOpMap : querySem.getParseContext().getTopOps() + for (Map.Entry topOpMap : parseCtx.getTopOps() .entrySet()) { TableScanOperator tableScanOp = topOpMap.getValue(); if (!tableScanOp.isInsideView()) { 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 6d7af38..73ba8e3 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 @@ -56,6 +56,7 @@ public class ExplainSemanticAnalyzer extends BaseSemanticAnalyzer { List fieldList; ExplainConfiguration config; + ParseContext pCtx = null; public ExplainSemanticAnalyzer(QueryState queryState) throws SemanticException { super(queryState); @@ -189,7 +190,6 @@ public void analyzeInternal(ASTNode ast) throws SemanticException { fetchTask.getWork().initializeForFetch(ctx.getOpContext()); } - ParseContext pCtx = null; if (sem instanceof SemanticAnalyzer) { pCtx = ((SemanticAnalyzer)sem).getParseContext(); } @@ -285,4 +285,7 @@ public boolean skipAuthorization() { return task instanceof ExplainTask && ((ExplainTask)task).getWork().isAuthorize(); } + public ParseContext getParseContext() { + return pCtx; + } } diff --git a/ql/src/test/queries/clientpositive/explain_defaultauthorizer.q b/ql/src/test/queries/clientpositive/explain_defaultauthorizer.q new file mode 100644 index 0000000..dc21fc4 --- /dev/null +++ b/ql/src/test/queries/clientpositive/explain_defaultauthorizer.q @@ -0,0 +1,5 @@ +--! qt:dataset:src + +set hive.security.authorization.enabled=true; +set hive.security.authorization.manager=org.apache.hadoop.hive.ql.security.authorization.DefaultHiveAuthorizationProvider; +EXPLAIN SELECT * FROM src; diff --git a/ql/src/test/results/clientpositive/llap/explain_defaultauthorizer.q.out b/ql/src/test/results/clientpositive/llap/explain_defaultauthorizer.q.out new file mode 100644 index 0000000..e2c5a5e --- /dev/null +++ b/ql/src/test/results/clientpositive/llap/explain_defaultauthorizer.q.out @@ -0,0 +1,23 @@ +PREHOOK: query: EXPLAIN SELECT * FROM src +PREHOOK: type: QUERY +PREHOOK: Input: default@src +#### A masked pattern was here #### +POSTHOOK: query: EXPLAIN SELECT * FROM src +POSTHOOK: type: QUERY +POSTHOOK: Input: default@src +#### A masked pattern was here #### +STAGE DEPENDENCIES: + Stage-0 is a root stage + +STAGE PLANS: + Stage: Stage-0 + Fetch Operator + limit: -1 + Processor Tree: + TableScan + alias: src + Select Operator + expressions: key (type: string), value (type: string) + outputColumnNames: _col0, _col1 + ListSink +