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);