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

hansva pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/hop.git


The following commit(s) were added to refs/heads/main by this push:
     new 12620d6945 parent variables were leaking into pipelines, fixes #7866 
(#7867)
12620d6945 is described below

commit 12620d6945fb8a032364f0b7848d106285d108ea
Author: Hans Van Akelyen <[email protected]>
AuthorDate: Mon Aug 10 15:32:35 2026 +0200

    parent variables were leaking into pipelines, fixes #7866 (#7867)
---
 .../hop/pipeline/transform/BaseTransform.java      | 12 ++++++++-
 .../hop/pipeline/transform/BaseTransformTest.java  | 29 ++++++++++++++++++++++
 2 files changed, 40 insertions(+), 1 deletion(-)

diff --git 
a/engine/src/main/java/org/apache/hop/pipeline/transform/BaseTransform.java 
b/engine/src/main/java/org/apache/hop/pipeline/transform/BaseTransform.java
index f131141868..541aba2300 100644
--- a/engine/src/main/java/org/apache/hop/pipeline/transform/BaseTransform.java
+++ b/engine/src/main/java/org/apache/hop/pipeline/transform/BaseTransform.java
@@ -2937,7 +2937,11 @@ public class BaseTransform<Meta extends ITransformMeta, 
Data extends ITransformD
   public void setInternalVariables() {
     setVariable(Const.INTERNAL_VARIABLE_TRANSFORM_NAME, transformName);
     setVariable(Const.INTERNAL_VARIABLE_TRANSFORM_COPYNR, 
Integer.toString(getCopy()));
-    setVariable(Const.INTERNAL_VARIABLE_TRANSFORM_ID, log.getLogChannelId());
+    // The log channel isn't created yet when the constructor initializes the 
variables.
+    //
+    if (log != null) {
+      setVariable(Const.INTERNAL_VARIABLE_TRANSFORM_ID, log.getLogChannelId());
+    }
   }
 
   /*
@@ -3615,6 +3619,12 @@ public class BaseTransform<Meta extends ITransformMeta, 
Data extends ITransformD
   @Override
   public void initializeFrom(IVariables parent) {
     variables.initializeFrom(parent);
+
+    // The Internal.Transform.* variables belong to this transform. The parent 
space can carry
+    // values of another transform (a nested execution started from e.g. a 
Pipeline or Workflow
+    // Executor passes them down), so re-apply ours after copying the parent's.
+    //
+    setInternalVariables();
   }
 
   /*
diff --git 
a/engine/src/test/java/org/apache/hop/pipeline/transform/BaseTransformTest.java 
b/engine/src/test/java/org/apache/hop/pipeline/transform/BaseTransformTest.java
index e1d096436f..0a1a19a057 100644
--- 
a/engine/src/test/java/org/apache/hop/pipeline/transform/BaseTransformTest.java
+++ 
b/engine/src/test/java/org/apache/hop/pipeline/transform/BaseTransformTest.java
@@ -42,6 +42,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.concurrent.atomic.AtomicBoolean;
 import org.apache.hop.core.BlockingRowSet;
+import org.apache.hop.core.Const;
 import org.apache.hop.core.IRowSet;
 import org.apache.hop.core.QueueRowSet;
 import org.apache.hop.core.ResultFile;
@@ -61,6 +62,7 @@ import org.apache.hop.core.row.value.ValueMetaInteger;
 import org.apache.hop.core.row.value.ValueMetaString;
 import org.apache.hop.core.util.TestUtil;
 import org.apache.hop.core.variables.IVariables;
+import org.apache.hop.core.variables.Variables;
 import org.apache.hop.pipeline.Pipeline;
 import org.apache.hop.pipeline.engines.local.LocalPipelineEngine;
 import org.apache.hop.pipeline.transforms.mock.TransformMockHelper;
@@ -116,6 +118,33 @@ class BaseTransformTest {
     assertNull(logLevel);
   }
 
+  /**
+   * A nested execution (Pipeline/Workflow Executor) passes the calling 
transform's variables down
+   * to the child pipeline, so the parent variable space can carry another 
transform's
+   * Internal.Transform.* values. Initializing from that space must not 
overwrite ours.
+   */
+  @Test
+  void testInitializeFromKeepsOwnInternalTransformVariables() {
+    BaseTransform<ITransformMeta, ITransformData> baseTransform =
+        new BaseTransform<>(
+            mockHelper.transformMeta,
+            mockHelper.iTransformMeta,
+            mockHelper.iTransformData,
+            0,
+            mockHelper.pipelineMeta,
+            mockHelper.pipeline);
+
+    IVariables parent = new Variables();
+    parent.setVariable(Const.INTERNAL_VARIABLE_TRANSFORM_NAME, "some other 
transform");
+    parent.setVariable(Const.INTERNAL_VARIABLE_TRANSFORM_COPYNR, "7");
+
+    baseTransform.initializeFrom(parent);
+
+    assertEquals(
+        "BASE TRANSFORM", 
baseTransform.getVariable(Const.INTERNAL_VARIABLE_TRANSFORM_NAME));
+    assertEquals("0", 
baseTransform.getVariable(Const.INTERNAL_VARIABLE_TRANSFORM_COPYNR));
+  }
+
   @Test
   void testTransformListenersConcurrentModification() throws 
InterruptedException {
     // Create a base transform

Reply via email to