diff --git a/presto-main-base/src/main/java/com/facebook/presto/sql/planner/optimizations/ApplyConnectorOptimization.java b/presto-main-base/src/main/java/com/facebook/presto/sql/planner/optimizations/ApplyConnectorOptimization.java index 71f432362db46..56c650ec7228d 100644 --- a/presto-main-base/src/main/java/com/facebook/presto/sql/planner/optimizations/ApplyConnectorOptimization.java +++ b/presto-main-base/src/main/java/com/facebook/presto/sql/planner/optimizations/ApplyConnectorOptimization.java @@ -159,13 +159,14 @@ public PlanOptimizerResult optimize(PlanNode plan, Session session, TypeProvider } optimizersWithConnectorRange.put(currentConnectors, currentGroup.build()); - ImmutableMap.Builder contextMapBuilder = ImmutableMap.builder(); - buildConnectorPlanNodeContext(plan, null, contextMapBuilder); - Map contextMap = contextMapBuilder.build(); for (Map.Entry, Set> entry : optimizersWithConnectorRange.build().entrySet()) { // keep track of changed nodes; the keys are original nodes and the values are the new nodes Map updates = new HashMap<>(); + ImmutableMap.Builder contextMapBuilder = ImmutableMap.builder(); + buildConnectorPlanNodeContext(plan, null, contextMapBuilder); + Map contextMap = contextMapBuilder.build(); + // process connector optimizers for (PlanNode node : contextMap.keySet()) { // For a subtree with root `node` to be a max closure, the following conditions must hold: diff --git a/presto-main-base/src/test/java/com/facebook/presto/sql/planner/optimizations/TestConnectorOptimization.java b/presto-main-base/src/test/java/com/facebook/presto/sql/planner/optimizations/TestConnectorOptimization.java index 3ed25119466af..2aea73d977986 100644 --- a/presto-main-base/src/test/java/com/facebook/presto/sql/planner/optimizations/TestConnectorOptimization.java +++ b/presto-main-base/src/test/java/com/facebook/presto/sql/planner/optimizations/TestConnectorOptimization.java @@ -292,6 +292,28 @@ public void testMultipleConnectorOptimization() SimpleTableScanMatcher.tableScan("cat2", "a", "b")), SimpleTableScanMatcher.tableScan("cat3", TRUE_CONSTANT)))); + plan = output( + union( + union( + tableScan("cat1", "a", "b"), + tableScan("cat2", "a", "b")), + filter(tableScan("cat1", "a", "b"), TRUE_CONSTANT)), + "a"); + + actual = optimize(plan, ImmutableMap.of( + new ConnectorId("cat1"), ImmutableSet.of(multiConnectorOptimizer12, filterPushdown()))); + + assertPlanMatch( + actual, + PlanMatchPattern.output( + PlanMatchPattern.union( + PlanMatchPattern.union( + SimpleTableScanMatcher.tableScan("cat1", TRUE_CONSTANT), + PlanMatchPattern.filter( + "true", + SimpleTableScanMatcher.tableScan("cat2", "a", "b"))), + SimpleTableScanMatcher.tableScan("cat1", TRUE_CONSTANT)))); + plan = output( union( union(