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