[ 
https://issues.apache.org/jira/browse/CALCITE-6837?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17929142#comment-17929142
 ] 

xiong duan commented on CALCITE-6837:
-------------------------------------

This issue is caused by the ProjectWindowTranspose Rule, which prunes all 
output columns of the Window's Input RelNode during the rule conversion process.
If there are no output columns, the SQL generated by JdbcToEnumerableConverter 
becomes' SELECT FROM table ', which is not a valid SQL.

So I want to introduce constant columns when pruning all columns in this plan 
to solve this problem. Do you have any other better suggestions?

> 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
>            Assignee: xiong duan
>            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