[
https://issues.apache.org/jira/browse/CALCITE-6837?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
]
Mihai Budiu resolved CALCITE-6837.
----------------------------------
Fix Version/s: 1.39.0
Resolution: Fixed
Fixed in
https://github.com/apache/calcite/commit/4ee2e412d5a22afb85e5284d71057be7bbde4373
Thank you for the fix [~nobigo]
> 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
> Labels: pull-request-available
> Fix For: 1.39.0
>
>
> 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)