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

liaoxin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/master by this push:
     new bb929950935 [fix](nereids)StatementContext must be created before 
creating stream load plan (#58494)
bb929950935 is described below

commit bb929950935cf858f939c8bcad65288fd476b481
Author: starocean999 <[email protected]>
AuthorDate: Tue Dec 2 16:39:23 2025 +0800

    [fix](nereids)StatementContext must be created before creating stream load 
plan (#58494)
    
    In NereidsLoadScanProvider, we call
    StatementScopeIdGenerator.getExprIdGenerator() to generate ExprId for
    column mapping exprs. But the StatementContext is not set in
    ConnectContext at this point. So it will use ExprIdGenerator from
    default StatementContext. Later when createLoadPlan for stream load, we
    create a new StatementContext and use a new ExprIdGenerator then. We
    should only use 1 ExprIdGenerator during stream load process. This pr
    fix it.
---
 .../org/apache/doris/nereids/load/NereidsLoadUtils.java     |  5 ++---
 .../doris/nereids/load/NereidsLoadingTaskPlanner.java       |  9 +++++++++
 .../apache/doris/nereids/load/NereidsStreamLoadPlanner.java | 11 +++++++++++
 .../org/apache/doris/planner/StreamLoadPlannerTest.java     | 13 +++++++++++++
 4 files changed, 35 insertions(+), 3 deletions(-)

diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/load/NereidsLoadUtils.java 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/load/NereidsLoadUtils.java
index b52415d4f75..5cdf6ab074b 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/load/NereidsLoadUtils.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/load/NereidsLoadUtils.java
@@ -24,7 +24,6 @@ import org.apache.doris.catalog.Table;
 import org.apache.doris.common.UserException;
 import org.apache.doris.info.PartitionNamesInfo;
 import org.apache.doris.nereids.CascadesContext;
-import org.apache.doris.nereids.StatementContext;
 import org.apache.doris.nereids.analyzer.UnboundAlias;
 import org.apache.doris.nereids.analyzer.UnboundOneRowRelation;
 import org.apache.doris.nereids.analyzer.UnboundSlot;
@@ -199,8 +198,8 @@ public class NereidsLoadUtils {
                 partitionNamesInfo != null ? 
partitionNamesInfo.getPartitionNames() : ImmutableList.of(),
                 isPartialUpdate, partialUpdateNewKeyPolicy, 
DMLCommandType.LOAD, currentRootPlan);
 
-        CascadesContext cascadesContext = CascadesContext.initContext(new 
StatementContext(), currentRootPlan,
-                PhysicalProperties.ANY);
+        CascadesContext cascadesContext = 
CascadesContext.initContext(ConnectContext.get().getStatementContext(),
+                currentRootPlan, PhysicalProperties.ANY);
         ConnectContext ctx = cascadesContext.getConnectContext();
         // we force convert nullable column to non-nullable column for load
         // so set feDebug to false to avoid AdjustNullableRule report error
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/load/NereidsLoadingTaskPlanner.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/load/NereidsLoadingTaskPlanner.java
index 98a34bf1ea5..13156d771e8 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/load/NereidsLoadingTaskPlanner.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/load/NereidsLoadingTaskPlanner.java
@@ -28,6 +28,7 @@ import org.apache.doris.common.LoadException;
 import org.apache.doris.common.UserException;
 import org.apache.doris.common.util.DebugUtil;
 import org.apache.doris.info.PartitionNamesInfo;
+import org.apache.doris.nereids.StatementContext;
 import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
 import org.apache.doris.planner.DataPartition;
 import org.apache.doris.planner.FileLoadScanNode;
@@ -146,6 +147,14 @@ public class NereidsLoadingTaskPlanner {
 
         Preconditions.checkState(!fileGroups.isEmpty() && fileGroups.size() == 
fileStatusesList.size());
 
+        // make sure StatementContext is set in ConnectContext
+        ConnectContext connectContext = ConnectContext.get();
+        if (connectContext != null && connectContext.getStatementContext() == 
null) {
+            StatementContext statementContext = new StatementContext();
+            connectContext.setStatementContext(statementContext);
+            statementContext.setConnectContext(connectContext);
+        }
+
         PartitionNamesInfo partitionNamesInfo = getPartitionNamesInfo();
         long txnTimeout = timeoutS == 0 ? 
ConnectContext.get().getExecTimeoutS() : timeoutS;
         if (txnTimeout > Integer.MAX_VALUE) {
diff --git 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/load/NereidsStreamLoadPlanner.java
 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/load/NereidsStreamLoadPlanner.java
index c3773c57cd1..abb03414b07 100644
--- 
a/fe/fe-core/src/main/java/org/apache/doris/nereids/load/NereidsStreamLoadPlanner.java
+++ 
b/fe/fe-core/src/main/java/org/apache/doris/nereids/load/NereidsStreamLoadPlanner.java
@@ -31,6 +31,7 @@ import org.apache.doris.common.DdlException;
 import org.apache.doris.common.UserException;
 import org.apache.doris.common.util.TimeUtils;
 import org.apache.doris.load.loadv2.LoadTask;
+import org.apache.doris.nereids.StatementContext;
 import org.apache.doris.nereids.trees.plans.logical.LogicalPlan;
 import org.apache.doris.planner.DataPartition;
 import org.apache.doris.planner.FileLoadScanNode;
@@ -38,6 +39,7 @@ import org.apache.doris.planner.PlanFragment;
 import org.apache.doris.planner.PlanFragmentId;
 import org.apache.doris.planner.PlanNodeId;
 import org.apache.doris.planner.ScanNode;
+import org.apache.doris.qe.ConnectContext;
 import org.apache.doris.service.FrontendOptions;
 import org.apache.doris.thrift.PaloInternalServiceVersion;
 import org.apache.doris.thrift.TBrokerFileStatus;
@@ -217,6 +219,15 @@ public class NereidsStreamLoadPlanner {
                 throw new DdlException("Column is not SUM AggregateType. 
column:" + col.getName());
             }
         }
+
+        // make sure StatementContext is set in ConnectContext
+        ConnectContext connectContext = ConnectContext.get();
+        if (connectContext != null && connectContext.getStatementContext() == 
null) {
+            StatementContext statementContext = new StatementContext();
+            connectContext.setStatementContext(statementContext);
+            statementContext.setConnectContext(connectContext);
+        }
+
         // 1. create file group
         NereidsDataDescription dataDescription = new 
NereidsDataDescription(destTable.getName(), taskInfo);
         dataDescription.analyzeWithoutCheckPriv(db.getFullName());
diff --git 
a/fe/fe-core/src/test/java/org/apache/doris/planner/StreamLoadPlannerTest.java 
b/fe/fe-core/src/test/java/org/apache/doris/planner/StreamLoadPlannerTest.java
index 7097f37724c..098e79b3511 100644
--- 
a/fe/fe-core/src/test/java/org/apache/doris/planner/StreamLoadPlannerTest.java
+++ 
b/fe/fe-core/src/test/java/org/apache/doris/planner/StreamLoadPlannerTest.java
@@ -17,8 +17,12 @@
 
 package org.apache.doris.planner;
 
+import org.apache.doris.common.IdGenerator;
+import org.apache.doris.nereids.CascadesContext;
 import org.apache.doris.nereids.load.NereidsLoadUtils;
+import org.apache.doris.nereids.trees.expressions.ExprId;
 import org.apache.doris.nereids.trees.expressions.Expression;
+import org.apache.doris.nereids.trees.expressions.StatementScopeIdGenerator;
 
 import org.junit.Assert;
 import org.junit.Test;
@@ -32,4 +36,13 @@ public class StreamLoadPlannerTest {
         List<Expression> expressions = 
NereidsLoadUtils.parseExpressionSeq(sql);
         Assert.assertEquals(4, expressions.size());
     }
+
+    @Test
+    public void testExprIdGenerator() {
+        IdGenerator<ExprId> exprIdGenerator1 = 
StatementScopeIdGenerator.getExprIdGenerator();
+        CascadesContext context = CascadesContext.initTempContext();
+        IdGenerator<ExprId> exprIdGenerator2 = 
context.getStatementContext().getExprIdGenerator();
+        // we get different IdGenerator instance
+        Assert.assertTrue(exprIdGenerator1 != exprIdGenerator2);
+    }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to