diff --git a/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java b/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java index 92f8ec7cb336..a352ca54e060 100644 --- a/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java +++ b/core/src/main/java/org/apache/calcite/rel/rel2sql/RelToSqlConverter.java @@ -75,6 +75,7 @@ import org.apache.calcite.sql.SqlMerge; import org.apache.calcite.sql.SqlNode; import org.apache.calcite.sql.SqlNodeList; +import org.apache.calcite.sql.SqlOperator; import org.apache.calcite.sql.SqlSampleSpec; import org.apache.calcite.sql.SqlSelect; import org.apache.calcite.sql.SqlTableRef; @@ -1272,8 +1273,9 @@ private static SqlCall as(SqlNode e, String alias) { public Result visit(Uncollect e) { final Result x = visitInput(e, 0); - final SqlNode unnestNode = - SqlStdOperatorTable.UNNEST.createCall(POS, x.asStatement()); + final SqlOperator operator = + e.withOrdinality ? SqlStdOperatorTable.UNNEST_WITH_ORDINALITY : SqlStdOperatorTable.UNNEST; + final SqlNode unnestNode = operator.createCall(POS, x.asStatement()); final List operands = createAsFullOperands(e.getRowType(), unnestNode, requireNonNull(x.neededAlias, diff --git a/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java b/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java index e8632f7a80d5..739153345b11 100644 --- a/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java +++ b/core/src/test/java/org/apache/calcite/rel/rel2sql/RelToSqlConverterTest.java @@ -6376,6 +6376,31 @@ private void checkLiteral2(String expression, String expected) { sql(sql).ok(expected); } + /** Test case for + * [CALCITE-6231] + * JDBC adapter generates "UNNEST" when it should generate "UNNEST ... WITH ORDINALITY" . + */ + @Test void testUncollectExplicitAliasWithOrd() { + final String sql = "select did + 1\n" + + "from unnest(select collect(\"department_id\") as deptid \n" + + "from \"department\") with ordinality as t(did, pos)"; + + final String expected = "SELECT \"DEPTID\" + 1\n" + + "FROM UNNEST (SELECT COLLECT(\"department_id\") AS \"DEPTID\"\n" + + "FROM \"foodmart\".\"department\") WITH ORDINALITY AS \"t0\" (\"DEPTID\", \"ORDINALITY\")"; + sql(sql).ok(expected); + } + + @Test void testUncollectImplicitAliasWithOrd() { + final String sql = "select did + 1\n" + + "from unnest(select collect(\"department_id\") \n" + + "from \"department\") with ordinality as t(did, pos)"; + + final String expected = "SELECT \"col_0\" + 1\n" + + "FROM UNNEST (SELECT COLLECT(\"department_id\")\n" + + "FROM \"foodmart\".\"department\") WITH ORDINALITY AS \"t0\" (\"col_0\", \"ORDINALITY\")"; + sql(sql).ok(expected); + } @Test void testWithinGroup1() { final String query = "select \"product_class_id\", collect(\"net_weight\") "