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 22e8b0324a [CALCITE-6707] Type inference for CHR function is wrong
22e8b0324a is described below

commit 22e8b0324aa85243d83be0c7be06ff7f8f35b3fd
Author: Mihai Budiu <[email protected]>
AuthorDate: Wed Nov 27 11:16:02 2024 -0800

    [CALCITE-6707] Type inference for CHR function is wrong
    
    Signed-off-by: Mihai Budiu <[email protected]>
---
 .../main/java/org/apache/calcite/sql/fun/SqlLibraryOperators.java  | 2 +-
 core/src/main/java/org/apache/calcite/sql/type/ReturnTypes.java    | 7 +++++++
 testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java | 3 +++
 3 files changed, 11 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 f08bd63877..5d349a2158 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
@@ -2284,7 +2284,7 @@ public abstract class SqlLibraryOperators {
   @LibraryOperator(libraries = {BIG_QUERY, ORACLE, POSTGRESQL})
   public static final SqlFunction CHR =
       SqlBasicFunction.create("CHR",
-          ReturnTypes.CHAR,
+          ReturnTypes.CHAR_NULLABLE_IF_ARGS_NULLABLE,
           OperandTypes.INTEGER,
           SqlFunctionCategory.STRING);
 
diff --git a/core/src/main/java/org/apache/calcite/sql/type/ReturnTypes.java 
b/core/src/main/java/org/apache/calcite/sql/type/ReturnTypes.java
index ae8596e01e..d54f3d977e 100644
--- a/core/src/main/java/org/apache/calcite/sql/type/ReturnTypes.java
+++ b/core/src/main/java/org/apache/calcite/sql/type/ReturnTypes.java
@@ -447,6 +447,13 @@ public abstract class ReturnTypes {
   public static final SqlReturnTypeInference CHAR_FORCE_NULLABLE =
       CHAR.andThen(SqlTypeTransforms.FORCE_NULLABLE);
 
+  /**
+   * Type-inference strategy whereby the result type of a call is
+   * CHAR(1), nullable if any argument is nullable.
+   */
+  public static final SqlReturnTypeInference CHAR_NULLABLE_IF_ARGS_NULLABLE =
+      CHAR.andThen(SqlTypeTransforms.TO_NULLABLE);
+
   /**
    * Type-inference strategy whereby the result type of a call is a TINYINT.
    */
diff --git a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java 
b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java
index 5a5148a93b..c00b99ac87 100644
--- a/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java
+++ b/testkit/src/main/java/org/apache/calcite/test/SqlOperatorTest.java
@@ -2213,6 +2213,9 @@ public class SqlOperatorTest {
       f.checkScalar("chr(48)", "0", "CHAR(1) NOT NULL");
       f.checkScalar("chr(0)", String.valueOf('\u0000'), "CHAR(1) NOT NULL");
       f.checkNull("chr(null)");
+      // Test case for [CALCITE-6707] Type inference for CHR function is wrong
+      // https://issues.apache.org/jira/browse/CALCITE-6707
+      f.checkType("chr(CAST(null AS INTEGER))", "CHAR(1)");
     };
     final List<SqlLibrary> libraries =
         list(SqlLibrary.BIG_QUERY, SqlLibrary.ORACLE, SqlLibrary.POSTGRESQL);

Reply via email to