[ 
https://issues.apache.org/jira/browse/CALCITE-6837?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Julian Hyde updated CALCITE-6837:
---------------------------------
    Description: 
If a query uses the {{ROW_NUMBER}} window aggregate function in Enumerable 
convention, Java code is generated that does not compile. The following patch 
is a test case.

{noformat}
diff --git a/core/src/test/java/org/apache/calcite/test/JdbcTest.java 
b/core/src/test/java/org/apache/calcite/test/JdbcTest.java
index 68cd66114..1ef38e874 100644
--- a/core/src/test/java/org/apache/calcite/test/JdbcTest.java
+++ b/core/src/test/java/org/apache/calcite/test/JdbcTest.java
@@ -1296,6 +1296,13 @@ private void checkResultSetMetaData(Connection 
connection, String sql)
             + "c0=1998\n");
   }
 
+  @Test void testRowNumber() {
+    CalciteAssert.that()
+        .with(CalciteAssert.Config.JDBC_SCOTT)
+        .query("select row_number() over () from dept")
+        .returnsUnordered("1", "2");
+  }
+
   /** Test case for
    * <a 
href="https://issues.apache.org/jira/browse/CALCITE-2894";>[CALCITE-2894]
    * NullPointerException thrown by RelMdPercentageOriginalRows when explaining
{noformat}

Gives the following error:
{noformat}
java.sql.SQLException: Error while executing SQL "select row_number() over () 
from dept": Error while compiling generated Java code:
public org.apache.calcite.linq4j.Enumerable bind(final 
org.apache.calcite.DataContext root) {
  final org.apache.calcite.runtime.ResultSetEnumerable enumerable = 
org.apache.calcite.runtime.ResultSetEnumerable.of((javax.sql.DataSource) 
root.getRootSchema().getSubSchema("JDBC_SCOTT").unwrap(javax.sql.DataSource.class),
 "SELECT\nFROM \"SCOTT\".\"DEPT\"", new 
org.apache.calcite.linq4j.function.Function1() {
    public org.apache.calcite.linq4j.function.Function0 apply(final 
java.sql.ResultSet resultSet) {
      return new org.apache.calcite.linq4j.function.Function0() {
          public Object apply() {
            try {
              return new Object[0];
            } catch (java.sql.SQLException e) {
              throw new RuntimeException(
                e);
            }
          }
        }
      ;
    }
    public Object apply(final Object resultSet) {
      return apply(
        (java.sql.ResultSet) resultSet);
    }
  }
  );
  enumerable.setTimeout(root);
  int prevStart;
  int prevEnd;
  final java.util.Comparator comparator = new java.util.Comparator(){
    public int compare(org.apache.calcite.runtime.FlatLists.ComparableList v0, 
org.apache.calcite.runtime.FlatLists.ComparableList v1) {
      int c;
      return 0;
    }

    public int compare(Object o0, Object o1) {
      return this.compare((org.apache.calcite.runtime.FlatLists.ComparableList) 
o0, (org.apache.calcite.runtime.FlatLists.ComparableList) o1);
    }

  };
  final java.util.List _tempList = (java.util.List) enumerable.into(new 
java.util.ArrayList());
  final java.util.Iterator iterator = 
org.apache.calcite.runtime.SortedMultiMap.singletonArrayIterator(comparator, 
_tempList);
  final java.util.ArrayList _list = new java.util.ArrayList(
    _tempList.size());
  long a0w0 = 0L;
  while (iterator.hasNext()) {
    final Object[] _rows = (Object[]) iterator.next();
    prevStart = -1;
    prevEnd = 2147483647;
    for (int i = 0; i < _rows.length; (++i)) {
      if (i != prevEnd) {
        int actualStart = i < prevEnd ? 0 : prevEnd + 1;
        prevEnd = i;
        a0w0 = 
((Number)org.apache.calcite.linq4j.tree.Primitive.of(long.class).numberValueRoundDown((i
 - 0 + 1))).longValue();
      }
      _list.add(a0w0);
    }
  }
  _tempList.clear();
  return org.apache.calcite.linq4j.Linq4j.asEnumerable(_list);
}


public Class getElementType() {
  return long.class;
}
{noformat}

The same error occurs if you replace 'over ()' with 'over (order by 1 nulls 
last)'.

When this bug is fixed, enable code in 
{{RelToSqlConverterTest.testNoNeedRewriteOrderByConstantsForOver}}.

  was:
If a query uses the {{ROW_NUMBER}} window aggregate function in Enumerable 
convention, Java code is generated that does not compile. The following patch 
is a test case.

{noformat}
diff --git a/core/src/test/java/org/apache/calcite/test/JdbcTest.java 
b/core/src/test/java/org/apache/calcite/test/JdbcTest.java
index 68cd66114..1ef38e874 100644
--- a/core/src/test/java/org/apache/calcite/test/JdbcTest.java
+++ b/core/src/test/java/org/apache/calcite/test/JdbcTest.java
@@ -1296,6 +1296,13 @@ private void checkResultSetMetaData(Connection 
connection, String sql)
             + "c0=1998\n");
   }
 
+  @Test void testRowNumber() {
+    CalciteAssert.that()
+        .with(CalciteAssert.Config.JDBC_SCOTT)
+        .query("select row_number() over () from dept")
+        .returnsUnordered("1", "2");
+  }
+
   /** Test case for
    * <a 
href="https://issues.apache.org/jira/browse/CALCITE-2894";>[CALCITE-2894]
    * NullPointerException thrown by RelMdPercentageOriginalRows when explaining
{noformat}

Gives the following error:
{noformat}
java.sql.SQLException: Error while executing SQL "select row_number() over () 
from dept": Error while compiling generated Java code:
public org.apache.calcite.linq4j.Enumerable bind(final 
org.apache.calcite.DataContext root) {
  final org.apache.calcite.runtime.ResultSetEnumerable enumerable = 
org.apache.calcite.runtime.ResultSetEnumerable.of((javax.sql.DataSource) 
root.getRootSchema().getSubSchema("JDBC_SCOTT").unwrap(javax.sql.DataSource.class),
 "SELECT\nFROM \"SCOTT\".\"DEPT\"", new 
org.apache.calcite.linq4j.function.Function1() {
    public org.apache.calcite.linq4j.function.Function0 apply(final 
java.sql.ResultSet resultSet) {
      return new org.apache.calcite.linq4j.function.Function0() {
          public Object apply() {
            try {
              return new Object[0];
            } catch (java.sql.SQLException e) {
              throw new RuntimeException(
                e);
            }
          }
        }
      ;
    }
    public Object apply(final Object resultSet) {
      return apply(
        (java.sql.ResultSet) resultSet);
    }
  }
  );
  enumerable.setTimeout(root);
  int prevStart;
  int prevEnd;
  final java.util.Comparator comparator = new java.util.Comparator(){
    public int compare(org.apache.calcite.runtime.FlatLists.ComparableList v0, 
org.apache.calcite.runtime.FlatLists.ComparableList v1) {
      int c;
      return 0;
    }

    public int compare(Object o0, Object o1) {
      return this.compare((org.apache.calcite.runtime.FlatLists.ComparableList) 
o0, (org.apache.calcite.runtime.FlatLists.ComparableList) o1);
    }

  };
  final java.util.List _tempList = (java.util.List) enumerable.into(new 
java.util.ArrayList());
  final java.util.Iterator iterator = 
org.apache.calcite.runtime.SortedMultiMap.singletonArrayIterator(comparator, 
_tempList);
  final java.util.ArrayList _list = new java.util.ArrayList(
    _tempList.size());
  long a0w0 = 0L;
  while (iterator.hasNext()) {
    final Object[] _rows = (Object[]) iterator.next();
    prevStart = -1;
    prevEnd = 2147483647;
    for (int i = 0; i < _rows.length; (++i)) {
      if (i != prevEnd) {
        int actualStart = i < prevEnd ? 0 : prevEnd + 1;
        prevEnd = i;
        a0w0 = 
((Number)org.apache.calcite.linq4j.tree.Primitive.of(long.class).numberValueRoundDown((i
 - 0 + 1))).longValue();
      }
      _list.add(a0w0);
    }
  }
  _tempList.clear();
  return org.apache.calcite.linq4j.Linq4j.asEnumerable(_list);
}


public Class getElementType() {
  return long.class;
}
{noformat}

The same error occurs if you replace 'over ()' with 'over (order by 1 nulls 
last)'.


> Invalid code generated for ROW_NUMBER function in Enumerable convention
> -----------------------------------------------------------------------
>
>                 Key: CALCITE-6837
>                 URL: https://issues.apache.org/jira/browse/CALCITE-6837
>             Project: Calcite
>          Issue Type: Bug
>            Reporter: Julian Hyde
>            Priority: Major
>
> If a query uses the {{ROW_NUMBER}} window aggregate function in Enumerable 
> convention, Java code is generated that does not compile. The following patch 
> is a test case.
> {noformat}
> diff --git a/core/src/test/java/org/apache/calcite/test/JdbcTest.java 
> b/core/src/test/java/org/apache/calcite/test/JdbcTest.java
> index 68cd66114..1ef38e874 100644
> --- a/core/src/test/java/org/apache/calcite/test/JdbcTest.java
> +++ b/core/src/test/java/org/apache/calcite/test/JdbcTest.java
> @@ -1296,6 +1296,13 @@ private void checkResultSetMetaData(Connection 
> connection, String sql)
>              + "c0=1998\n");
>    }
>  
> +  @Test void testRowNumber() {
> +    CalciteAssert.that()
> +        .with(CalciteAssert.Config.JDBC_SCOTT)
> +        .query("select row_number() over () from dept")
> +        .returnsUnordered("1", "2");
> +  }
> +
>    /** Test case for
>     * <a 
> href="https://issues.apache.org/jira/browse/CALCITE-2894";>[CALCITE-2894]
>     * NullPointerException thrown by RelMdPercentageOriginalRows when 
> explaining
> {noformat}
> Gives the following error:
> {noformat}
> java.sql.SQLException: Error while executing SQL "select row_number() over () 
> from dept": Error while compiling generated Java code:
> public org.apache.calcite.linq4j.Enumerable bind(final 
> org.apache.calcite.DataContext root) {
>   final org.apache.calcite.runtime.ResultSetEnumerable enumerable = 
> org.apache.calcite.runtime.ResultSetEnumerable.of((javax.sql.DataSource) 
> root.getRootSchema().getSubSchema("JDBC_SCOTT").unwrap(javax.sql.DataSource.class),
>  "SELECT\nFROM \"SCOTT\".\"DEPT\"", new 
> org.apache.calcite.linq4j.function.Function1() {
>     public org.apache.calcite.linq4j.function.Function0 apply(final 
> java.sql.ResultSet resultSet) {
>       return new org.apache.calcite.linq4j.function.Function0() {
>           public Object apply() {
>             try {
>               return new Object[0];
>             } catch (java.sql.SQLException e) {
>               throw new RuntimeException(
>                 e);
>             }
>           }
>         }
>       ;
>     }
>     public Object apply(final Object resultSet) {
>       return apply(
>         (java.sql.ResultSet) resultSet);
>     }
>   }
>   );
>   enumerable.setTimeout(root);
>   int prevStart;
>   int prevEnd;
>   final java.util.Comparator comparator = new java.util.Comparator(){
>     public int compare(org.apache.calcite.runtime.FlatLists.ComparableList 
> v0, org.apache.calcite.runtime.FlatLists.ComparableList v1) {
>       int c;
>       return 0;
>     }
>     public int compare(Object o0, Object o1) {
>       return 
> this.compare((org.apache.calcite.runtime.FlatLists.ComparableList) o0, 
> (org.apache.calcite.runtime.FlatLists.ComparableList) o1);
>     }
>   };
>   final java.util.List _tempList = (java.util.List) enumerable.into(new 
> java.util.ArrayList());
>   final java.util.Iterator iterator = 
> org.apache.calcite.runtime.SortedMultiMap.singletonArrayIterator(comparator, 
> _tempList);
>   final java.util.ArrayList _list = new java.util.ArrayList(
>     _tempList.size());
>   long a0w0 = 0L;
>   while (iterator.hasNext()) {
>     final Object[] _rows = (Object[]) iterator.next();
>     prevStart = -1;
>     prevEnd = 2147483647;
>     for (int i = 0; i < _rows.length; (++i)) {
>       if (i != prevEnd) {
>         int actualStart = i < prevEnd ? 0 : prevEnd + 1;
>         prevEnd = i;
>         a0w0 = 
> ((Number)org.apache.calcite.linq4j.tree.Primitive.of(long.class).numberValueRoundDown((i
>  - 0 + 1))).longValue();
>       }
>       _list.add(a0w0);
>     }
>   }
>   _tempList.clear();
>   return org.apache.calcite.linq4j.Linq4j.asEnumerable(_list);
> }
> public Class getElementType() {
>   return long.class;
> }
> {noformat}
> The same error occurs if you replace 'over ()' with 'over (order by 1 nulls 
> last)'.
> When this bug is fixed, enable code in 
> {{RelToSqlConverterTest.testNoNeedRewriteOrderByConstantsForOver}}.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to