This is an automated email from the ASF dual-hosted git repository.

mbudiu 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 4c70fc7017 [CALCITE-6746] Optimization rule ProjectWindowTranspose is 
unsound
4c70fc7017 is described below

commit 4c70fc7017f5fe02b40f8644670e9b695d84521f
Author: Mihai Budiu <[email protected]>
AuthorDate: Thu Dec 26 18:28:04 2024 -0800

    [CALCITE-6746] Optimization rule ProjectWindowTranspose is unsound
    
    Signed-off-by: Mihai Budiu <[email protected]>
---
 .../calcite/rel/rules/ProjectWindowTransposeRule.java    |  3 +++
 .../java/org/apache/calcite/test/RelOptRulesTest.java    | 16 ++++++++++++++++
 .../org/apache/calcite/test/RelOptRulesTest.xml          | 15 +++++++++++++++
 3 files changed, 34 insertions(+)

diff --git 
a/core/src/main/java/org/apache/calcite/rel/rules/ProjectWindowTransposeRule.java
 
b/core/src/main/java/org/apache/calcite/rel/rules/ProjectWindowTransposeRule.java
index 1576bda75a..b2c366f14d 100644
--- 
a/core/src/main/java/org/apache/calcite/rel/rules/ProjectWindowTransposeRule.java
+++ 
b/core/src/main/java/org/apache/calcite/rel/rules/ProjectWindowTransposeRule.java
@@ -217,6 +217,9 @@ public class ProjectWindowTransposeRule
         }
       }
 
+      group.lowerBound.accept(referenceFinder);
+      group.upperBound.accept(referenceFinder);
+
       // Reference in Order-By
       for (RelFieldCollation relFieldCollation : 
group.orderKeys.getFieldCollations()) {
         if (relFieldCollation.getFieldIndex() < windowInputColumn) {
diff --git a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java 
b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
index 8fd418224c..e7d3325263 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -346,6 +346,22 @@ class RelOptRulesTest extends RelOptTestBase {
         .check();
   }
 
+  /**
+   * Test case for <a 
href="https://issues.apache.org/jira/projects/CALCITE/issues/CALCITE-6746";>
+   * [CALCITE-6746] Optimization rule ProjectWindowTranspose is unsound</a>. */
+  @Test void testConstantWindow() {
+    final String sql = "with empsalary(dept, empno, salary, enroll_date) as "
+        + "(VALUES ('x', 10, 5200, DATE '2007-08-01'), (NULL, NULL, NULL, 
NULL))\n"
+        + "select sum(salary) "
+        + "OVER (order by enroll_date range between INTERVAL 365 DAYS 
preceding and "
+        + "INTERVAL 365 DAYS following),\n"
+        + "salary, enroll_date FROM empsalary";
+    sql(sql)
+        .withPreRule(CoreRules.PROJECT_TO_LOGICAL_PROJECT_AND_WINDOW)
+        .withRule(CoreRules.PROJECT_WINDOW_TRANSPOSE)
+        .checkUnchanged();
+  }
+
   /**
    * Test case for
    * <a 
href="https://issues.apache.org/jira/browse/CALCITE-5813";>[CALCITE-5813]
diff --git 
a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml 
b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
index 90f22fee12..1b2b895032 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -1644,6 +1644,21 @@ case when cast(ename as double) < 5 then 0.0
       <![CDATA[
 LogicalProject(T=[CASE(<(CAST(CASE(>($1, 'abc'), $1, 
null:VARCHAR(20))):DOUBLE, 5.0E0), 0.0E0:DOUBLE, CASE(IS NOT 
NULL(CAST(CASE(>($1, 'abc'), $1, null:VARCHAR(20))):DOUBLE), 
CAST(CAST(CASE(>($1, 'abc'), $1, null:VARCHAR(20))):DOUBLE):DOUBLE NOT NULL, 
1.0E0:DOUBLE))])
   LogicalTableScan(table=[[CATALOG, SALES, EMP]])
+]]>
+    </Resource>
+  </TestCase>
+  <TestCase name="testConstantWindow">
+    <Resource name="sql">
+      <![CDATA[with empsalary(dept, empno, salary, enroll_date) as (VALUES 
('x', 10, 5200, DATE '2007-08-01'), (NULL, NULL, NULL, NULL))
+select sum(salary) OVER (order by enroll_date range between INTERVAL 365 DAYS 
preceding and INTERVAL 365 DAYS following),
+salary, enroll_date FROM empsalary]]>
+    </Resource>
+    <Resource name="planBefore">
+      <![CDATA[
+LogicalProject(EXPR$0=[CASE(>($3, 0), $4, null:INTEGER)], SALARY=[$0], 
ENROLL_DATE=[$1])
+  LogicalWindow(window#0=[window(order by [1] range between $2 PRECEDING and 
$2 FOLLOWING aggs [COUNT($0), SUM($0)])])
+    LogicalProject(EXPR$2=[$2], EXPR$3=[$3], $2=[*(365, 86400000:INTERVAL 
DAY)])
+      LogicalValues(tuples=[[{ 'x', 10, 5200, 2007-08-01 }, { null, null, 
null, null }]])
 ]]>
     </Resource>
   </TestCase>

Reply via email to