This is an automated email from the ASF dual-hosted git repository.
rubenql 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 ffd58e3b6d [CALCITE-5879] AssertionError during constant reduction of
SPLIT expression that returns NULL
ffd58e3b6d is described below
commit ffd58e3b6d3824e141d76cbbc3664608e8d1bb4d
Author: Mihai Budiu <[email protected]>
AuthorDate: Mon Jul 31 11:51:24 2023 -0700
[CALCITE-5879] AssertionError during constant reduction of SPLIT expression
that returns NULL
Signed-off-by: Mihai Budiu <[email protected]>
---
.../calcite/sql/fun/SqlLibraryOperators.java | 3 +-
.../org/apache/calcite/test/RelOptRulesTest.java | 40 +++++++++++++++++
.../org/apache/calcite/test/RelOptRulesTest.xml | 51 ++++++++++++++++++++++
3 files changed, 93 insertions(+), 1 deletion(-)
diff --git
a/core/src/main/java/org/apache/calcite/sql/fun/SqlLibraryOperators.java
b/core/src/main/java/org/apache/calcite/sql/fun/SqlLibraryOperators.java
index 749d12f978..4a720c8982 100644
--- a/core/src/main/java/org/apache/calcite/sql/fun/SqlLibraryOperators.java
+++ b/core/src/main/java/org/apache/calcite/sql/fun/SqlLibraryOperators.java
@@ -317,7 +317,8 @@ public abstract class SqlLibraryOperators {
SqlBasicFunction.create("SPLIT",
ReturnTypes.ARG0
.andThen(SqlLibraryOperators::deriveTypeSplit)
- .andThen(SqlTypeTransforms.TO_ARRAY),
+ .andThen(SqlTypeTransforms.TO_ARRAY)
+ .andThen(SqlTypeTransforms.TO_NULLABLE),
OperandTypes.or(OperandTypes.CHARACTER_CHARACTER,
OperandTypes.CHARACTER,
OperandTypes.BINARY_BINARY,
diff --git a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
index a1408f089a..762da94254 100644
--- a/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
+++ b/core/src/test/java/org/apache/calcite/test/RelOptRulesTest.java
@@ -107,6 +107,7 @@ import org.apache.calcite.sql.SqlFunctionCategory;
import org.apache.calcite.sql.SqlKind;
import org.apache.calcite.sql.SqlOperator;
import org.apache.calcite.sql.fun.SqlLibrary;
+import org.apache.calcite.sql.fun.SqlLibraryOperatorTableFactory;
import org.apache.calcite.sql.fun.SqlStdOperatorTable;
import org.apache.calcite.sql.test.SqlTestFactory;
import org.apache.calcite.sql.type.OperandTypes;
@@ -5090,6 +5091,45 @@ class RelOptRulesTest extends RelOptTestBase {
.checkUnchanged();
}
+ /** Test case for <a
href="https://issues.apache.org/jira/browse/CALCITE-5879">
+ * AssertionError during constant reduction of SPLIT expression that returns
NULL</a>. */
+ @Test public void testSplitNull() {
+ final String query = "select split('1|2|3', NULL)";
+ sql(query)
+ .withFactory(
+ t -> t.withOperatorTable(opTab ->
+ SqlLibraryOperatorTableFactory.INSTANCE.getOperatorTable(
+ SqlLibrary.BIG_QUERY))) // needed for SPLIT function
+ .withRule(CoreRules.PROJECT_REDUCE_EXPRESSIONS)
+ .check();
+ }
+
+ /** Test case for <a
href="https://issues.apache.org/jira/browse/CALCITE-5879">
+ * AssertionError during constant reduction of SPLIT expression that returns
NULL</a>. */
+ @Test public void testSplitNull1() {
+ final String query = "select split(NULL, '|')";
+ sql(query)
+ .withFactory(
+ t -> t.withOperatorTable(opTab ->
+ SqlLibraryOperatorTableFactory.INSTANCE.getOperatorTable(
+ SqlLibrary.BIG_QUERY))) // needed for SPLIT function
+ .withRule(CoreRules.PROJECT_REDUCE_EXPRESSIONS)
+ .check();
+ }
+
+ /** Test case for <a
href="https://issues.apache.org/jira/browse/CALCITE-5879">
+ * AssertionError during constant reduction of SPLIT expression that returns
NULL</a>. */
+ @Test public void testSplitNull2() {
+ final String query = "select split(NULL, NULL)";
+ sql(query)
+ .withFactory(
+ t -> t.withOperatorTable(opTab ->
+ SqlLibraryOperatorTableFactory.INSTANCE.getOperatorTable(
+ SqlLibrary.BIG_QUERY))) // needed for SPLIT function
+ .withRule(CoreRules.PROJECT_REDUCE_EXPRESSIONS)
+ .check();
+ }
+
/** Test case for right outer join, group by on key same as join
* key, group by on (left)null generating side. */
@Test void testPushAggregateThroughOuterJoin12() {
diff --git
a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
index bca8313b33..ea33f58f4e 100644
--- a/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
+++ b/core/src/test/resources/org/apache/calcite/test/RelOptRulesTest.xml
@@ -13899,6 +13899,57 @@ LogicalProject(B=[ST_BUFFER(ST_POINT(0.0:DECIMAL(2,
1), 0.0:DECIMAL(2, 1)), 1, 4
<![CDATA[
LogicalProject(B=[CAST(POLYGON ((1 0, 0.9238795325112867 -0.3826834323650898,
0.7071067811865476 -0.7071067811865475, 0.3826834323650898 -0.9238795325112867,
0.0000000000000001 -1, -0.3826834323650897 -0.9238795325112867,
-0.7071067811865475 -0.7071067811865476, -0.9238795325112867
-0.3826834323650899, -1 -0.0000000000000001, -0.9238795325112868
0.3826834323650897, -0.7071067811865477 0.7071067811865475, -0.3826834323650903
0.9238795325112865, -0.0000000000000002 1, 0.38268343236509 0.92 [...]
LogicalTableScan(table=[[CATALOG, GEO, RESTAURANTS]])
+]]>
+ </Resource>
+ </TestCase>
+ <TestCase name="testSplitNull">
+ <Resource name="sql">
+ <![CDATA[select split('1|2|3', NULL)]]>
+ </Resource>
+ <Resource name="planBefore">
+ <![CDATA[
+LogicalProject(EXPR$0=[SPLIT('1|2|3', null:NULL)])
+ LogicalValues(tuples=[[{ 0 }]])
+]]>
+ </Resource>
+ <Resource name="planAfter">
+ <![CDATA[
+LogicalProject(EXPR$0=[null:CHAR(5) NOT NULL ARRAY])
+ LogicalValues(tuples=[[{ 0 }]])
+]]>
+ </Resource>
+ </TestCase>
+ <TestCase name="testSplitNull1">
+ <Resource name="sql">
+ <![CDATA[select split(NULL, '|')]]>
+ </Resource>
+ <Resource name="planBefore">
+ <![CDATA[
+LogicalProject(EXPR$0=[SPLIT(null:NULL, '|')])
+ LogicalValues(tuples=[[{ 0 }]])
+]]>
+ </Resource>
+ <Resource name="planAfter">
+ <![CDATA[
+LogicalProject(EXPR$0=[null:NULL ARRAY])
+ LogicalValues(tuples=[[{ 0 }]])
+]]>
+ </Resource>
+ </TestCase>
+ <TestCase name="testSplitNull2">
+ <Resource name="sql">
+ <![CDATA[select split(NULL, NULL)]]>
+ </Resource>
+ <Resource name="planBefore">
+ <![CDATA[
+LogicalProject(EXPR$0=[SPLIT(null:NULL, null:NULL)])
+ LogicalValues(tuples=[[{ 0 }]])
+]]>
+ </Resource>
+ <Resource name="planAfter">
+ <![CDATA[
+LogicalProject(EXPR$0=[null:NULL ARRAY])
+ LogicalValues(tuples=[[{ 0 }]])
]]>
</Resource>
</TestCase>