This is an automated email from the ASF dual-hosted git repository.

zabetak 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 2b4a07eeea5 HIVE-29012: NPE in ExplainTask when protologging posthook 
is enabled (#5872)
2b4a07eeea5 is described below

commit 2b4a07eeea52e192220c6a79b0308cd0720ad3be
Author: Raghav Aggarwal <raghavaggarwal03...@gmail.com>
AuthorDate: Mon Jul 14 01:39:44 2025 +0530

    HIVE-29012: NPE in ExplainTask when protologging posthook is enabled (#5872)
---
 .../ql/hooks/HiveHookEventProtoPartialBuilder.java |  3 +-
 .../TestHiveHookEventProtoPartialBuilder.java      | 53 +++++++++++++++++++---
 2 files changed, 49 insertions(+), 7 deletions(-)

diff --git 
a/ql/src/java/org/apache/hadoop/hive/ql/hooks/HiveHookEventProtoPartialBuilder.java
 
b/ql/src/java/org/apache/hadoop/hive/ql/hooks/HiveHookEventProtoPartialBuilder.java
index 9b9b4e108cb..d55d71c4fa7 100644
--- 
a/ql/src/java/org/apache/hadoop/hive/ql/hooks/HiveHookEventProtoPartialBuilder.java
+++ 
b/ql/src/java/org/apache/hadoop/hive/ql/hooks/HiveHookEventProtoPartialBuilder.java
@@ -24,6 +24,7 @@
 
 import javax.annotation.Nullable;
 
+import org.apache.hadoop.hive.conf.HiveConf;
 import org.apache.hadoop.hive.ql.exec.ExplainTask;
 import org.apache.hadoop.hive.ql.exec.TaskFactory;
 import org.apache.hadoop.hive.ql.hooks.HiveProtoLoggingHook.OtherInfoType;
@@ -80,7 +81,7 @@ private void addQueryObj(ExplainWork explainWork) {
   }
 
   private JSONObject getExplainJSON(ExplainWork explainWork) throws Exception {
-    ExplainTask explain = (ExplainTask) TaskFactory.get(explainWork, null);
+    ExplainTask explain = (ExplainTask) TaskFactory.get(explainWork, new 
HiveConf());
     return explain.getJSONPlan(null, explainWork, stageIdRearrange);
   }
 }
diff --git 
a/ql/src/test/org/apache/hadoop/hive/ql/hooks/TestHiveHookEventProtoPartialBuilder.java
 
b/ql/src/test/org/apache/hadoop/hive/ql/hooks/TestHiveHookEventProtoPartialBuilder.java
index c6ab40796b7..5ada5bb4516 100644
--- 
a/ql/src/test/org/apache/hadoop/hive/ql/hooks/TestHiveHookEventProtoPartialBuilder.java
+++ 
b/ql/src/test/org/apache/hadoop/hive/ql/hooks/TestHiveHookEventProtoPartialBuilder.java
@@ -21,13 +21,24 @@
 package org.apache.hadoop.hive.ql.hooks;
 
 import static java.util.Collections.singletonList;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
 
 import java.util.HashMap;
+import java.util.List;
 import java.util.Map;
-
+import java.util.Set;
+import java.util.stream.Collectors;
+import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hive.conf.HiveConf;
+import org.apache.hadoop.hive.ql.CompilationOpContext;
+import org.apache.hadoop.hive.ql.exec.FetchTask;
+import org.apache.hadoop.hive.ql.exec.TableScanOperator;
 import org.apache.hadoop.hive.ql.hooks.proto.HiveHookEvents;
+import org.apache.hadoop.hive.ql.parse.ExplainConfiguration;
+import org.apache.hadoop.hive.ql.plan.ExplainWork;
+import org.apache.hadoop.hive.ql.plan.FetchWork;
+import org.apache.hadoop.hive.ql.plan.TableDesc;
 import org.json.JSONObject;
 import org.junit.Test;
 
@@ -45,10 +56,21 @@ public void testEquality() {
     json.put("key2", "value2");
     json.put("key3", "value3");
     HiveHookEvents.HiveHookEventProto event1 = buildWithOtherInfo(json);
-    HiveHookEvents.HiveHookEventProto event2 = buildIn2Steps(json);
+    HiveHookEvents.HiveHookEventProto event2 = buildIn2Steps(json, null);
     assertArrayEquals(event1.toByteArray(), event2.toByteArray());
   }
 
+  @Test
+  public void testOtherInfoQueryPlan() {
+    HiveHookEvents.HiveHookEventProto event = buildIn2Steps(new JSONObject(), 
createExplainWork());
+    Set<String> expectedOutput = Set.of("CONF", "QUERY");
+    Set<String> actualOutput =
+        event.getOtherInfoList().stream()
+            .map(HiveHookEvents.MapFieldEntry::getKey)
+            .collect(Collectors.toSet());
+    assertEquals(expectedOutput, actualOutput);
+  }
+
   private HiveHookEvents.HiveHookEventProto buildWithOtherInfo(JSONObject 
json) {
     return HiveHookEvents.HiveHookEventProto
             .newBuilder()
@@ -65,7 +87,7 @@ private HiveHookEvents.HiveHookEventProto 
buildWithOtherInfo(JSONObject json) {
             .build();
   }
 
-  private HiveHookEvents.HiveHookEventProto buildIn2Steps(JSONObject json) {
+  private HiveHookEvents.HiveHookEventProto buildIn2Steps(JSONObject json, 
ExplainWork work) {
     HiveHookEvents.HiveHookEventProto.Builder builder = 
HiveHookEvents.HiveHookEventProto
             .newBuilder()
             
.setEventType(HiveProtoLoggingHook.EventType.QUERY_SUBMITTED.name())
@@ -77,6 +99,25 @@ private HiveHookEvents.HiveHookEventProto 
buildIn2Steps(JSONObject json) {
             .setExecutionMode(TEZ);
     Map<HiveProtoLoggingHook.OtherInfoType, JSONObject> otherInfo = new 
HashMap<>();
     otherInfo.put(HiveProtoLoggingHook.OtherInfoType.CONF, json);
-    return new HiveHookEventProtoPartialBuilder(builder, null, otherInfo, 
null, null).build();
+    return new HiveHookEventProtoPartialBuilder(
+            builder, work, otherInfo, null, 
HiveConf.ConfVars.HIVE_STAGE_ID_REARRANGE.defaultStrVal)
+        .build();
+  }
+
+  private static ExplainWork createExplainWork() {
+    CompilationOpContext cCtx = new CompilationOpContext();
+    TableScanOperator scanOp = new TableScanOperator(cCtx);
+
+    FetchWork taskWork = new FetchWork(new Path("mock"), new TableDesc());
+    taskWork.setSource(scanOp);
+
+    FetchTask task = new FetchTask();
+    task.setWork(taskWork);
+
+    ExplainWork work = new ExplainWork();
+    work.setConfig(new ExplainConfiguration());
+    work.setRootTasks(List.of(task));
+
+    return work;
   }
-}
\ No newline at end of file
+}

Reply via email to