zzwqqq commented on code in PR #5385:
URL: https://github.com/apache/calcite/pull/5385#discussion_r4454226861
##########
core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java:
##########
@@ -464,9 +497,48 @@ public RelNode removeCorrelationViaRule(RelNode root) {
* {@link org.apache.calcite.rel.core.Correlate}s might be removable in such
way).
*/
public RelNode removeCorrelationViaRule(RelNode root, RuleSet ruleSet) {
+ root = prepareCorrelates(root);
return applyHepProgram(root, ruleSetToHepProgram(ruleSet));
}
+ /** Removes unused RHS computations before matching rules or building frames.
+ * The checked input must also be the input used by the rewrite.
+ */
+ private RelNode prepareCorrelates(RelNode root) {
+ final RelNode prepared = root.accept(new RelHomogeneousShuttle() {
+ @Override public RelNode visit(RelNode other) {
+ final RelNode rel = super.visit(other);
+ if (!(rel instanceof Correlate)) {
+ return rel;
+ }
+ final Correlate correlate = (Correlate) rel;
+ RelNode right = correlate.getRight();
+ if (!isDeterministic(right)) {
+ final RelBuilder trimBuilder =
relBuilderFactory().create(right.getCluster(), null);
+ final RelNode trimmed = new RelFieldTrimmer(null,
trimBuilder).trim(right);
+ if (isDeterministic(trimmed)) {
+ right = trimmed;
+ }
+ }
+ if (right == ((Correlate) other).getRight()) {
+ return rel;
+ }
+ // Trimming can also remove references to the correlation variable.
+ final ImmutableBitSet requiredColumns =
Review Comment:
Thanks, I've moved this into `RelFieldTrimmer`. It trims the right input
first, updates the required correlation columns, then trims the left.
##########
core/src/main/java/org/apache/calcite/sql2rel/RelDecorrelator.java:
##########
@@ -1490,10 +1571,20 @@ private static boolean
isNonNegativeIntegralLiteral(@Nullable RexNode node) {
requireNonNull(mapNewInputToOutputs.get(newInput),
() -> "mapNewInputToOutputs.get(" + newInput + ")");
- RelNode distinct = relBuilder.push(newInput)
+ RelNode projected = relBuilder.push(newInput)
.project(relBuilder.fields(positions))
- .distinct()
.build();
+ if (!isDeterministic(projected)) {
+ // Only values and row-producing operations needed by the parameter
+ // domain are repeated. Unused volatile projections need not prevent
Review Comment:
Yes, I meant "non-deterministic". I've corrected the wording.
--
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.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]