You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@calcite.apache.org by ru...@apache.org on 2022/11/25 09:05:40 UTC
[calcite] branch main updated: [CALCITE-5377] RelFieldTrimmer support Sort with dynamic param
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 ad77a20f28 [CALCITE-5377] RelFieldTrimmer support Sort with dynamic param
ad77a20f28 is described below
commit ad77a20f286d4b25b26e940e92b40a15acb2e333
Author: xiejiajun <ji...@foxmail.com>
AuthorDate: Sun Nov 13 14:55:20 2022 +0800
[CALCITE-5377] RelFieldTrimmer support Sort with dynamic param
---
.../java/org/apache/calcite/sql2rel/RelFieldTrimmer.java | 13 +------------
.../java/org/apache/calcite/test/SqlToRelConverterTest.java | 9 +++++++++
.../org/apache/calcite/test/SqlToRelConverterTest.xml | 13 +++++++++++++
3 files changed, 23 insertions(+), 12 deletions(-)
diff --git a/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java b/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java
index 1862725f84..f1560b7f81 100644
--- a/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java
+++ b/core/src/main/java/org/apache/calcite/sql2rel/RelFieldTrimmer.java
@@ -48,7 +48,6 @@ import org.apache.calcite.rel.type.RelDataTypeField;
import org.apache.calcite.rel.type.RelDataTypeImpl;
import org.apache.calcite.rex.RexBuilder;
import org.apache.calcite.rex.RexCorrelVariable;
-import org.apache.calcite.rex.RexDynamicParam;
import org.apache.calcite.rex.RexFieldAccess;
import org.apache.calcite.rex.RexLiteral;
import org.apache.calcite.rex.RexNode;
@@ -666,20 +665,10 @@ public class RelFieldTrimmer implements ReflectiveVisitor {
return result(sort, Mappings.createIdentity(fieldCount));
}
- // leave the Sort unchanged in case we have dynamic limits
- if (sort.offset instanceof RexDynamicParam
- || sort.fetch instanceof RexDynamicParam) {
- return result(sort, inputMapping);
- }
-
relBuilder.push(newInput);
- final int offset =
- sort.offset == null ? 0 : RexLiteral.intValue(sort.offset);
- final int fetch =
- sort.fetch == null ? -1 : RexLiteral.intValue(sort.fetch);
final ImmutableList<RexNode> fields =
relBuilder.fields(RexUtil.apply(inputMapping, collation));
- relBuilder.sortLimit(offset, fetch, fields);
+ relBuilder.sortLimit(sort.offset, sort.fetch, fields);
// The result has the same mapping as the input gave us. Sometimes we
// return fields that the consumer didn't ask for, because the filter
diff --git a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
index ad3c6cc0a5..63885e7a10 100644
--- a/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
+++ b/core/src/test/java/org/apache/calcite/test/SqlToRelConverterTest.java
@@ -2598,6 +2598,15 @@ class SqlToRelConverterTest extends SqlToRelTestBase {
sql(sql).withTrim(true).ok();
}
+ /** Test case for
+ * <a href="https://issues.apache.org/jira/browse/CALCITE-5377">[CALCITE-5377]
+ * RelFieldTrimmer support Sort with dynamic param</a>. */
+ @Test void testDynamicParameterSortWithTrim() {
+ final String sql = "select ename from "
+ + "(select * from emp order by sal limit ? offset ?) a";
+ sql(sql).withTrim(true).ok();
+ }
+
/** Test case for
* <a href="https://issues.apache.org/jira/browse/CALCITE-3183">[CALCITE-3183]
* Trimming method for Filter rel uses wrong traitSet</a>. */
diff --git a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
index bcb6066040..eb23e84764 100644
--- a/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/SqlToRelConverterTest.xml
@@ -1616,6 +1616,19 @@ LogicalProject(FAKE2=[ITEM($0, 'fake_col2')])
<![CDATA[
LogicalProject(EXPR$0=[CAST(?0):CHAR(1)])
LogicalValues(tuples=[[{ 0 }]])
+]]>
+ </Resource>
+ </TestCase>
+ <TestCase name="testDynamicParameterSortWithTrim">
+ <Resource name="sql">
+ <![CDATA[select ename from (select * from emp order by sal limit ? offset ?) a]]>
+ </Resource>
+ <Resource name="plan">
+ <![CDATA[
+LogicalProject(ENAME=[$0])
+ LogicalSort(sort0=[$1], dir0=[ASC], offset=[?1], fetch=[?0])
+ LogicalProject(ENAME=[$1], SAL=[$5])
+ LogicalTableScan(table=[[CATALOG, SALES, EMP]])
]]>
</Resource>
</TestCase>