diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ExportCommand.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ExportCommand.java index a48753a119..2be6e84938 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ExportCommand.java +++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ExportCommand.java @@ -304,11 +304,11 @@ public class ExportCommand extends Command implements ForwardWithSync { exportJob.setQualifiedUser(ctx.getQualifiedUser()); exportJob.setUserIdentity(ctx.getCurrentUserIdentity()); - Optional optionalSessionVariable = Optional.ofNullable( - ConnectContext.get().getSessionVariable()); - exportJob.setSessionVariables(optionalSessionVariable.orElse(VariableMgr.getDefaultSessionVariable())); - exportJob.setTimeoutSecond(optionalSessionVariable.orElse(VariableMgr.getDefaultSessionVariable()) - .getQueryTimeoutS()); + // Must copy session variable, because session variable may be changed during export job running. + SessionVariable clonedSessionVariable = VariableMgr.cloneSessionVariable(Optional.ofNullable( + ConnectContext.get().getSessionVariable()).orElse(VariableMgr.getDefaultSessionVariable())); + exportJob.setSessionVariables(clonedSessionVariable); + exportJob.setTimeoutSecond(clonedSessionVariable.getQueryTimeoutS()); // exportJob generate outfile sql exportJob.generateOutfileLogicalPlans(RelationUtil.getQualifierName(ctx, this.nameParts)); diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/VariableMgr.java b/fe/fe-core/src/main/java/org/apache/doris/qe/VariableMgr.java index 1d1edbb213..14afc7a1bc 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/VariableMgr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/VariableMgr.java @@ -245,12 +245,16 @@ public class VariableMgr { public static SessionVariable newSessionVariable() { wlock.lock(); try { - return (SessionVariable) SerializationUtils.clone(defaultSessionVariable); + return cloneSessionVariable(defaultSessionVariable); } finally { wlock.unlock(); } } + public static SessionVariable cloneSessionVariable(SessionVariable var) { + return SerializationUtils.clone(var); + } + // Check if this setVar can be set correctly // Do not use ErrorReport.reportDdlException to throw exeception, it will set the query state in connection context. // But in some case, we do not want to set the query state and need to ignore that error.