This is an automated email from the ASF dual-hosted git repository.
morrysnow pushed a commit to branch branch-3.0
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-3.0 by this push:
new 12982ab0d22 branch-3.0: [fix](Nereids) move tables from connect
context to statement context #44568 (#44957)
12982ab0d22 is described below
commit 12982ab0d22575cd6b5c336d3af422a7506ed84e
Author: github-actions[bot]
<41898282+github-actions[bot]@users.noreply.github.com>
AuthorDate: Thu Dec 19 15:48:58 2024 +0800
branch-3.0: [fix](Nereids) move tables from connect context to statement
context #44568 (#44957)
Cherry-picked from #44568
Co-authored-by: LiBinfeng <[email protected]>
---
.../org/apache/doris/nereids/CascadesContext.java | 3 ++-
.../org/apache/doris/nereids/NereidsPlanner.java | 4 +--
.../org/apache/doris/nereids/StatementContext.java | 29 ++++++++++++++++++++++
.../apache/doris/nereids/minidump/Minidump.java | 1 +
.../doris/nereids/minidump/MinidumpUtils.java | 1 -
.../doris/nereids/rules/analysis/BindRelation.java | 8 +++---
.../trees/plans/commands/ReplayCommand.java | 1 +
.../java/org/apache/doris/qe/ConnectContext.java | 29 ----------------------
.../apache/doris/nereids/util/ReadLockTest.java | 23 ++++++-----------
9 files changed, 47 insertions(+), 52 deletions(-)
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/CascadesContext.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/CascadesContext.java
index 17ae5883063..bb10996a11b 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/CascadesContext.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/CascadesContext.java
@@ -582,8 +582,9 @@ public class CascadesContext implements ScheduleContext {
public Lock(LogicalPlan plan, CascadesContext cascadesContext) {
this.cascadesContext = cascadesContext;
// tables can also be load from dump file
- if (cascadesContext.tables == null) {
+ if (cascadesContext.getTables() == null ||
cascadesContext.getTables().isEmpty()) {
cascadesContext.extractTables(plan);
+
cascadesContext.getStatementContext().setTables(cascadesContext.getTables());
}
for (TableIf table : cascadesContext.tables.values()) {
if (!table.needReadLockWhenPlan()) {
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java
index c9985911670..29c39f4a8e6 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/NereidsPlanner.java
@@ -361,8 +361,8 @@ public class NereidsPlanner extends Planner {
private void initCascadesContext(LogicalPlan plan, PhysicalProperties
requireProperties) {
cascadesContext = CascadesContext.initContext(statementContext, plan,
requireProperties);
- if (statementContext.getConnectContext().getTables() != null) {
-
cascadesContext.setTables(statementContext.getConnectContext().getTables());
+ if (statementContext.getTables() != null) {
+ cascadesContext.setTables(statementContext.getTables());
}
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/StatementContext.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/StatementContext.java
index cd11b3228b9..022532a61bf 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/StatementContext.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/StatementContext.java
@@ -27,6 +27,7 @@ import org.apache.doris.common.Pair;
import org.apache.doris.datasource.mvcc.MvccSnapshot;
import org.apache.doris.datasource.mvcc.MvccTable;
import org.apache.doris.datasource.mvcc.MvccTableInfo;
+import org.apache.doris.nereids.exceptions.AnalysisException;
import org.apache.doris.nereids.hint.Hint;
import org.apache.doris.nereids.memo.Group;
import org.apache.doris.nereids.rules.analysis.ColumnAliasGenerator;
@@ -52,6 +53,7 @@ import org.apache.doris.qe.cache.CacheAnalyzer;
import org.apache.doris.statistics.Statistics;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Preconditions;
import com.google.common.base.Stopwatch;
import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
@@ -151,6 +153,9 @@ public class StatementContext implements Closeable {
// placeholder params for prepared statement
private List<Placeholder> placeholders;
+ // tables used for plan replayer
+ private Map<List<String>, TableIf> tables = null;
+
// for create view support in nereids
// key is the start and end position of the sql substring that needs to be
replaced,
// and value is the new string used for replacement.
@@ -212,6 +217,30 @@ public class StatementContext implements Closeable {
}
}
+ public Map<List<String>, TableIf> getTables() {
+ if (tables == null) {
+ tables = Maps.newHashMap();
+ }
+ return tables;
+ }
+
+ public void setTables(Map<List<String>, TableIf> tables) {
+ this.tables = tables;
+ }
+
+ /** get table by table name, try to get from information from dumpfile
first */
+ public TableIf getTableInMinidumpCache(List<String> tableQualifier) {
+ if (!getConnectContext().getSessionVariable().isPlayNereidsDump()) {
+ return null;
+ }
+ Preconditions.checkState(tables != null, "tables should not be null");
+ TableIf table = tables.getOrDefault(tableQualifier, null);
+ if (getConnectContext().getSessionVariable().isPlayNereidsDump() &&
table == null) {
+ throw new AnalysisException("Minidump cache can not find table:" +
tableQualifier);
+ }
+ return table;
+ }
+
public void setConnectContext(ConnectContext connectContext) {
this.connectContext = connectContext;
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/minidump/Minidump.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/minidump/Minidump.java
index 5c324e1f364..37c7ff9a165 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/nereids/minidump/Minidump.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/nereids/minidump/Minidump.java
@@ -123,6 +123,7 @@ public class Minidump {
StatementContext statementContext = new
StatementContext(ConnectContext.get(),
new OriginStatement(minidump.getSql(), 0));
+ statementContext.setTables(minidump.getTables());
ConnectContext.get().setStatementContext(statementContext);
JSONObject resultPlan = MinidumpUtils.executeSql(minidump.getSql());
JSONObject minidumpResult = new
JSONObject(minidump.getResultPlanJson());
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/minidump/MinidumpUtils.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/minidump/MinidumpUtils.java
index fad7befc162..c0f88b25341 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/minidump/MinidumpUtils.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/minidump/MinidumpUtils.java
@@ -227,7 +227,6 @@ public class MinidumpUtils {
connectContext.setThreadLocalInfo();
Env.getCurrentEnv().setColocateTableIndex(minidump.getColocateTableIndex());
connectContext.setSessionVariable(minidump.getSessionVariable());
- connectContext.setTables(minidump.getTables());
connectContext.setDatabase(minidump.getDbName());
connectContext.getSessionVariable().setPlanNereidsDump(true);
connectContext.getSessionVariable().enableNereidsTimeout = false;
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java
index c803f0aac31..28997d0e7e8 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/rules/analysis/BindRelation.java
@@ -171,7 +171,7 @@ public class BindRelation extends OneAnalysisRuleFactory {
List<String> tableQualifier =
RelationUtil.getQualifierName(cascadesContext.getConnectContext(),
unboundRelation.getNameParts());
TableIf table = null;
- table = ConnectContext.get().getTableInMinidumpCache(tableQualifier);
+ table =
ConnectContext.get().getStatementContext().getTableInMinidumpCache(tableQualifier);
if (table == null) {
if (customTableResolver.isPresent()) {
table = customTableResolver.get().apply(tableQualifier);
@@ -182,7 +182,7 @@ public class BindRelation extends OneAnalysisRuleFactory {
if (table == null) {
table = RelationUtil.getTable(tableQualifier,
cascadesContext.getConnectContext().getEnv());
}
- ConnectContext.get().getTables().put(tableQualifier, table);
+
ConnectContext.get().getStatementContext().getTables().put(tableQualifier,
table);
// TODO: should generate different Scan sub class according to table's
type
LogicalPlan scan = getLogicalPlan(table, unboundRelation,
tableQualifier, cascadesContext);
@@ -201,13 +201,13 @@ public class BindRelation extends OneAnalysisRuleFactory {
if (customTableResolver.isPresent()) {
table = customTableResolver.get().apply(tableQualifier);
}
- table = ConnectContext.get().getTableInMinidumpCache(tableQualifier);
+ table =
ConnectContext.get().getStatementContext().getTableInMinidumpCache(tableQualifier);
// In some cases even if we have already called the
"cascadesContext.getTableByName",
// it also gets the null. So, we just check it in the catalog again
for safety.
if (table == null) {
table = RelationUtil.getTable(tableQualifier,
cascadesContext.getConnectContext().getEnv());
}
- ConnectContext.get().getTables().put(tableQualifier, table);
+
ConnectContext.get().getStatementContext().getTables().put(tableQualifier,
table);
return getLogicalPlan(table, unboundRelation, tableQualifier,
cascadesContext);
}
diff --git
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ReplayCommand.java
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ReplayCommand.java
index 15cc2b3696a..4eabbb9e959 100644
---
a/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ReplayCommand.java
+++
b/fe/fe-core/src/main/java/org/apache/doris/nereids/trees/plans/commands/ReplayCommand.java
@@ -99,6 +99,7 @@ public class ReplayCommand extends Command implements
NoForward {
// 3. run nereids planner with sql in minidump file
StatementContext statementContext = new
StatementContext(ConnectContext.get(),
new OriginStatement(minidump.getSql(), 0));
+ statementContext.setTables(minidump.getTables());
ConnectContext.get().setStatementContext(statementContext);
JSONObject resultPlan = MinidumpUtils.executeSql(minidump.getSql());
JSONObject minidumpResult = new
JSONObject(minidump.getResultPlanJson());
diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java
b/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java
index 0f140ed5bdd..265d1f89455 100644
--- a/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java
+++ b/fe/fe-core/src/main/java/org/apache/doris/qe/ConnectContext.java
@@ -32,7 +32,6 @@ import org.apache.doris.analysis.VariableExpr;
import org.apache.doris.catalog.DatabaseIf;
import org.apache.doris.catalog.Env;
import org.apache.doris.catalog.FunctionRegistry;
-import org.apache.doris.catalog.TableIf;
import org.apache.doris.catalog.Type;
import org.apache.doris.cloud.qe.ComputeGroupException;
import org.apache.doris.cloud.system.CloudSystemInfoService;
@@ -55,7 +54,6 @@ import org.apache.doris.mysql.MysqlSslContext;
import org.apache.doris.mysql.ProxyMysqlChannel;
import org.apache.doris.mysql.privilege.PrivPredicate;
import org.apache.doris.nereids.StatementContext;
-import org.apache.doris.nereids.exceptions.AnalysisException;
import org.apache.doris.nereids.stats.StatsErrorEstimator;
import org.apache.doris.nereids.trees.expressions.literal.Literal;
import org.apache.doris.plsql.Exec;
@@ -74,7 +72,6 @@ import org.apache.doris.thrift.TUniqueId;
import org.apache.doris.transaction.TransactionEntry;
import org.apache.doris.transaction.TransactionStatus;
-import com.google.common.base.Preconditions;
import com.google.common.base.Strings;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
@@ -271,8 +268,6 @@ public class ConnectContext {
// new planner
private Map<String, PreparedStatementContext> preparedStatementContextMap
= Maps.newHashMap();
- private Map<List<String>, TableIf> tables = null;
-
private Map<String, ColumnStatistic> totalColumnStatisticMap = new
HashMap<>();
public Map<String, ColumnStatistic> getTotalColumnStatisticMap() {
@@ -437,30 +432,6 @@ public class ConnectContext {
return this.preparedStatementContextMap.get(stmtName);
}
- public Map<List<String>, TableIf> getTables() {
- if (tables == null) {
- tables = Maps.newHashMap();
- }
- return tables;
- }
-
- public void setTables(Map<List<String>, TableIf> tables) {
- this.tables = tables;
- }
-
- /** get table by table name, try to get from information from dumpfile
first */
- public TableIf getTableInMinidumpCache(List<String> tableQualifier) {
- if (!getSessionVariable().isPlayNereidsDump()) {
- return null;
- }
- Preconditions.checkState(tables != null, "tables should not be null");
- TableIf table = tables.getOrDefault(tableQualifier, null);
- if (getSessionVariable().isPlayNereidsDump() && table == null) {
- throw new AnalysisException("Minidump cache can not find table:" +
tableQualifier);
- }
- return table;
- }
-
public void closeTxn() {
if (isTxnModel()) {
try {
diff --git
a/fe/fe-core/src/test/java/org/apache/doris/nereids/util/ReadLockTest.java
b/fe/fe-core/src/test/java/org/apache/doris/nereids/util/ReadLockTest.java
index 3e1752e41bc..1e1535a5736 100644
--- a/fe/fe-core/src/test/java/org/apache/doris/nereids/util/ReadLockTest.java
+++ b/fe/fe-core/src/test/java/org/apache/doris/nereids/util/ReadLockTest.java
@@ -18,7 +18,6 @@
package org.apache.doris.nereids.util;
import org.apache.doris.catalog.TableIf;
-import org.apache.doris.nereids.CascadesContext;
import org.apache.doris.nereids.NereidsPlanner;
import org.apache.doris.nereids.StatementContext;
import org.apache.doris.nereids.datasets.ssb.SSBTestBase;
@@ -48,10 +47,8 @@ public class ReadLockTest extends SSBTestBase {
parser.parseSingle(sql),
PhysicalProperties.ANY
);
- CascadesContext cascadesContext = planner.getCascadesContext();
-
- Map<List<String>, TableIf> f = cascadesContext.getTables();
- Assertions.assertEquals(2, f.size());
+ Map<List<String>, TableIf> f = statementContext.getTables();
+ Assertions.assertEquals(1, f.size());
Set<String> tableNames = new HashSet<>();
for (Map.Entry<List<String>, TableIf> entry : f.entrySet()) {
TableIf table = entry.getValue();
@@ -75,8 +72,7 @@ public class ReadLockTest extends SSBTestBase {
parser.parseSingle(sql),
PhysicalProperties.ANY
);
- CascadesContext cascadesContext = planner.getCascadesContext();
- Map<List<String>, TableIf> f = cascadesContext.getTables();
+ Map<List<String>, TableIf> f = statementContext.getTables();
Assertions.assertEquals(1, f.size());
for (Map.Entry<List<String>, TableIf> entry : f.entrySet()) {
TableIf table = entry.getValue();
@@ -93,8 +89,7 @@ public class ReadLockTest extends SSBTestBase {
parser.parseSingle(sql),
PhysicalProperties.ANY
);
- CascadesContext cascadesContext = planner.getCascadesContext();
- Map<List<String>, TableIf> f = cascadesContext.getTables();
+ Map<List<String>, TableIf> f = statementContext.getTables();
Assertions.assertEquals(1, f.size());
for (Map.Entry<List<String>, TableIf> entry : f.entrySet()) {
TableIf table = entry.getValue();
@@ -111,8 +106,7 @@ public class ReadLockTest extends SSBTestBase {
parser.parseSingle(sql),
PhysicalProperties.ANY
);
- CascadesContext cascadesContext = planner.getCascadesContext();
- Map<List<String>, TableIf> f = cascadesContext.getTables();
+ Map<List<String>, TableIf> f = statementContext.getTables();
Assertions.assertEquals(2, f.size());
Set<String> tableNames = new HashSet<>();
for (Map.Entry<List<String>, TableIf> entry : f.entrySet()) {
@@ -134,15 +128,14 @@ public class ReadLockTest extends SSBTestBase {
(LogicalPlan)
insertIntoTableCommand.getExplainPlan(connectContext),
PhysicalProperties.ANY
);
- CascadesContext cascadesContext = planner.getCascadesContext();
- Map<List<String>, TableIf> f = cascadesContext.getTables();
- Assertions.assertEquals(2, f.size());
+ Map<List<String>, TableIf> f = statementContext.getTables();
+ // when table in insert would not be added to statement context, but
be lock when insert
+ Assertions.assertEquals(1, f.size());
Set<String> tableNames = new HashSet<>();
for (Map.Entry<List<String>, TableIf> entry : f.entrySet()) {
TableIf table = entry.getValue();
tableNames.add(table.getName());
}
- Assertions.assertTrue(tableNames.contains("supplier"));
Assertions.assertTrue(tableNames.contains("lineorder"));
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]