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 <libinf...@selectdb.com> --- .../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: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org