jamesstarr commented on a change in pull request #2393:
URL: https://github.com/apache/calcite/pull/2393#discussion_r613587690
##########
File path: core/src/main/java/org/apache/calcite/tools/RelBuilder.java
##########
@@ -2368,24 +2368,28 @@ public RelBuilder join(JoinRelType joinType, RexNode
condition,
}
if (correlate) {
final CorrelationId id = Iterables.getOnlyElement(variablesSet);
- final ImmutableBitSet requiredColumns =
- RelOptUtil.correlationColumns(id, right.rel);
if (!RelOptUtil.notContainsCorrelation(left.rel, id, Litmus.IGNORE)) {
throw new IllegalArgumentException("variable " + id
+ " must not be used by left input to correlation");
}
+ // Correlate does not have an ON clause.
switch (joinType) {
case LEFT:
- // Correlate does not have an ON clause.
- // For a LEFT correlate, predicate must be evaluated first.
- // For INNER, we can defer.
+ case SEMI:
+ case ANTI:
+ // For a LEFT/SEMI/ANTI, predicate must be evaluated first.
stack.push(right);
filter(condition.accept(new Shifter(left.rel, id, right.rel)));
right = stack.pop();
break;
- default:
+ case INNER:
+ // For INNER, we can defer.
postCondition = condition;
+ break;
+ default:
+ throw new IllegalArgumentException("Correlated " + joinType + " join
is not supported");
}
+ final ImmutableBitSet requiredColumns =
RelOptUtil.correlationColumns(id, right.rel);
Review comment:
I am not sure if this is place to do it, but should we detect if
correlated variables only occur in the condition and emit a normal join if that
is case?
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]