Julian Hyde created CALCITE-6837:
------------------------------------
Summary: 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
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)'.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)