diff --git a/core/trino-main/src/main/java/io/trino/cost/CachingTableStatsProvider.java b/core/trino-main/src/main/java/io/trino/cost/CachingTableStatsProvider.java index ca7e9fd43f35..3b1b562f000e 100644 --- a/core/trino-main/src/main/java/io/trino/cost/CachingTableStatsProvider.java +++ b/core/trino-main/src/main/java/io/trino/cost/CachingTableStatsProvider.java @@ -21,6 +21,7 @@ import java.util.Map; import java.util.WeakHashMap; +import java.util.function.Supplier; import static java.util.Objects.requireNonNull; @@ -29,24 +30,36 @@ public class CachingTableStatsProvider { private final Metadata metadata; private final Session session; + private final Supplier isQueryDone; private final Map cache = new WeakHashMap<>(); - public CachingTableStatsProvider(Metadata metadata, Session session) + public CachingTableStatsProvider(Metadata metadata, Session session, Supplier isQueryDone) { this.metadata = requireNonNull(metadata, "metadata is null"); this.session = requireNonNull(session, "session is null"); + this.isQueryDone = requireNonNull(isQueryDone, "isQueryDone is null"); } @Override public TableStatistics getTableStatistics(TableHandle tableHandle) { - TableStatistics stats = cache.get(tableHandle); - if (stats == null) { - stats = metadata.getTableStatistics(session, tableHandle); - cache.put(tableHandle, stats); + return cache.computeIfAbsent(tableHandle, this::getTableStatisticsInternal); + } + + private TableStatistics getTableStatisticsInternal(TableHandle tableHandle) + { + try { + return metadata.getTableStatistics(session, tableHandle); + } + catch (RuntimeException e) { + if (isQueryDone.get()) { + // getting statistics for finished query may result in many different exceptions being thrown. + // As we do not care about the result anyway mask it by returning empty statistics. + return TableStatistics.empty(); + } + throw e; } - return stats; } public Map getCachedTableStatistics() diff --git a/core/trino-main/src/main/java/io/trino/execution/SqlQueryExecution.java b/core/trino-main/src/main/java/io/trino/execution/SqlQueryExecution.java index b4bcbe4102bf..b96e8d916b55 100644 --- a/core/trino-main/src/main/java/io/trino/execution/SqlQueryExecution.java +++ b/core/trino-main/src/main/java/io/trino/execution/SqlQueryExecution.java @@ -410,7 +410,7 @@ public void start() }, directExecutor()); try { - CachingTableStatsProvider tableStatsProvider = new CachingTableStatsProvider(plannerContext.getMetadata(), getSession()); + CachingTableStatsProvider tableStatsProvider = new CachingTableStatsProvider(plannerContext.getMetadata(), getSession(), stateMachine::isDone); PlanRoot plan = planQuery(tableStatsProvider); // DynamicFilterService needs plan for query to be registered. // Query should be registered before dynamic filter suppliers are requested in distribution planning. diff --git a/core/trino-main/src/main/java/io/trino/metadata/MetadataManager.java b/core/trino-main/src/main/java/io/trino/metadata/MetadataManager.java index 5544998f8f67..124b54486e8c 100644 --- a/core/trino-main/src/main/java/io/trino/metadata/MetadataManager.java +++ b/core/trino-main/src/main/java/io/trino/metadata/MetadataManager.java @@ -27,7 +27,6 @@ import io.airlift.slice.Slice; import io.trino.Session; import io.trino.connector.system.GlobalSystemConnector; -import io.trino.execution.QueryManager; import io.trino.metadata.LanguageFunctionManager.RunAsIdentityLoader; import io.trino.security.AccessControl; import io.trino.security.InjectedConnectorAccessControl; @@ -129,7 +128,6 @@ import java.util.Locale; import java.util.Map; import java.util.Map.Entry; -import java.util.NoSuchElementException; import java.util.Optional; import java.util.OptionalInt; import java.util.OptionalLong; @@ -195,7 +193,6 @@ public final class MetadataManager private final TableFunctionRegistry tableFunctionRegistry; private final TypeManager typeManager; private final TypeCoercion typeCoercion; - private final QueryManager queryManager; private final ConcurrentMap catalogsByQueryId = new ConcurrentHashMap<>(); @@ -207,15 +204,13 @@ public MetadataManager( GlobalFunctionCatalog globalFunctionCatalog, LanguageFunctionManager languageFunctionManager, TableFunctionRegistry tableFunctionRegistry, - TypeManager typeManager, - QueryManager queryManager) + TypeManager typeManager) { this.accessControl = requireNonNull(accessControl, "accessControl is null"); this.typeManager = requireNonNull(typeManager, "typeManager is null"); functions = requireNonNull(globalFunctionCatalog, "globalFunctionCatalog is null"); functionResolver = new BuiltinFunctionResolver(this, typeManager, globalFunctionCatalog); this.typeCoercion = new TypeCoercion(typeManager::getType); - this.queryManager = requireNonNull(queryManager, "queryManager is null"); this.systemSecurityMetadata = requireNonNull(systemSecurityMetadata, "systemSecurityMetadata is null"); this.transactionManager = requireNonNull(transactionManager, "transactionManager is null"); @@ -489,33 +484,11 @@ public TableMetadata getTableMetadata(Session session, TableHandle tableHandle) @Override public TableStatistics getTableStatistics(Session session, TableHandle tableHandle) { - try { - CatalogHandle catalogHandle = tableHandle.catalogHandle(); - ConnectorMetadata metadata = getMetadata(session, catalogHandle); - TableStatistics tableStatistics = metadata.getTableStatistics(session.toConnectorSession(catalogHandle), tableHandle.connectorHandle()); - verifyNotNull(tableStatistics, "%s returned null tableStatistics for %s", metadata, tableHandle); - return tableStatistics; - } - catch (RuntimeException e) { - if (isQueryDone(session)) { - // getting statistics for finished query may result in many different execeptions being thrown. - // As we do not care about the result anyway mask it by returning empty statistics. - return TableStatistics.empty(); - } - throw e; - } - } - - private boolean isQueryDone(Session session) - { - boolean done; - try { - done = queryManager.getQueryState(session.getQueryId()).isDone(); - } - catch (NoSuchElementException ex) { - done = true; - } - return done; + CatalogHandle catalogHandle = tableHandle.catalogHandle(); + ConnectorMetadata metadata = getMetadata(session, catalogHandle); + TableStatistics tableStatistics = metadata.getTableStatistics(session.toConnectorSession(catalogHandle), tableHandle.connectorHandle()); + verifyNotNull(tableStatistics, "%s returned null tableStatistics for %s", metadata, tableHandle); + return tableStatistics; } @Override diff --git a/core/trino-main/src/main/java/io/trino/sql/analyzer/QueryExplainer.java b/core/trino-main/src/main/java/io/trino/sql/analyzer/QueryExplainer.java index 3eb58e731582..f18f1904f5d9 100644 --- a/core/trino-main/src/main/java/io/trino/sql/analyzer/QueryExplainer.java +++ b/core/trino-main/src/main/java/io/trino/sql/analyzer/QueryExplainer.java @@ -172,7 +172,7 @@ public Plan getLogicalPlan(Session session, Statement statement, List false)); return logicalPlanner.plan(analysis, OPTIMIZED_AND_VALIDATED, true); } diff --git a/core/trino-main/src/main/java/io/trino/sql/rewrite/ShowStatsRewrite.java b/core/trino-main/src/main/java/io/trino/sql/rewrite/ShowStatsRewrite.java index b8d51904980f..ec52e41bad9c 100644 --- a/core/trino-main/src/main/java/io/trino/sql/rewrite/ShowStatsRewrite.java +++ b/core/trino-main/src/main/java/io/trino/sql/rewrite/ShowStatsRewrite.java @@ -148,7 +148,7 @@ protected Node visitShowStats(ShowStats node, Void context) { Query query = getRelation(node); Plan plan = queryExplainer.getLogicalPlan(session, query, parameters, warningCollector, planOptimizersStatsCollector); - CachingStatsProvider cachingStatsProvider = new CachingStatsProvider(statsCalculator, session, new CachingTableStatsProvider(metadata, session)); + CachingStatsProvider cachingStatsProvider = new CachingStatsProvider(statsCalculator, session, new CachingTableStatsProvider(metadata, session, () -> false)); PlanNodeStatsEstimate stats = cachingStatsProvider.getStats(plan.getRoot()); return rewriteShowStats(plan, stats); } diff --git a/core/trino-main/src/main/java/io/trino/testing/NotImplementedQueryManager.java b/core/trino-main/src/main/java/io/trino/testing/NotImplementedQueryManager.java deleted file mode 100644 index 2af126ec8ed8..000000000000 --- a/core/trino-main/src/main/java/io/trino/testing/NotImplementedQueryManager.java +++ /dev/null @@ -1,134 +0,0 @@ -/* - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package io.trino.testing; - -import com.google.common.collect.ImmutableList; -import com.google.common.util.concurrent.ListenableFuture; -import io.trino.Session; -import io.trino.execution.QueryExecution; -import io.trino.execution.QueryInfo; -import io.trino.execution.QueryManager; -import io.trino.execution.QueryState; -import io.trino.execution.StageId; -import io.trino.execution.StateMachine; -import io.trino.execution.TaskId; -import io.trino.server.BasicQueryInfo; -import io.trino.server.ResultQueryInfo; -import io.trino.server.protocol.Slug; -import io.trino.spi.QueryId; - -import java.util.List; -import java.util.NoSuchElementException; -import java.util.function.Consumer; - -public class NotImplementedQueryManager - implements QueryManager -{ - @Override - public List getQueries() - { - return ImmutableList.of(); - } - - @Override - public void setOutputInfoListener(QueryId queryId, Consumer listener) - { - throw new NoSuchElementException(queryId.toString()); - } - - @Override - public void outputTaskFailed(TaskId taskId, Throwable failure) - { - throw new NoSuchElementException(taskId.getQueryId().toString()); - } - - @Override - public void resultsConsumed(QueryId queryId) - { - throw new NoSuchElementException(queryId.toString()); - } - - @Override - public void addStateChangeListener(QueryId queryId, StateMachine.StateChangeListener listener) - { - throw new NoSuchElementException(queryId.toString()); - } - - @Override - public ListenableFuture getStateChange(QueryId queryId, QueryState currentState) - { - throw new NoSuchElementException(queryId.toString()); - } - - @Override - public BasicQueryInfo getQueryInfo(QueryId queryId) - { - throw new NoSuchElementException(queryId.toString()); - } - - @Override - public QueryInfo getFullQueryInfo(QueryId queryId) - { - throw new NoSuchElementException(queryId.toString()); - } - - @Override - public ResultQueryInfo getResultQueryInfo(QueryId queryId) - throws NoSuchElementException - { - throw new NoSuchElementException(queryId.toString()); - } - - @Override - public Session getQuerySession(QueryId queryId) - { - throw new NoSuchElementException(queryId.toString()); - } - - @Override - public Slug getQuerySlug(QueryId queryId) - { - throw new NoSuchElementException(queryId.toString()); - } - - @Override - public QueryState getQueryState(QueryId queryId) - { - throw new NoSuchElementException(queryId.toString()); - } - - @Override - public boolean hasQuery(QueryId queryId) - { - return false; - } - - @Override - public void recordHeartbeat(QueryId queryId) {} - - @Override - public void createQuery(QueryExecution execution) - { - throw new UnsupportedOperationException(); - } - - @Override - public void failQuery(QueryId queryId, Throwable cause) {} - - @Override - public void cancelQuery(QueryId queryId) {} - - @Override - public void cancelStage(StageId stageId) {} -} diff --git a/core/trino-main/src/main/java/io/trino/testing/PlanTester.java b/core/trino-main/src/main/java/io/trino/testing/PlanTester.java index e04382ec004f..7a8fb4002969 100644 --- a/core/trino-main/src/main/java/io/trino/testing/PlanTester.java +++ b/core/trino-main/src/main/java/io/trino/testing/PlanTester.java @@ -380,8 +380,7 @@ private PlanTester(Session defaultSession, int nodeCountForStats) globalFunctionCatalog, languageFunctionManager, tableFunctionRegistry, - typeManager, - new NotImplementedQueryManager()); + typeManager); typeRegistry.addType(new JsonPath2016Type(new TypeDeserializer(typeManager), blockEncodingSerde)); this.joinCompiler = new JoinCompiler(typeOperators); this.hashStrategyCompiler = new FlatHashStrategyCompiler(typeOperators); @@ -914,7 +913,7 @@ public Plan createPlan(Session session, @Language("SQL") String sql, List false)); Analysis analysis = analyzer.analyze(preparedQuery.getStatement()); // make PlanTester always compute plan statistics for test purposes @@ -931,7 +930,7 @@ public SubPlan createAdaptivePlan(Session session, SubPlan subPlan, List false)); return adaptivePlanner.optimize(subPlan, runtimeInfoProvider); } diff --git a/core/trino-main/src/test/java/io/trino/cost/StatsCalculatorAssertion.java b/core/trino-main/src/test/java/io/trino/cost/StatsCalculatorAssertion.java index 75d6b8014f7f..ebcc4613b0d0 100644 --- a/core/trino-main/src/test/java/io/trino/cost/StatsCalculatorAssertion.java +++ b/core/trino-main/src/test/java/io/trino/cost/StatsCalculatorAssertion.java @@ -98,7 +98,7 @@ public StatsCalculatorAssertion check(Consumer statistic this::getSourceStats, noLookup(), session, - tableStatsProvider.orElseGet(() -> new CachingTableStatsProvider(queryRunner.getPlannerContext().getMetadata(), session)), + tableStatsProvider.orElseGet(() -> new CachingTableStatsProvider(queryRunner.getPlannerContext().getMetadata(), session, () -> false)), runtimeInfoProvider)); statisticsAssertionConsumer.accept(PlanNodeStatsAssertion.assertThat(statsEstimate)); return this; @@ -113,7 +113,7 @@ public StatsCalculatorAssertion check(Rule rule, Consumer new CachingTableStatsProvider(queryRunner.getPlannerContext().getMetadata(), session)), + tableStatsProvider.orElseGet(() -> new CachingTableStatsProvider(queryRunner.getPlannerContext().getMetadata(), session, () -> false)), runtimeInfoProvider)); checkState(statsEstimate.isPresent(), "Expected stats estimates to be present"); statisticsAssertionConsumer.accept(PlanNodeStatsAssertion.assertThat(statsEstimate.get())); diff --git a/core/trino-main/src/test/java/io/trino/cost/TestCostCalculator.java b/core/trino-main/src/test/java/io/trino/cost/TestCostCalculator.java index 1526c6491023..7e9fc4d32032 100644 --- a/core/trino-main/src/test/java/io/trino/cost/TestCostCalculator.java +++ b/core/trino-main/src/test/java/io/trino/cost/TestCostCalculator.java @@ -549,7 +549,7 @@ private CostAssertionBuilder assertCostFragmentedPlan( Map costs, Map stats) { - StatsProvider statsProvider = new CachingStatsProvider(statsCalculator(stats), session, new CachingTableStatsProvider(planTester.getPlannerContext().getMetadata(), session)); + StatsProvider statsProvider = new CachingStatsProvider(statsCalculator(stats), session, new CachingTableStatsProvider(planTester.getPlannerContext().getMetadata(), session, () -> false)); CostProvider costProvider = new TestingCostProvider(costs, costCalculatorUsingExchanges, statsProvider, session); SubPlan subPlan = fragment(new Plan(node, StatsAndCosts.create(node, statsProvider, costProvider))); return new CostAssertionBuilder(subPlan.getFragment().getStatsAndCosts().getCosts().getOrDefault(node.getId(), PlanCostEstimate.unknown())); @@ -658,14 +658,14 @@ private PlanCostEstimate calculateCost( private PlanCostEstimate calculateCost(PlanNode node, CostCalculator costCalculator, StatsCalculator statsCalculator) { - StatsProvider statsProvider = new CachingStatsProvider(statsCalculator, session, new CachingTableStatsProvider(planTester.getPlannerContext().getMetadata(), session)); + StatsProvider statsProvider = new CachingStatsProvider(statsCalculator, session, new CachingTableStatsProvider(planTester.getPlannerContext().getMetadata(), session, () -> false)); CostProvider costProvider = new CachingCostProvider(costCalculator, statsProvider, Optional.empty(), session); return costProvider.getCost(node); } private PlanCostEstimate calculateCostFragmentedPlan(PlanNode node, StatsCalculator statsCalculator) { - StatsProvider statsProvider = new CachingStatsProvider(statsCalculator, session, new CachingTableStatsProvider(planTester.getPlannerContext().getMetadata(), session)); + StatsProvider statsProvider = new CachingStatsProvider(statsCalculator, session, new CachingTableStatsProvider(planTester.getPlannerContext().getMetadata(), session, () -> false)); CostProvider costProvider = new CachingCostProvider(costCalculatorUsingExchanges, statsProvider, Optional.empty(), session); SubPlan subPlan = fragment(new Plan(node, StatsAndCosts.create(node, statsProvider, costProvider))); return subPlan.getFragment().getStatsAndCosts().getCosts().getOrDefault(node.getId(), PlanCostEstimate.unknown()); diff --git a/core/trino-main/src/test/java/io/trino/metadata/TestMetadataManager.java b/core/trino-main/src/test/java/io/trino/metadata/TestMetadataManager.java index 44eb9a01a5f2..fc3d922260ef 100644 --- a/core/trino-main/src/test/java/io/trino/metadata/TestMetadataManager.java +++ b/core/trino-main/src/test/java/io/trino/metadata/TestMetadataManager.java @@ -22,7 +22,6 @@ import io.trino.spi.type.TypeManager; import io.trino.spi.type.TypeOperators; import io.trino.sql.parser.SqlParser; -import io.trino.testing.NotImplementedQueryManager; import io.trino.transaction.TransactionManager; import io.trino.type.BlockTypeOperators; @@ -112,8 +111,7 @@ public MetadataManager build() globalFunctionCatalog, languageFunctionManager, tableFunctionRegistry, - typeManager, - new NotImplementedQueryManager()); + typeManager); } } diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/assertions/PlanAssert.java b/core/trino-main/src/test/java/io/trino/sql/planner/assertions/PlanAssert.java index c4b6f540accc..c842891781ed 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/assertions/PlanAssert.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/assertions/PlanAssert.java @@ -45,7 +45,7 @@ public static void assertPlan(Session session, Metadata metadata, FunctionManage public static void assertPlan(Session session, Metadata metadata, FunctionManager functionManager, StatsCalculator statsCalculator, Plan actual, Lookup lookup, PlanMatchPattern pattern) { - StatsProvider statsProvider = new CachingStatsProvider(statsCalculator, session, new CachingTableStatsProvider(metadata, session)); + StatsProvider statsProvider = new CachingStatsProvider(statsCalculator, session, new CachingTableStatsProvider(metadata, session, () -> false)); assertPlan(session, metadata, functionManager, statsProvider, actual, lookup, pattern); } diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/assertions/PlanFragmentMatcher.java b/core/trino-main/src/test/java/io/trino/sql/planner/assertions/PlanFragmentMatcher.java index 2282da31d697..34c0d25f6c6b 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/assertions/PlanFragmentMatcher.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/assertions/PlanFragmentMatcher.java @@ -61,7 +61,7 @@ public boolean matches(PlanFragment fragment, StatsCalculator statsCalculator, S return false; } if (planPattern.isPresent()) { - StatsProvider statsProvider = new CachingStatsProvider(statsCalculator, session, new CachingTableStatsProvider(metadata, session)); + StatsProvider statsProvider = new CachingStatsProvider(statsCalculator, session, new CachingTableStatsProvider(metadata, session, () -> false)); MatchResult matches = fragment.getRoot().accept(new PlanMatchingVisitor(session, metadata, statsProvider, noLookup()), planPattern.get()); if (!matches.isMatch()) { return false; diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestJoinEnumerator.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestJoinEnumerator.java index 32b8277b58e3..ef3a8d26e204 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestJoinEnumerator.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/TestJoinEnumerator.java @@ -122,7 +122,7 @@ private Rule.Context createContext() Optional.empty(), noLookup(), planTester.getDefaultSession(), - new CachingTableStatsProvider(planTester.getPlannerContext().getMetadata(), planTester.getDefaultSession()), + new CachingTableStatsProvider(planTester.getPlannerContext().getMetadata(), planTester.getDefaultSession(), () -> false), RuntimeInfoProvider.noImplementation()); CachingCostProvider costProvider = new CachingCostProvider( planTester.getCostCalculator(), diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/test/RuleAssert.java b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/test/RuleAssert.java index ee5cb05ed782..3214ae4a6971 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/test/RuleAssert.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/iterative/rule/test/RuleAssert.java @@ -178,14 +178,14 @@ private static RuleApplication applyRule(Rule rule, PlanNode planNode, Ru private String formatPlan(PlanNode plan) { - StatsProvider statsProvider = new CachingStatsProvider(statsCalculator, session, new CachingTableStatsProvider(planTester.getPlannerContext().getMetadata(), session)); + StatsProvider statsProvider = new CachingStatsProvider(statsCalculator, session, new CachingTableStatsProvider(planTester.getPlannerContext().getMetadata(), session, () -> false)); CostProvider costProvider = new CachingCostProvider(planTester.getCostCalculator(), statsProvider, session); return textLogicalPlan(plan, planTester.getPlannerContext().getMetadata(), planTester.getPlannerContext().getFunctionManager(), StatsAndCosts.create(plan, statsProvider, costProvider), session, 2, false); } private Rule.Context ruleContext(StatsCalculator statsCalculator, CostCalculator costCalculator, SymbolAllocator symbolAllocator, Memo memo, Lookup lookup, Session session) { - StatsProvider statsProvider = new CachingStatsProvider(statsCalculator, Optional.of(memo), lookup, session, new CachingTableStatsProvider(planTester.getPlannerContext().getMetadata(), session), RuntimeInfoProvider.noImplementation()); + StatsProvider statsProvider = new CachingStatsProvider(statsCalculator, Optional.of(memo), lookup, session, new CachingTableStatsProvider(planTester.getPlannerContext().getMetadata(), session, () -> false), RuntimeInfoProvider.noImplementation()); CostProvider costProvider = new CachingCostProvider(costCalculator, statsProvider, Optional.of(memo), session); return new Rule.Context() diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/optimizations/TestRemoveUnsupportedDynamicFilters.java b/core/trino-main/src/test/java/io/trino/sql/planner/optimizations/TestRemoveUnsupportedDynamicFilters.java index 5d52c3cf9bee..caf4b0645b6d 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/optimizations/TestRemoveUnsupportedDynamicFilters.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/optimizations/TestRemoveUnsupportedDynamicFilters.java @@ -477,7 +477,7 @@ private PlanNode removeUnsupportedDynamicFilters(PlanNode root) new PlanNodeIdAllocator(), WarningCollector.NOOP, createPlanOptimizersStatsCollector(), - new CachingTableStatsProvider(metadata, session), + new CachingTableStatsProvider(metadata, session, () -> false), RuntimeInfoProvider.noImplementation())); new DynamicFiltersChecker().validate(rewrittenPlan, session, diff --git a/core/trino-main/src/test/java/io/trino/sql/planner/optimizations/TestUnaliasSymbolReferences.java b/core/trino-main/src/test/java/io/trino/sql/planner/optimizations/TestUnaliasSymbolReferences.java index 9fb21da36d75..a5f77c6ccf41 100644 --- a/core/trino-main/src/test/java/io/trino/sql/planner/optimizations/TestUnaliasSymbolReferences.java +++ b/core/trino-main/src/test/java/io/trino/sql/planner/optimizations/TestUnaliasSymbolReferences.java @@ -159,7 +159,7 @@ private void assertOptimizedPlan(PlanOptimizer optimizer, PlanCreator planCreato idAllocator, WarningCollector.NOOP, createPlanOptimizersStatsCollector(), - new CachingTableStatsProvider(metadata, session), + new CachingTableStatsProvider(metadata, session, () -> false), RuntimeInfoProvider.noImplementation())); Plan actual = new Plan(optimized, StatsAndCosts.empty());