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

ayushtkn 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 5e54c134531 HIVE-30099: Add support for Hive variables in Persistable 
Sessions (#6828)
5e54c134531 is described below

commit 5e54c134531881bfcd3973f971db9afef02ecbdd
Author: Tanishq Chugh <[email protected]>
AuthorDate: Sat Oct 3 00:10:50 2026 +0530

    HIVE-30099: Add support for Hive variables in Persistable Sessions (#6828)
---
 .../cli/session/store/HiveSessionSnapshot.java     | 16 ++++++++++-
 .../session/store/TestSessionStateStoreBase.java   |  8 ++++++
 .../hive/service/cli/session/HiveSessionImpl.java  |  9 +++++-
 .../cli/session/PersistableSessionUtils.java       | 11 ++++++--
 .../cli/session/TestPersistableSessionUtils.java   | 33 ++++++++++++++++++++++
 5 files changed, 73 insertions(+), 4 deletions(-)

diff --git 
a/service-session-store/src/main/java/org/apache/hive/service/cli/session/store/HiveSessionSnapshot.java
 
b/service-session-store/src/main/java/org/apache/hive/service/cli/session/store/HiveSessionSnapshot.java
index 8c10772cd78..d52592fa635 100644
--- 
a/service-session-store/src/main/java/org/apache/hive/service/cli/session/store/HiveSessionSnapshot.java
+++ 
b/service-session-store/src/main/java/org/apache/hive/service/cli/session/store/HiveSessionSnapshot.java
@@ -34,6 +34,7 @@ public class HiveSessionSnapshot {
   private final String ipAddress;
   private final String currentDatabase;
   private final Map<String, String> overriddenConfigurations;
+  private final Map<String, String> hiveVariables;
   private final List<String> addedJars;
   private final List<String> addedFiles;
   private final Map<String, String> tempTableDefinitions;
@@ -50,6 +51,7 @@ public HiveSessionSnapshot(
       @JsonProperty("ipAddress") String ipAddress,
       @JsonProperty("currentDatabase") String currentDatabase,
       @JsonProperty("overriddenConfigurations") Map<String, String> 
overriddenConfigurations,
+      @JsonProperty("hiveVariables") Map<String, String> hiveVariables,
       @JsonProperty("addedJars") List<String> addedJars,
       @JsonProperty("addedFiles") List<String> addedFiles,
       @JsonProperty("tempTableDefinitions") Map<String, String> 
tempTableDefinitions,
@@ -64,6 +66,7 @@ public HiveSessionSnapshot(
     this.currentDatabase = currentDatabase;
     this.overriddenConfigurations = overriddenConfigurations != null
         ? new HashMap<>(overriddenConfigurations) : Collections.emptyMap();
+    this.hiveVariables = hiveVariables != null ? new HashMap<>(hiveVariables) 
: Collections.emptyMap();
     this.addedJars = addedJars != null ? new ArrayList<>(addedJars) : 
Collections.emptyList();
     this.addedFiles = addedFiles != null ? new ArrayList<>(addedFiles) : 
Collections.emptyList();
     this.tempTableDefinitions = tempTableDefinitions != null
@@ -102,6 +105,11 @@ public Map<String, String> getOverriddenConfigurations() {
     return overriddenConfigurations;
   }
 
+  @JsonProperty("hiveVariables")
+  public Map<String, String> getHiveVariables() {
+    return hiveVariables;
+  }
+
   @JsonProperty("addedJars")
   public List<String> getAddedJars() {
     return addedJars;
@@ -152,6 +160,7 @@ public static class Builder {
     private String ipAddress;
     private String currentDatabase;
     private Map<String, String> overriddenConfigurations;
+    private Map<String, String> hiveVariables;
     private List<String> addedJars;
     private List<String> addedFiles;
     private Map<String, String> tempTableDefinitions;
@@ -186,6 +195,11 @@ public Builder overriddenConfigurations(Map<String, 
String> overriddenConfigurat
       return this;
     }
 
+    public Builder hiveVariables(Map<String, String> hiveVariables) {
+      this.hiveVariables = hiveVariables;
+      return this;
+    }
+
     public Builder addedJars(List<String> addedJars) {
       this.addedJars = addedJars;
       return this;
@@ -229,7 +243,7 @@ public Builder lastAccessTime(long lastAccessTime) {
 
     public HiveSessionSnapshot build() {
       return new HiveSessionSnapshot(sessionHandleId, username, ipAddress, 
currentDatabase,
-          overriddenConfigurations, addedJars, addedFiles, 
tempTableDefinitions,
+          overriddenConfigurations, hiveVariables, addedJars, addedFiles, 
tempTableDefinitions,
           tempTablePartitionDefinitions, tempFunctionDefinitions, 
protocolVersion, creationTime,
           lastAccessTime);
     }
diff --git 
a/service-session-store/src/test/java/org/apache/hive/service/cli/session/store/TestSessionStateStoreBase.java
 
b/service-session-store/src/test/java/org/apache/hive/service/cli/session/store/TestSessionStateStoreBase.java
index 4268d770cbc..196c8507ffa 100644
--- 
a/service-session-store/src/test/java/org/apache/hive/service/cli/session/store/TestSessionStateStoreBase.java
+++ 
b/service-session-store/src/test/java/org/apache/hive/service/cli/session/store/TestSessionStateStoreBase.java
@@ -65,6 +65,9 @@ public void testSaveAndGetSnapshot() {
     assertEquals(2, retrieved.getOverriddenConfigurations().size());
     assertEquals("true", 
retrieved.getOverriddenConfigurations().get("hive.exec.dynamic.partition"));
     assertEquals("nonstrict", 
retrieved.getOverriddenConfigurations().get("hive.exec.dynamic.partition.mode"));
+    assertEquals(2, retrieved.getHiveVariables().size());
+    assertEquals("test_value_A", 
retrieved.getHiveVariables().get("test_var_A"));
+    assertEquals("test_value_B", 
retrieved.getHiveVariables().get("test_var_B"));
     assertEquals(2, retrieved.getAddedJars().size());
     assertEquals("hdfs:///user/hive/udfs/my-udf.jar", 
retrieved.getAddedJars().get(0));
     assertEquals(2, retrieved.getAddedFiles().size());
@@ -163,12 +166,17 @@ protected HiveSessionSnapshot createTestSnapshot(String 
sessionId, String userna
     Map<String, String> tempTables = new HashMap<>();
     tempTables.put("tmp_t", "CREATE TEMPORARY TABLE tmp_t (col1 STRING, col2 
INT)");
 
+    Map<String, String> hiveVariables = new HashMap<>();
+    hiveVariables.put("test_var_A", "test_value_A");
+    hiveVariables.put("test_var_B", "test_value_B");
+
     return HiveSessionSnapshot.builder()
         .sessionHandleId(sessionId)
         .username(username)
         .ipAddress("127.0.0.1")
         .currentDatabase(database)
         .overriddenConfigurations(configs)
+        .hiveVariables(hiveVariables)
         .addedJars(Arrays.asList("hdfs:///user/hive/udfs/my-udf.jar", 
"hdfs:///user/hive/udfs/other.jar"))
         .addedFiles(Arrays.asList("hdfs:///user/hive/files/data.csv", 
"/tmp/local_file.txt"))
         .tempTableDefinitions(tempTables)
diff --git 
a/service/src/java/org/apache/hive/service/cli/session/HiveSessionImpl.java 
b/service/src/java/org/apache/hive/service/cli/session/HiveSessionImpl.java
index 3a5ab4c2d4d..65405df7647 100644
--- a/service/src/java/org/apache/hive/service/cli/session/HiveSessionImpl.java
+++ b/service/src/java/org/apache/hive/service/cli/session/HiveSessionImpl.java
@@ -31,6 +31,7 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.Future;
@@ -1055,9 +1056,15 @@ public OperationHandle getCrossReference(String 
primaryCatalog,
   @Override
   public void setApplicationName(String value) {
     String oldName = sessionState.getHiveVariables().put("wmapp", value);
-    if (oldName != null && !oldName.equals(value)) {
+    if (Objects.equals(oldName, value)) {
+      return;
+    }
+    if (oldName != null) {
       LOG.info("ApplicationName changed from " + oldName + " to " + value);
     }
+    if (sessionManager != null && 
sessionManager.isPersistableSessionsEnabled()) {
+      sessionManager.notifySessionStateChanged(sessionHandle);
+    }
   }
 
 
diff --git 
a/service/src/java/org/apache/hive/service/cli/session/PersistableSessionUtils.java
 
b/service/src/java/org/apache/hive/service/cli/session/PersistableSessionUtils.java
index dbdb21f394b..fae2d4ddfe9 100644
--- 
a/service/src/java/org/apache/hive/service/cli/session/PersistableSessionUtils.java
+++ 
b/service/src/java/org/apache/hive/service/cli/session/PersistableSessionUtils.java
@@ -92,7 +92,7 @@ private PersistableSessionUtils() {
 
   /**
    * Determines whether a SQL statement changes session state that should
-   * be persisted (database, configs, JARs, temp tables, temp functions).
+   * be persisted (database, configs, hive variables, JARs, temp tables, temp 
functions).
    */
   public static boolean isStateChangingCommand(String statement) {
     if (statement == null) {
@@ -210,6 +210,8 @@ public static HiveSessionSnapshot 
captureSnapshot(SessionHandle sessionHandle, S
         .currentDatabase(sessionState != null ? 
sessionState.getCurrentDatabase() : null)
         .overriddenConfigurations(sessionState != null
             ? new HashMap<>(sessionState.getOverriddenConfigurations()) : null)
+        .hiveVariables(sessionState != null
+            ? new HashMap<>(sessionState.getHiveVariables()) : null)
         .addedJars(jars)
         .addedFiles(files)
         .tempTableDefinitions(tempTableDefs)
@@ -313,7 +315,7 @@ static List<String> captureTempFunctions(SessionState 
sessionState) {
 
   /**
    * Hydrates a recovered session from a snapshot: restores database, configs,
-   * JARs, files, temp functions, and temp tables.
+   * hive variables, JARs, files, temp functions, and temp tables.
    */
   public static void hydrateSession(HiveSession session, HiveSessionSnapshot 
snapshot)
       throws HiveSQLException {
@@ -328,6 +330,11 @@ public static void hydrateSession(HiveSession session, 
HiveSessionSnapshot snaps
           sessionState.getOverriddenConfigurations().put(entry.getKey(), 
entry.getValue());
         }
       }
+      if (snapshot.getHiveVariables() != null) {
+        for (Map.Entry<String, String> entry : 
snapshot.getHiveVariables().entrySet()) {
+          sessionState.getHiveVariables().put(entry.getKey(), 
entry.getValue());
+        }
+      }
       if (snapshot.getAddedJars() != null) {
         for (String jar : snapshot.getAddedJars()) {
           sessionState.add_resource(SessionState.ResourceType.JAR, jar);
diff --git 
a/service/src/test/org/apache/hive/service/cli/session/TestPersistableSessionUtils.java
 
b/service/src/test/org/apache/hive/service/cli/session/TestPersistableSessionUtils.java
index 4d13ab8d038..89d8da3da0e 100644
--- 
a/service/src/test/org/apache/hive/service/cli/session/TestPersistableSessionUtils.java
+++ 
b/service/src/test/org/apache/hive/service/cli/session/TestPersistableSessionUtils.java
@@ -18,15 +18,24 @@
 
 package org.apache.hive.service.cli.session;
 
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 import java.util.HashMap;
 import java.util.Map;
 
+import com.fasterxml.jackson.databind.ObjectMapper;
+
 import org.apache.hadoop.hive.conf.HiveConf;
+import org.apache.hadoop.hive.conf.VariableSubstitution;
 import org.apache.hadoop.hive.ql.metadata.Table;
 import org.apache.hadoop.hive.ql.session.SessionState;
+import org.apache.hive.service.cli.SessionHandle;
+import org.apache.hive.service.cli.session.store.HiveSessionSnapshot;
+import org.apache.hive.service.rpc.thrift.TProtocolVersion;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -71,4 +80,28 @@ public void 
testShouldPersistSnapshotForStateChangingCommands() {
         "CREATE TEMPORARY TABLE tmp (id INT)", sessionState));
     assertFalse(PersistableSessionUtils.shouldPersistSnapshot("SELECT 1", 
sessionState));
   }
+
+  @Test
+  public void testHiveVariablesSnapshotJsonRoundTrip() throws Exception {
+    SessionState source = new SessionState(new HiveConf());
+    source.getHiveVariables().put("hive_var", "hive_value");
+
+    HiveSessionSnapshot snapshot = PersistableSessionUtils.captureSnapshot(
+        new SessionHandle(TProtocolVersion.HIVE_CLI_SERVICE_PROTOCOL_V11),
+        "hive", "127.0.0.1", source, 
TProtocolVersion.HIVE_CLI_SERVICE_PROTOCOL_V11, 0, 0);
+
+    ObjectMapper mapper = new ObjectMapper();
+    snapshot = mapper.readValue(mapper.writeValueAsString(snapshot), 
HiveSessionSnapshot.class);
+
+    SessionState target = new SessionState(new HiveConf());
+    HiveSession session = mock(HiveSession.class);
+    when(session.getSessionState()).thenReturn(target);
+    when(session.getHiveConf()).thenReturn(target.getConf());
+    PersistableSessionUtils.hydrateSession(session, snapshot);
+
+    assertEquals("hive_value", target.getHiveVariables().get("hive_var"));
+    target.getConf().setBoolVar(HiveConf.ConfVars.HIVE_VARIABLE_SUBSTITUTE, 
true);
+    assertEquals("hive_value", new 
VariableSubstitution(target::getHiveVariables)
+        .substitute(target.getConf(), "${hivevar:hive_var}"));
+  }
 }

Reply via email to