[fix](nereids)enable fall back to old planner for single query (#19037)
* pick pr 17994
* enable fall back to old planner for single query
diff --git a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/pre/EliminateLogicalSelectHint.java b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/pre/EliminateLogicalSelectHint.java
index 418ff5f..a600268 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/pre/EliminateLogicalSelectHint.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/processor/pre/EliminateLogicalSelectHint.java
@@ -72,5 +72,17 @@
}
}
}
+
+ // if sv set enable_nereids_planner=true and hint set enable_nereids_planner=false, we should set
+ // enable_fallback_to_original_planner=true and revert it after executing.
+ // throw exception to fall back to original planner
+ if (!sessionVariable.isEnableNereidsPlanner()) {
+ try {
+ sessionVariable.enableFallbackToOriginalPlannerOnce();
+ } catch (Throwable t) {
+ throw new AnalysisException("failed to set fallback to original planner to true", t);
+ }
+ throw new AnalysisException("The nereids is disabled in this sql, fallback to original planner");
+ }
}
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
index 8a585fb..8a4ef0f 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/SessionVariable.java
@@ -17,7 +17,10 @@
package org.apache.doris.qe;
+import org.apache.doris.analysis.SetVar;
+import org.apache.doris.analysis.StringLiteral;
import org.apache.doris.common.Config;
+import org.apache.doris.common.DdlException;
import org.apache.doris.common.io.Text;
import org.apache.doris.common.io.Writable;
import org.apache.doris.common.util.TimeUtils;
@@ -1861,4 +1864,13 @@
public void setDumpNereidsMemo(boolean dumpNereidsMemo) {
this.dumpNereidsMemo = dumpNereidsMemo;
}
+
+ public void enableFallbackToOriginalPlannerOnce() throws DdlException {
+ if (enableFallbackToOriginalPlanner) {
+ return;
+ }
+ setIsSingleSetVar(true);
+ VariableMgr.setVar(this,
+ new SetVar(SessionVariable.ENABLE_FALLBACK_TO_ORIGINAL_PLANNER, new StringLiteral("true")));
+ }
}
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
index 9bbbb03..6aac61b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/StmtExecutor.java
@@ -489,6 +489,12 @@
LOG.warn("fall back to legacy planner, because: {}", e.getMessage(), e);
parsedStmt = null;
context.getState().setNereids(false);
+ try {
+ VariableMgr.revertSessionValue(sessionVariable);
+ } catch (DdlException ex) {
+ LOG.warn("failed to revert Session value. {}", context.getQueryIdentifier(), ex);
+ context.getState().setError(ex.getMysqlErrorCode(), ex.getMessage());
+ }
analyze(context.getSessionVariable().toThrift());
}
} catch (Exception e) {