This is an automated email from the ASF dual-hosted git repository.
mbudiu pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/calcite.git
The following commit(s) were added to refs/heads/main by this push:
new 7ce986fbc6 [CALCITE-6620] VALUES created by RelBuilder do not have a
homogeneous type
7ce986fbc6 is described below
commit 7ce986fbc635722f3390b81dcdfe24bbd82ddb3d
Author: Mihai Budiu <[email protected]>
AuthorDate: Tue Oct 8 15:01:40 2024 -0700
[CALCITE-6620] VALUES created by RelBuilder do not have a homogeneous type
Signed-off-by: Mihai Budiu <[email protected]>
---
.../java/org/apache/calcite/tools/RelBuilder.java | 31 ++++-
.../calcite/rel/rel2sql/RelToSqlConverterTest.java | 12 +-
.../org/apache/calcite/test/RelBuilderTest.java | 16 +++
core/src/test/resources/sql/agg.iq | 128 ++++++++++-----------
core/src/test/resources/sql/join.iq | 4 +-
core/src/test/resources/sql/outer.iq | 2 +-
core/src/test/resources/sql/winagg.iq | 4 +-
7 files changed, 121 insertions(+), 76 deletions(-)
diff --git a/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
index 4c7357da81..31c8e27d43 100644
--- a/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
+++ b/core/src/main/java/org/apache/calcite/tools/RelBuilder.java
@@ -2886,6 +2886,31 @@ public class RelBuilder {
return ((AggCallPlus) c).op().kind == SqlKind.GROUP_ID;
}
+ /** Given a list of literals and a target row type, make the literals
+ * respectively match the fields types of the row.
+ *
+ * @param rowType Type expected for values
+ * @param values A list of literals that should match the rowType */
+ private List<RexLiteral> convertLiteralTypes(
+ RelDataType rowType, List<RexLiteral> values) {
+ assert values.size() == rowType.getFieldCount()
+ : "List of literals of size " + values.size() + " does not match
expected type " + rowType;
+
+ List<RelDataTypeField> fields = rowType.getFieldList();
+ List<RexLiteral> constants = new ArrayList<>();
+
+ for (int i = 0; i < values.size(); i++) {
+ RexLiteral vi = values.get(i);
+ RelDataType type = fields.get(i).getType();
+ RexNode e = cluster.getRexBuilder().makeAbstractCast(type, vi, false);
+ RexNode simplified = simplifier.simplify(e);
+ assert simplified instanceof RexLiteral
+ : "Could not simplify expression to literal" + simplified;
+ constants.add((RexLiteral) simplified);
+ }
+ return ImmutableList.copyOf(constants);
+ }
+
private RelBuilder setOp(boolean all, SqlKind kind, int n) {
List<RelNode> inputs = new ArrayList<>();
for (int i = 0; i < n; i++) {
@@ -2917,7 +2942,11 @@ public class RelBuilder {
requireNonNull(rowType, () -> "leastRestrictive(" + inputTypes + ")");
final List<List<RexLiteral>> tuples = new ArrayList<>();
for (RelNode input : inputs) {
- tuples.addAll(((Values) input).tuples);
+ ImmutableList<ImmutableList<RexLiteral>> literals = ((Values)
input).tuples;
+ for (ImmutableList<RexLiteral> l : literals) {
+ List<RexLiteral> converted = convertLiteralTypes(rowType, l);
+ tuples.add(converted);
+ }
}
final List<List<RexLiteral>> tuples2 =
all ? tuples : Util.distinctList(tuples);
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 fd72b876b0..67fd701f22 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
@@ -7765,7 +7765,7 @@ class RelToSqlConverterTest {
final String expectedDefault = "INSERT INTO \"SCOTT\".\"DEPT\""
+ " (\"DEPTNO\", \"DNAME\", \"LOC\")\n"
+ "VALUES (1, 'Fred', 'San Francisco'),\n"
- + "(2, 'Eric', 'Washington')";
+ + "(2, 'Eric', 'Washington ')";
final String expectedDefaultX = "INSERT INTO \"SCOTT\".\"DEPT\""
+ " (\"DEPTNO\", \"DNAME\", \"LOC\")\n"
+ "SELECT 1, 'Fred', 'San Francisco'\n"
@@ -7775,7 +7775,7 @@ class RelToSqlConverterTest {
+ "FROM (VALUES (0)) AS \"t\" (\"ZERO\")";
final String expectedHive = "INSERT INTO `SCOTT`.`DEPT` (`DEPTNO`,
`DNAME`, `LOC`)\n"
+ "VALUES (1, 'Fred', 'San Francisco'),\n"
- + "(2, 'Eric', 'Washington')";
+ + "(2, 'Eric', 'Washington ')";
final String expectedHiveX = "INSERT INTO `SCOTT`.`DEPT` (`DEPTNO`,
`DNAME`, `LOC`)\n"
+ "SELECT 1, 'Fred', 'San Francisco'\n"
+ "UNION ALL\n"
@@ -7783,7 +7783,7 @@ class RelToSqlConverterTest {
final String expectedMysql = "INSERT INTO `SCOTT`.`DEPT`"
+ " (`DEPTNO`, `DNAME`, `LOC`)\n"
+ "VALUES (1, 'Fred', 'San Francisco'),\n"
- + "(2, 'Eric', 'Washington')";
+ + "(2, 'Eric', 'Washington ')";
final String expectedMysqlX = "INSERT INTO `SCOTT`.`DEPT`"
+ " (`DEPTNO`, `DNAME`, `LOC`)\n"
+ "SELECT 1, 'Fred', 'San Francisco'\n"
@@ -7792,7 +7792,7 @@ class RelToSqlConverterTest {
final String expectedOracle = "INSERT INTO \"SCOTT\".\"DEPT\""
+ " (\"DEPTNO\", \"DNAME\", \"LOC\")\n"
+ "VALUES (1, 'Fred', 'San Francisco'),\n"
- + "(2, 'Eric', 'Washington')";
+ + "(2, 'Eric', 'Washington ')";
final String expectedOracleX = "INSERT INTO \"SCOTT\".\"DEPT\""
+ " (\"DEPTNO\", \"DNAME\", \"LOC\")\n"
+ "SELECT 1, 'Fred', 'San Francisco'\n"
@@ -7803,7 +7803,7 @@ class RelToSqlConverterTest {
final String expectedMssql = "INSERT INTO [SCOTT].[DEPT]"
+ " ([DEPTNO], [DNAME], [LOC])\n"
+ "VALUES (1, 'Fred', 'San Francisco'),\n"
- + "(2, 'Eric', 'Washington')";
+ + "(2, 'Eric', 'Washington ')";
final String expectedMssqlX = "INSERT INTO [SCOTT].[DEPT]"
+ " ([DEPTNO], [DNAME], [LOC])\n"
+ "SELECT 1, 'Fred', 'San Francisco'\n"
@@ -7814,7 +7814,7 @@ class RelToSqlConverterTest {
final String expectedCalcite = "INSERT INTO \"SCOTT\".\"DEPT\""
+ " (\"DEPTNO\", \"DNAME\", \"LOC\")\n"
+ "VALUES (1, 'Fred', 'San Francisco'),\n"
- + "(2, 'Eric', 'Washington')";
+ + "(2, 'Eric', 'Washington ')";
final String expectedCalciteX = "INSERT INTO \"SCOTT\".\"DEPT\""
+ " (\"DEPTNO\", \"DNAME\", \"LOC\")\n"
+ "SELECT 1, 'Fred', 'San Francisco'\n"
diff --git a/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java
b/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java
index 2f0293feb5..28dfba9656 100644
--- a/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelBuilderTest.java
@@ -18,6 +18,8 @@ package org.apache.calcite.test;
import org.apache.calcite.adapter.enumerable.EnumerableConvention;
import org.apache.calcite.adapter.enumerable.EnumerableRules;
import org.apache.calcite.adapter.java.ReflectiveSchema;
+import org.apache.calcite.config.CalciteConnectionProperty;
+import org.apache.calcite.config.Lex;
import org.apache.calcite.jdbc.CalciteConnection;
import org.apache.calcite.plan.Contexts;
import org.apache.calcite.plan.Convention;
@@ -231,6 +233,20 @@ public class RelBuilderTest {
hasTree("LogicalTableScan(table=[[scott, EMP]])\n"));
}
+ /** Test case for
+ * <a
href="https://issues.apache.org/jira/browse/CALCITE-6620">[CALCITE-6620]
+ * VALUES created by RelBuilder do not have a homogeneous type</a>. */
+ @Test void differentTypeValues() {
+ CalciteAssert.that()
+ .with(CalciteConnectionProperty.LEX, Lex.JAVA)
+ .with(CalciteConnectionProperty.FORCE_DECORRELATE, false)
+ .withSchema("s", new ReflectiveSchema(new HrSchema()))
+ .query("SELECT * FROM (VALUES (1, 2, 3), (CAST(5E0 AS REAL), 5E0,
NULL))")
+ .explainContains("PLAN=EnumerableValues(tuples=[[{ 1.0E0, 2.0E0, 3 }, "
+ + "{ 5.0E0, 5.0E0, null }]])")
+ .returnsOrdered("EXPR$0=1.0; EXPR$1=2.0; EXPR$2=3", "EXPR$0=5.0;
EXPR$1=5.0; EXPR$2=null");
+ }
+
@Test void testScanQualifiedTable() {
// Equivalent SQL:
// SELECT *
diff --git a/core/src/test/resources/sql/agg.iq
b/core/src/test/resources/sql/agg.iq
index 733ae7a9c0..411cbe38f8 100644
--- a/core/src/test/resources/sql/agg.iq
+++ b/core/src/test/resources/sql/agg.iq
@@ -3205,34 +3205,34 @@ LIMIT 500;
!use post
select gender, json_objectagg(ename: deptno absent on null) from emp group by
gender;
-+--------+-------------------------------------------------------+
-| GENDER | EXPR$1 |
-+--------+-------------------------------------------------------+
-| F | {"Eve":50,"Grace":60,"Susan":30,"Alice":30,"Jane":10} |
-| M | {"Adam":50,"Bob":10,"Eric":20} |
-+--------+-------------------------------------------------------+
++--------+----------------------------------------------------------+
+| GENDER | EXPR$1 |
++--------+----------------------------------------------------------+
+| F | {"Jane ":10,"Grace":60,"Susan":30,"Alice":30,"Eve ":50} |
+| M | {"Bob ":10,"Adam ":50,"Eric ":20} |
++--------+----------------------------------------------------------+
(2 rows)
!ok
select gender, json_arrayagg(json_object('ename': ename, 'deptno': deptno)
format json) from emp group by gender;
-+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| GENDER | EXPR$1
|
-+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| F |
[{"ename":"Jane","deptno":10},{"ename":"Susan","deptno":30},{"ename":"Alice","deptno":30},{"ename":"Eve","deptno":50},{"ename":"Grace","deptno":60},{"ename":"Wilma","deptno":null}]
|
-| M |
[{"ename":"Bob","deptno":10},{"ename":"Eric","deptno":20},{"ename":"Adam","deptno":50}]
|
-+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
++--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| GENDER | EXPR$1
|
++--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| F | [{"ename":"Jane
","deptno":10},{"ename":"Susan","deptno":30},{"ename":"Alice","deptno":30},{"ename":"Eve
","deptno":50},{"ename":"Grace","deptno":60},{"ename":"Wilma","deptno":null}]
|
+| M | [{"ename":"Bob ","deptno":10},{"ename":"Eric
","deptno":20},{"ename":"Adam ","deptno":50}]
|
++--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
(2 rows)
!ok
select gender, json_arrayagg(json_object('ename': ename, 'deptno': deptno))
from emp group by gender;
-+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| GENDER | EXPR$1
|
-+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
-| F |
[{"ename":"Jane","deptno":10},{"ename":"Susan","deptno":30},{"ename":"Alice","deptno":30},{"ename":"Eve","deptno":50},{"ename":"Grace","deptno":60},{"ename":"Wilma","deptno":null}]
|
-| M |
[{"ename":"Bob","deptno":10},{"ename":"Eric","deptno":20},{"ename":"Adam","deptno":50}]
|
-+--------+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
++--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| GENDER | EXPR$1
|
++--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
+| F | [{"ename":"Jane
","deptno":10},{"ename":"Susan","deptno":30},{"ename":"Alice","deptno":30},{"ename":"Eve
","deptno":50},{"ename":"Grace","deptno":60},{"ename":"Wilma","deptno":null}]
|
+| M | [{"ename":"Bob ","deptno":10},{"ename":"Eric
","deptno":20},{"ename":"Adam ","deptno":50}]
|
++--------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
(2 rows)
!ok
@@ -3241,10 +3241,10 @@ select json_object('deptno': deptno, 'employees':
json_arrayagg(json_object('ena
+-------------------------------------------------------------------------------------------+
| EXPR$0
|
+-------------------------------------------------------------------------------------------+
-|
{"employees":[{"ename":"Adam","gender":"M"},{"ename":"Eve","gender":"F"}],"deptno":50}
|
-| {"employees":[{"ename":"Eric","gender":"M"}],"deptno":20}
|
+| {"employees":[{"ename":"Adam ","gender":"M"},{"ename":"Eve
","gender":"F"}],"deptno":50} |
+| {"employees":[{"ename":"Eric ","gender":"M"}],"deptno":20}
|
| {"employees":[{"ename":"Grace","gender":"F"}],"deptno":60}
|
-|
{"employees":[{"ename":"Jane","gender":"F"},{"ename":"Bob","gender":"M"}],"deptno":10}
|
+| {"employees":[{"ename":"Jane ","gender":"F"},{"ename":"Bob
","gender":"M"}],"deptno":10} |
|
{"employees":[{"ename":"Susan","gender":"F"},{"ename":"Alice","gender":"F"}],"deptno":30}
|
| {"employees":[{"ename":"Wilma","gender":"F"}],"deptno":null}
|
+-------------------------------------------------------------------------------------------+
@@ -3256,10 +3256,10 @@ select json_object('deptno': deptno, 'employees':
json_arrayagg(json_object('ena
+-------------------------------------------------------------------------------------------+
| EXPR$0
|
+-------------------------------------------------------------------------------------------+
-|
{"employees":[{"ename":"Adam","gender":"M"},{"ename":"Eve","gender":"F"}],"deptno":50}
|
-| {"employees":[{"ename":"Eric","gender":"M"}],"deptno":20}
|
+| {"employees":[{"ename":"Adam ","gender":"M"},{"ename":"Eve
","gender":"F"}],"deptno":50} |
+| {"employees":[{"ename":"Eric ","gender":"M"}],"deptno":20}
|
| {"employees":[{"ename":"Grace","gender":"F"}],"deptno":60}
|
-|
{"employees":[{"ename":"Jane","gender":"F"},{"ename":"Bob","gender":"M"}],"deptno":10}
|
+| {"employees":[{"ename":"Jane ","gender":"F"},{"ename":"Bob
","gender":"M"}],"deptno":10} |
|
{"employees":[{"ename":"Susan","gender":"F"},{"ename":"Alice","gender":"F"}],"deptno":30}
|
| {"employees":[{"ename":"Wilma","gender":"F"}],"deptno":null}
|
+-------------------------------------------------------------------------------------------+
@@ -3308,53 +3308,53 @@ select gender,
json_objectagg(ename: deptno),
json_objectagg(ename: deptno absent on null)
from emp group by gender;
-+--------+--------------------------------------------------------------------+-------------------------------------------------------+
-| GENDER | EXPR$1
| EXPR$2 |
-+--------+--------------------------------------------------------------------+-------------------------------------------------------+
-| F | {"Eve":50,"Grace":60,"Wilma":null,"Susan":30,"Alice":30,"Jane":10}
| {"Eve":50,"Grace":60,"Susan":30,"Alice":30,"Jane":10} |
-| M | {"Adam":50,"Bob":10,"Eric":20}
| {"Adam":50,"Bob":10,"Eric":20} |
-+--------+--------------------------------------------------------------------+-------------------------------------------------------+
++--------+-----------------------------------------------------------------------+----------------------------------------------------------+
+| GENDER | EXPR$1
| EXPR$2 |
++--------+-----------------------------------------------------------------------+----------------------------------------------------------+
+| F | {"Jane ":10,"Grace":60,"Wilma":null,"Susan":30,"Alice":30,"Eve
":50} | {"Jane ":10,"Grace":60,"Susan":30,"Alice":30,"Eve ":50} |
+| M | {"Bob ":10,"Adam ":50,"Eric ":20}
| {"Bob ":10,"Adam ":50,"Eric ":20} |
++--------+-----------------------------------------------------------------------+----------------------------------------------------------+
(2 rows)
!ok
EnumerableAggregate(group=[{2}], EXPR$1=[JSON_OBJECTAGG_NULL_ON_NULL($0, $1)],
EXPR$2=[JSON_OBJECTAGG_ABSENT_ON_NULL($0, $1)])
- EnumerableValues(tuples=[[{ 'Jane', 10, 'F' }, { 'Bob', 10, 'M' }, { 'Eric',
20, 'M' }, { 'Susan', 30, 'F' }, { 'Alice', 30, 'F' }, { 'Adam', 50, 'M' }, {
'Eve', 50, 'F' }, { 'Grace', 60, 'F' }, { 'Wilma', null, 'F' }]])
+ EnumerableValues(tuples=[[{ 'Jane ', 10, 'F' }, { 'Bob ', 10, 'M' }, {
'Eric ', 20, 'M' }, { 'Susan', 30, 'F' }, { 'Alice', 30, 'F' }, { 'Adam ', 50,
'M' }, { 'Eve ', 50, 'F' }, { 'Grace', 60, 'F' }, { 'Wilma', null, 'F' }]])
!plan
select listagg(ename) as combined_name from emp;
-+------------------------------------------------+
-| COMBINED_NAME |
-+------------------------------------------------+
-| Jane,Bob,Eric,Susan,Alice,Adam,Eve,Grace,Wilma |
-+------------------------------------------------+
++-------------------------------------------------------+
+| COMBINED_NAME |
++-------------------------------------------------------+
+| Jane ,Bob ,Eric ,Susan,Alice,Adam ,Eve ,Grace,Wilma |
++-------------------------------------------------------+
(1 row)
!ok
select listagg(ename) within group(order by gender, ename) as combined_name
from emp;
-+------------------------------------------------+
-| COMBINED_NAME |
-+------------------------------------------------+
-| Alice,Eve,Grace,Jane,Susan,Wilma,Adam,Bob,Eric |
-+------------------------------------------------+
++-------------------------------------------------------+
+| COMBINED_NAME |
++-------------------------------------------------------+
+| Alice,Eve ,Grace,Jane ,Susan,Wilma,Adam ,Bob ,Eric |
++-------------------------------------------------------+
(1 row)
!ok
EnumerableAggregate(group=[{}], COMBINED_NAME=[LISTAGG($0) WITHIN GROUP ([2,
0])])
- EnumerableValues(tuples=[[{ 'Jane', 10, 'F' }, { 'Bob', 10, 'M' }, { 'Eric',
20, 'M' }, { 'Susan', 30, 'F' }, { 'Alice', 30, 'F' }, { 'Adam', 50, 'M' }, {
'Eve', 50, 'F' }, { 'Grace', 60, 'F' }, { 'Wilma', null, 'F' }]])
+ EnumerableValues(tuples=[[{ 'Jane ', 10, 'F' }, { 'Bob ', 10, 'M' }, {
'Eric ', 20, 'M' }, { 'Susan', 30, 'F' }, { 'Alice', 30, 'F' }, { 'Adam ', 50,
'M' }, { 'Eve ', 50, 'F' }, { 'Grace', 60, 'F' }, { 'Wilma', null, 'F' }]])
!plan
select
listagg(ename) within group(order by deptno, ename) as default_listagg_sep,
listagg(ename, '; ') within group(order by deptno, ename desc) as
custom_listagg_sep
from emp group by gender;
-+----------------------------------+---------------------------------------+
-| DEFAULT_LISTAGG_SEP | CUSTOM_LISTAGG_SEP |
-+----------------------------------+---------------------------------------+
-| Bob,Eric,Adam | Bob; Eric; Adam |
-| Jane,Alice,Susan,Eve,Grace,Wilma | Jane; Susan; Alice; Eve; Grace; Wilma |
-+----------------------------------+---------------------------------------+
++-------------------------------------+------------------------------------------+
+| DEFAULT_LISTAGG_SEP | CUSTOM_LISTAGG_SEP
|
++-------------------------------------+------------------------------------------+
+| Bob ,Eric ,Adam | Bob ; Eric ; Adam
|
+| Jane ,Alice,Susan,Eve ,Grace,Wilma | Jane ; Susan; Alice; Eve ; Grace;
Wilma |
++-------------------------------------+------------------------------------------+
(2 rows)
!ok
@@ -3368,11 +3368,11 @@ select
group_concat(distinct ename order by ename) as combined_name,
group_concat(ename order by ename separator ';') as separated_name
from emp;
-+------------------------------------------------+------------------------------------------------+
-| COMBINED_NAME | SEPARATED_NAME
|
-+------------------------------------------------+------------------------------------------------+
-| Adam,Alice,Bob,Eric,Eve,Grace,Jane,Susan,Wilma |
Adam;Alice;Bob;Eric;Eve;Grace;Jane;Susan;Wilma |
-+------------------------------------------------+------------------------------------------------+
++-------------------------------------------------------+-------------------------------------------------------+
+| COMBINED_NAME | SEPARATED_NAME
|
++-------------------------------------------------------+-------------------------------------------------------+
+| Adam ,Alice,Bob ,Eric ,Eve ,Grace,Jane ,Susan,Wilma | Adam ;Alice;Bob
;Eric ;Eve ;Grace;Jane ;Susan;Wilma |
++-------------------------------------------------------+-------------------------------------------------------+
(1 row)
!ok
@@ -3381,11 +3381,11 @@ from emp;
select
group_concat(deptno, ename order by ename) as combined_name
from emp;
-+-----------------------------------------------+
-| COMBINED_NAME |
-+-----------------------------------------------+
-| 50Alice30Bob10Eric20Eve50Grace60Jane10Susan30 |
-+-----------------------------------------------+
++-----------------------------------------------------+
+| COMBINED_NAME |
++-----------------------------------------------------+
+| 50Alice30Bob 10Eric 20Eve 50Grace60Jane 10Susan30 |
++-----------------------------------------------------+
(1 row)
!ok
@@ -3406,12 +3406,12 @@ select
string_agg(ename order by deptno, ename) as default_string_agg_sep,
string_agg(ename, '; ' order by deptno, ename desc) as custom_string_agg_sep
from emp group by gender;
-+----------------------------------+---------------------------------------+
-| DEFAULT_STRING_AGG_SEP | CUSTOM_STRING_AGG_SEP |
-+----------------------------------+---------------------------------------+
-| Bob,Eric,Adam | Bob; Eric; Adam |
-| Jane,Alice,Susan,Eve,Grace,Wilma | Jane; Susan; Alice; Eve; Grace; Wilma |
-+----------------------------------+---------------------------------------+
++-------------------------------------+------------------------------------------+
+| DEFAULT_STRING_AGG_SEP | CUSTOM_STRING_AGG_SEP
|
++-------------------------------------+------------------------------------------+
+| Bob ,Eric ,Adam | Bob ; Eric ; Adam
|
+| Jane ,Alice,Susan,Eve ,Grace,Wilma | Jane ; Susan; Alice; Eve ; Grace;
Wilma |
++-------------------------------------+------------------------------------------+
(2 rows)
!ok
diff --git a/core/src/test/resources/sql/join.iq
b/core/src/test/resources/sql/join.iq
index e8fa546a39..6330a8d746 100644
--- a/core/src/test/resources/sql/join.iq
+++ b/core/src/test/resources/sql/join.iq
@@ -110,7 +110,7 @@ on emp.deptno = dept.deptno or emp.ename = dept.dname;
!ok
EnumerableNestedLoopJoin(condition=[OR(=($1, $3), =(CAST($0):CHAR(11) NOT
NULL, $4))], joinType=[inner])
- EnumerableValues(tuples=[[{ 'Jane', 10, 'F' }, { 'Bob', 10, 'M' }, { 'Eric',
20, 'M' }, { 'Susan', 30, 'F' }, { 'Alice', 30, 'F' }, { 'Adam', 50, 'M' }, {
'Eve', 50, 'F' }, { 'Grace', 60, 'F' }, { 'Wilma', null, 'F' }]])
+ EnumerableValues(tuples=[[{ 'Jane ', 10, 'F' }, { 'Bob ', 10, 'M' }, {
'Eric ', 20, 'M' }, { 'Susan', 30, 'F' }, { 'Alice', 30, 'F' }, { 'Adam ', 50,
'M' }, { 'Eve ', 50, 'F' }, { 'Grace', 60, 'F' }, { 'Wilma', null, 'F' }]])
EnumerableValues(tuples=[[{ 10, 'Sales ' }, { 20, 'Marketing ' }, {
30, 'Engineering' }, { 40, 'Empty ' }]])
!plan
@@ -138,7 +138,7 @@ on emp.deptno = dept.deptno or emp.ename = dept.dname;
# Cannot be decomposed into an equi-join; plan uses EnumerableNestedLoopJoin
EnumerableNestedLoopJoin(condition=[OR(=($1, $3), =(CAST($0):CHAR(11) NOT
NULL, $4))], joinType=[left])
- EnumerableValues(tuples=[[{ 'Jane', 10, 'F' }, { 'Bob', 10, 'M' }, { 'Eric',
20, 'M' }, { 'Susan', 30, 'F' }, { 'Alice', 30, 'F' }, { 'Adam', 50, 'M' }, {
'Eve', 50, 'F' }, { 'Grace', 60, 'F' }, { 'Wilma', null, 'F' }]])
+ EnumerableValues(tuples=[[{ 'Jane ', 10, 'F' }, { 'Bob ', 10, 'M' }, {
'Eric ', 20, 'M' }, { 'Susan', 30, 'F' }, { 'Alice', 30, 'F' }, { 'Adam ', 50,
'M' }, { 'Eve ', 50, 'F' }, { 'Grace', 60, 'F' }, { 'Wilma', null, 'F' }]])
EnumerableValues(tuples=[[{ 10, 'Sales ' }, { 20, 'Marketing ' }, {
30, 'Engineering' }, { 40, 'Empty ' }]])
!plan
diff --git a/core/src/test/resources/sql/outer.iq
b/core/src/test/resources/sql/outer.iq
index 858596a2e4..b0848dae21 100644
--- a/core/src/test/resources/sql/outer.iq
+++ b/core/src/test/resources/sql/outer.iq
@@ -245,7 +245,7 @@ select * from (select * from emp where gender ='F') as emp
full join dept on emp
!ok
EnumerableNestedLoopJoin(condition=[=(-($1, $3), 0)], joinType=[full])
EnumerableCalc(expr#0..2=[{inputs}], expr#3=['F'], expr#4=[=($t2, $t3)],
proj#0..2=[{exprs}], $condition=[$t4])
- EnumerableValues(tuples=[[{ 'Jane', 10, 'F' }, { 'Bob', 10, 'M' }, {
'Eric', 20, 'M' }, { 'Susan', 30, 'F' }, { 'Alice', 30, 'F' }, { 'Adam', 50,
'M' }, { 'Eve', 50, 'F' }, { 'Grace', 60, 'F' }, { 'Wilma', null, 'F' }]])
+ EnumerableValues(tuples=[[{ 'Jane ', 10, 'F' }, { 'Bob ', 10, 'M' }, {
'Eric ', 20, 'M' }, { 'Susan', 30, 'F' }, { 'Alice', 30, 'F' }, { 'Adam ', 50,
'M' }, { 'Eve ', 50, 'F' }, { 'Grace', 60, 'F' }, { 'Wilma', null, 'F' }]])
EnumerableValues(tuples=[[{ 10, 'Sales ' }, { 20, 'Marketing ' }, {
30, 'Engineering' }, { 40, 'Empty ' }]])
!plan
diff --git a/core/src/test/resources/sql/winagg.iq
b/core/src/test/resources/sql/winagg.iq
index 64e4a0d26c..762e8a351e 100644
--- a/core/src/test/resources/sql/winagg.iq
+++ b/core/src/test/resources/sql/winagg.iq
@@ -761,7 +761,7 @@ select emp."ENAME", emp."DEPTNO",
from emp order by emp."ENAME";
EnumerableSort(sort0=[$0], dir0=[ASC])
EnumerableWindow(window#0=[window(aggs [NTH_VALUE($1, $2), NTH_VALUE($1,
$3), NTH_VALUE($1, $4), NTH_VALUE($1, $5), NTH_VALUE($1, $6)])])
- EnumerableValues(tuples=[[{ 'Jane', 10 }, { 'Bob', 10 }, { 'Eric', 20 }, {
'Susan', 30 }, { 'Alice', 30 }, { 'Adam', 50 }, { 'Eve', 50 }, { 'Grace', 60 },
{ 'Wilma', null }]])
+ EnumerableValues(tuples=[[{ 'Jane ', 10 }, { 'Bob ', 10 }, { 'Eric ', 20
}, { 'Susan', 30 }, { 'Alice', 30 }, { 'Adam ', 50 }, { 'Eve ', 50 }, {
'Grace', 60 }, { 'Wilma', null }]])
!plan
+-------+--------+-------------+--------------+-------------+--------------+-------------+
| ENAME | DEPTNO | first_value | second_value | fifth_value | eighth_value |
tenth_value |
@@ -1006,7 +1006,7 @@ select gender, count(*) over(partition by gender order by
ename) as count1 from
EnumerableCalc(expr#0..3=[{inputs}], GENDER=[$t2], $1=[$t3])
EnumerableWindow(window#0=[window(partition {2} order by [0] aggs
[COUNT()])])
EnumerableCalc(expr#0..2=[{inputs}], expr#3=['F'], expr#4=[=($t2, $t3)],
proj#0..2=[{exprs}], $condition=[$t4])
- EnumerableValues(tuples=[[{ 'Jane', 10, 'F' }, { 'Bob', 10, 'M' }, {
'Eric', 20, 'M' }, { 'Susan', 30, 'F' }, { 'Alice', 30, 'F' }, { 'Adam', 50,
'M' }, { 'Eve', 50, 'F' }, { 'Grace', 60, 'F' }, { 'Wilma', null, 'F' }]])
+ EnumerableValues(tuples=[[{ 'Jane ', 10, 'F' }, { 'Bob ', 10, 'M' }, {
'Eric ', 20, 'M' }, { 'Susan', 30, 'F' }, { 'Alice', 30, 'F' }, { 'Adam ', 50,
'M' }, { 'Eve ', 50, 'F' }, { 'Grace', 60, 'F' }, { 'Wilma', null, 'F' }]])
!plan
+--------+--------+
| GENDER | COUNT1 |