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 <mbu...@gmail.com>
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 <mbu...@gmail.com>
---
 .../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>

Reply via email to