Weihua Zhang created CALCITE-7583:
-------------------------------------

             Summary:  UNNEST with multiple array arguments returns wrong result
                 Key: CALCITE-7583
                 URL: https://issues.apache.org/jira/browse/CALCITE-7583
             Project: Calcite
          Issue Type: Bug
            Reporter: Weihua Zhang


core/src/test/java/org/apache/calcite/test/JdbcTest.java
{code:java}
  @Test void testUnnestArrayScalarArray() {
    CalciteAssert.hr()
        .query("select d.\"name\", e.*\n"
            + "from \"hr\".\"depts\" as d,\n"
            + " UNNEST(d.\"employees\", array[1, 2]) as e")
        .returnsUnordered(
            "name=HR; empid=200; deptno=20; name0=Eric; salary=8000.0; 
commission=500; EXPR$1=1",
            "name=HR; empid=200; deptno=20; name0=Eric; salary=8000.0; 
commission=500; EXPR$1=2",
            "name=Sales; empid=100; deptno=10; name0=Bill; salary=10000.0; 
commission=1000; EXPR$1=1",
            "name=Sales; empid=100; deptno=10; name0=Bill; salary=10000.0; 
commission=1000; EXPR$1=2",
            "name=Sales; empid=150; deptno=10; name0=Sebastian; salary=7000.0; 
commission=null; EXPR$1=1",
            "name=Sales; empid=150; deptno=10; name0=Sebastian; salary=7000.0; 
commission=null; EXPR$1=2");
  }
/*
   name    | empid | deptno |   name    | salary | commission | unnest 
-----------+-------+--------+-----------+--------+------------+--------
 Sales     |   100 |     10 | Bill      |  10000 |       1000 |      1
 Sales     |   150 |     10 | Sebastian |   7000 |            |      2
 Marketing |       |        |           |        |            |      1
 Marketing |       |        |           |        |            |      2
 HR        |   200 |     20 | Eric      |   8000 |        500 |      1
 HR        |       |        |           |        |            |      2
(6 rows)
*/

  @Test void testUnnestArrayScalarArrayAliased() {
    CalciteAssert.hr()
        .query("select d.\"name\", e.*\n"
            + "from \"hr\".\"depts\" as d,\n"
            + " UNNEST(d.\"employees\", array[1, 2]) as e (ei, d, n, s, c, i)\n"
            + "where ei + i > 151")
        .returnsUnordered(
            "name=HR; EI=200; D=20; N=Eric; S=8000.0; C=500; I=1",
            "name=HR; EI=200; D=20; N=Eric; S=8000.0; C=500; I=2",
            "name=Sales; EI=150; D=10; N=Sebastian; S=7000.0; C=null; I=2");
  }
/*
 name  | ei  | d  |     n     |  s   |  c  | i 
-------+-----+----+-----------+------+-----+---
 Sales | 150 | 10 | Sebastian | 7000 |     | 2
 HR    | 200 | 20 | Eric      | 8000 | 500 | 1
(2 rows)
*/
  @Test void testUnnestArrayScalarArrayWithOrdinal() {
    CalciteAssert.hr()
        .query("select d.\"name\", e.*\n"
            + "from \"hr\".\"depts\" as d,\n"
            + " UNNEST(d.\"employees\", array[1, 2]) with ordinality as e (ei, 
d, n, s, c, i, o)\n"
            + "where ei + i > 151")
        .returnsUnordered(
            "name=HR; EI=200; D=20; N=Eric; S=8000.0; C=500; I=1; O=1",
            "name=HR; EI=200; D=20; N=Eric; S=8000.0; C=500; I=2; O=2",
            "name=Sales; EI=150; D=10; N=Sebastian; S=7000.0; C=null; I=2; 
O=4");
  }
/*
 name  | ei  | d  |     n     |  s   |  c  | i | o 
-------+-----+----+-----------+------+-----+---+---
 Sales | 150 | 10 | Sebastian | 7000 |     | 2 | 2
 HR    | 200 | 20 | Eric      | 8000 | 500 | 1 | 1
(2 rows)
*/

@Test void testUnnestItemsInMapWithNoAliasAndAdditionalArgument()
      throws SQLException {
    Connection connection = DriverManager.getConnection("jdbc:calcite:");
    final String sql =
        "select * from unnest(MAP['a', 1, 'b', 2], array[5, 6, 7])";
    ResultSet resultSet = connection.createStatement().executeQuery(sql);

    List<String> map = FlatLists.of("KEY=a; VALUE=1", "KEY=b; VALUE=2");
    List<String> array = FlatLists.of(" EXPR$1=5", " EXPR$1=6", " EXPR$1=7");

    final StringBuilder b = new StringBuilder();
    for (List<String> row : Linq4j.product(FlatLists.of(map, array))) {
      b.append(row.get(0)).append(";").append(row.get(1)).append("\n");
    }
    final String expected = b.toString();

    assertThat(CalciteAssert.toString(resultSet), is(expected));
    connection.close();
  }

// right res:
// expected = "KEY=a; VALUE=1; EXPR$1=5\n"
//        + "KEY=b; VALUE=2; EXPR$1=6\n"
//        + "KEY=null; VALUE=null; EXPR$1=7\n";
{code}


ref: https://onecompiler.com/postgresql/44rcd9y73



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

Reply via email to