This is an automated email from the ASF dual-hosted git repository.

xiong pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/calcite.git


The following commit(s) were added to refs/heads/master by this push:
     new a03586c  [CALCITE-4875] Preserve Operand Nullability in NVL rewrite
a03586c is described below

commit a03586c26e1888daebabb271b603fd2871d6a359
Author: Jay <[email protected]>
AuthorDate: Thu Nov 4 11:09:00 2021 +0900

    [CALCITE-4875] Preserve Operand Nullability in NVL rewrite
---
 .../calcite/sql2rel/StandardConvertletTable.java   | 12 ++++++++++--
 core/src/test/resources/sql/functions.iq           | 22 ++++++++++++++++++++++
 .../java/org/apache/calcite/test/QuidemTest.java   |  1 +
 3 files changed, 33 insertions(+), 2 deletions(-)

diff --git 
a/core/src/main/java/org/apache/calcite/sql2rel/StandardConvertletTable.java 
b/core/src/main/java/org/apache/calcite/sql2rel/StandardConvertletTable.java
index f02a986..35be3ec 100644
--- a/core/src/main/java/org/apache/calcite/sql2rel/StandardConvertletTable.java
+++ b/core/src/main/java/org/apache/calcite/sql2rel/StandardConvertletTable.java
@@ -308,12 +308,20 @@ public class StandardConvertletTable extends 
ReflectiveConvertletTable {
         cx.convertExpression(call.getOperandList().get(1));
     final RelDataType type =
         cx.getValidator().getValidatedNodeType(call);
+    // Preserve Operand Nullability
     return rexBuilder.makeCall(type, SqlStdOperatorTable.CASE,
         ImmutableList.of(
             rexBuilder.makeCall(SqlStdOperatorTable.IS_NOT_NULL,
                 operand0),
-            rexBuilder.makeCast(type, operand0),
-            rexBuilder.makeCast(type, operand1)));
+            rexBuilder.makeCast(
+                cx.getTypeFactory()
+                    .createTypeWithNullability(type, 
operand0.getType().isNullable()),
+                operand0),
+            rexBuilder.makeCast(
+                cx.getTypeFactory()
+                    .createTypeWithNullability(type, 
operand1.getType().isNullable()),
+                operand1)
+        ));
   }
 
   /** Converts a call to the DECODE function. */
diff --git a/core/src/test/resources/sql/functions.iq 
b/core/src/test/resources/sql/functions.iq
index 58770a0..dbba1a8 100644
--- a/core/src/test/resources/sql/functions.iq
+++ b/core/src/test/resources/sql/functions.iq
@@ -187,4 +187,26 @@ SELECT XMLTRANSFORM(
 Invalid input for XMLTRANSFORM xml: '<'
 !error
 
+# [CALCITE-4875] Preserve Operand Nullability in NVL rewrite
+# Asserting that NVL does not change a Nullable operand to NOT Nullable
+
+!use oraclefunc
+select nvl("name", 'undefined') FROM "hr"."emps";
+
+EnumerableCalc(expr#0..4=[{inputs}], expr#5=[IS NOT NULL($t2)], 
expr#6=[CAST($t2):VARCHAR], expr#7=['undefined':VARCHAR], expr#8=[CASE($t5, 
$t6, $t7)], EXPR$0=[$t8])
+  EnumerableTableScan(table=[[hr, emps]])
+!plan
+
++-----------+
+| EXPR$0    |
++-----------+
+| Bill      |
+| Eric      |
+| Sebastian |
+| Theodore  |
++-----------+
+(4 rows)
+
+!ok
+
 # End functions.iq
diff --git a/testkit/src/main/java/org/apache/calcite/test/QuidemTest.java 
b/testkit/src/main/java/org/apache/calcite/test/QuidemTest.java
index 86b2eea..9c8f42b 100644
--- a/testkit/src/main/java/org/apache/calcite/test/QuidemTest.java
+++ b/testkit/src/main/java/org/apache/calcite/test/QuidemTest.java
@@ -269,6 +269,7 @@ public abstract class QuidemTest {
       case "oraclefunc":
         return CalciteAssert.that()
             .with(CalciteConnectionProperty.FUN, "oracle")
+            .with(CalciteAssert.Config.REGULAR)
             .connect();
       case "catchall":
         return CalciteAssert.that()

Reply via email to