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>