Skip to content

Commit 8b50e55

Browse files
committed
Always output left side join key for inner join
1 parent f419d2f commit 8b50e55

File tree

2 files changed

+24
-2
lines changed

2 files changed

+24
-2
lines changed

presto-main-base/src/main/java/com/facebook/presto/sql/planner/optimizations/UnaliasSymbolReferences.java

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -591,18 +591,26 @@ public PlanNode visitJoin(JoinNode node, RewriteContext<Void> context)
591591
if (node.getType().equals(INNER)) {
592592
canonicalCriteria.stream()
593593
.filter(clause -> clause.getLeft().getType().equals(clause.getRight().getType()) && clause.getLeft().getType().equalValuesAreIdentical())
594-
.filter(clause -> node.getOutputVariables().contains(clause.getLeft()))
594+
.filter(clause -> node.getOutputVariables().contains(clause.getRight()))
595595
.forEach(clause -> map(clause.getRight(), clause.getLeft()));
596596
}
597597

598+
List<VariableReferenceExpression> canonicalizedOutput = canonicalizeAndDistinct(node.getOutputVariables());
599+
if (canonicalCriteria.stream().map(x -> x.getRight().getName()).anyMatch(mapping::containsKey)) {
600+
canonicalizedOutput = ImmutableList.<VariableReferenceExpression>builder()
601+
.addAll(canonicalizedOutput.stream().filter(left.getOutputVariables()::contains).collect(Collectors.toList()))
602+
.addAll(canonicalizedOutput.stream().filter(right.getOutputVariables()::contains).collect(Collectors.toList()))
603+
.build();
604+
}
605+
598606
return new JoinNode(
599607
node.getSourceLocation(),
600608
node.getId(),
601609
node.getType(),
602610
left,
603611
right,
604612
canonicalCriteria,
605-
canonicalizeAndDistinct(node.getOutputVariables()),
613+
canonicalizedOutput,
606614
canonicalFilter,
607615
canonicalLeftHashVariable,
608616
canonicalRightHashVariable,

presto-main-base/src/test/java/com/facebook/presto/sql/planner/optimizations/TestUnaliasSymbolReferences.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,15 @@
1515

1616
import com.facebook.presto.sql.planner.assertions.BasePlanTest;
1717
import com.google.common.collect.ImmutableList;
18+
import com.google.common.collect.ImmutableMap;
1819
import org.testng.annotations.Test;
1920

2021
import static com.facebook.presto.spi.plan.JoinType.INNER;
2122
import static com.facebook.presto.sql.planner.assertions.PlanMatchPattern.anyTree;
2223
import static com.facebook.presto.sql.planner.assertions.PlanMatchPattern.equiJoinClause;
2324
import static com.facebook.presto.sql.planner.assertions.PlanMatchPattern.join;
25+
import static com.facebook.presto.sql.planner.assertions.PlanMatchPattern.output;
26+
import static com.facebook.presto.sql.planner.assertions.PlanMatchPattern.tableScan;
2427
import static com.facebook.presto.sql.planner.assertions.PlanMatchPattern.values;
2528

2629
public class TestUnaliasSymbolReferences
@@ -68,4 +71,15 @@ public void testIdenticalValuesCollapseAssignments()
6871
.withNumberOfOutputColumns(1)
6972
.withExactOutputs("LEFT_BAR")));
7073
}
74+
75+
@Test
76+
public void testJoinKeyOutput()
77+
{
78+
assertPlan("select o.orderkey, l.quantity from lineitem l join orders o on l.orderkey=o.orderkey",
79+
output(
80+
ImmutableList.of("orderkey", "quantity"),
81+
join(INNER, ImmutableList.of(equiJoinClause("orderkey", "orderkey_0")),
82+
anyTree(tableScan("lineitem", ImmutableMap.of("orderkey", "orderkey", "quantity", "quantity"))),
83+
anyTree(tableScan("orders", ImmutableMap.of("orderkey_0", "orderkey"))))));
84+
}
7185
}

0 commit comments

Comments
 (0)