This is an automated email from the ASF dual-hosted git repository.
rubenql pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/main by this push:
new 0cea91b842 [CALCITE-5903] RelMdCollation does not define collations
for EnumerableLimit
0cea91b842 is described below
commit 0cea91b8426d46e72b572d99f6007cf12535f575
Author: rubenada <[email protected]>
AuthorDate: Mon Aug 7 15:14:32 2023 +0100
[CALCITE-5903] RelMdCollation does not define collations for EnumerableLimit
---
.../calcite/rel/metadata/RelMdCollation.java | 6 ++++
.../org/apache/calcite/test/RelMetadataTest.java | 36 ++++++++++++++++++++++
.../janino/GeneratedMetadata_CollationHandler.java | 2 ++
3 files changed, 44 insertions(+)
diff --git
a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdCollation.java
b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdCollation.java
index 815968d031..7c107d39d6 100644
--- a/core/src/main/java/org/apache/calcite/rel/metadata/RelMdCollation.java
+++ b/core/src/main/java/org/apache/calcite/rel/metadata/RelMdCollation.java
@@ -18,6 +18,7 @@ package org.apache.calcite.rel.metadata;
import org.apache.calcite.adapter.enumerable.EnumerableCorrelate;
import org.apache.calcite.adapter.enumerable.EnumerableHashJoin;
+import org.apache.calcite.adapter.enumerable.EnumerableLimit;
import org.apache.calcite.adapter.enumerable.EnumerableMergeJoin;
import org.apache.calcite.adapter.enumerable.EnumerableMergeUnion;
import org.apache.calcite.adapter.enumerable.EnumerableNestedLoopJoin;
@@ -198,6 +199,11 @@ public class RelMdCollation
join.getJoinType()));
}
+ public @Nullable ImmutableList<RelCollation> collations(EnumerableLimit rel,
+ RelMetadataQuery mq) {
+ return mq.collations(rel.getInput());
+ }
+
public @Nullable ImmutableList<RelCollation> collations(Sort sort,
RelMetadataQuery mq) {
return copyOf(
diff --git a/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
b/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
index 19c5ebc0e6..57a58a3983 100644
--- a/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelMetadataTest.java
@@ -16,6 +16,7 @@
*/
package org.apache.calcite.test;
import org.apache.calcite.adapter.enumerable.EnumerableConvention;
+import org.apache.calcite.adapter.enumerable.EnumerableLimit;
import org.apache.calcite.adapter.enumerable.EnumerableMergeJoin;
import org.apache.calcite.adapter.enumerable.EnumerableRules;
import org.apache.calcite.config.CalciteSystemProperty;
@@ -147,6 +148,7 @@ import static org.hamcrest.CoreMatchers.startsWith;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.hasToString;
+import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
@@ -1566,6 +1568,40 @@ public class RelMetadataTest {
metadataConfig.applyMetadata(rel.getCluster());
}
+ /**
+ * Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-5903">[CALCITE-5903]
+ * RelMdCollation does not define collations for EnumerableLimit</a>.
+ */
+ @Test void testCollationEnumerableLimit() {
+ final RelNode result = sql("select * from emp order by empno limit 10")
+ .withCluster(cluster -> {
+ final RelOptPlanner planner = new VolcanoPlanner();
+ planner.addRule(CoreRules.PROJECT_TO_CALC);
+ planner.addRule(EnumerableRules.ENUMERABLE_TABLE_SCAN_RULE);
+ planner.addRule(EnumerableRules.ENUMERABLE_CALC_RULE);
+ planner.addRule(EnumerableRules.ENUMERABLE_SORT_RULE);
+ planner.addRule(EnumerableRules.ENUMERABLE_LIMIT_RULE);
+ planner.addRelTraitDef(ConventionTraitDef.INSTANCE);
+ return RelOptCluster.create(planner, cluster.getRexBuilder());
+ })
+ .withRelTransform(rel -> {
+ final RelOptPlanner planner = rel.getCluster().getPlanner();
+ planner.setRoot(rel);
+ final RelTraitSet requiredOutputTraits =
+
rel.getCluster().traitSet().replace(EnumerableConvention.INSTANCE);
+ final RelNode rootRel = planner.changeTraits(rel,
requiredOutputTraits);
+ planner.setRoot(rootRel);
+ return planner.findBestExp();
+ }).toRel();
+
+ assertThat(result, instanceOf(EnumerableLimit.class));
+ final RelMetadataQuery mq = result.getCluster().getMetadataQuery();
+ final ImmutableList<RelCollation> collations = mq.collations(result);
+ assertThat(collations, notNullValue());
+ assertEquals("[[0]]", collations.toString());
+ }
+
/** Unit test for
* {@link org.apache.calcite.rel.metadata.RelMdCollation#project}
* and other helper functions for deducing collations. */
diff --git
a/core/src/test/resources/org/apache/calcite/rel/metadata/janino/GeneratedMetadata_CollationHandler.java
b/core/src/test/resources/org/apache/calcite/rel/metadata/janino/GeneratedMetadata_CollationHandler.java
index 0dec36c46a..912ce05dfe 100644
---
a/core/src/test/resources/org/apache/calcite/rel/metadata/janino/GeneratedMetadata_CollationHandler.java
+++
b/core/src/test/resources/org/apache/calcite/rel/metadata/janino/GeneratedMetadata_CollationHandler.java
@@ -64,6 +64,8 @@ public final class GeneratedMetadata_CollationHandler
return
provider0.collations((org.apache.calcite.adapter.enumerable.EnumerableCorrelate)
r, mq);
} else if (r instanceof
org.apache.calcite.adapter.enumerable.EnumerableHashJoin) {
return
provider0.collations((org.apache.calcite.adapter.enumerable.EnumerableHashJoin)
r, mq);
+ } else if (r instanceof
org.apache.calcite.adapter.enumerable.EnumerableLimit) {
+ return
provider0.collations((org.apache.calcite.adapter.enumerable.EnumerableLimit) r,
mq);
} else if (r instanceof
org.apache.calcite.adapter.enumerable.EnumerableMergeJoin) {
return
provider0.collations((org.apache.calcite.adapter.enumerable.EnumerableMergeJoin)
r, mq);
} else if (r instanceof
org.apache.calcite.adapter.enumerable.EnumerableMergeUnion) {