You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@calcite.apache.org by "Rui Wang (Jira)" <ji...@apache.org> on 2021/12/26 06:10:00 UTC
[jira] [Closed] (CALCITE-4875) NVL Function Incorrectly changes nullability field of its operands
[ https://issues.apache.org/jira/browse/CALCITE-4875?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Rui Wang closed CALCITE-4875.
-----------------------------
> NVL Function Incorrectly changes nullability field of its operands
> ------------------------------------------------------------------
>
> Key: CALCITE-4875
> URL: https://issues.apache.org/jira/browse/CALCITE-4875
> Project: Calcite
> Issue Type: Bug
> Components: core
> Affects Versions: 1.28.0
> Reporter: Jay Narale
> Priority: Major
> Labels: pull-request-available
> Fix For: 1.29.0
>
> Time Spent: 6h 50m
> Remaining Estimate: 0h
>
> We rewrite the NVL function in _org/apache/calcite/sql2rel/StandardConvertletTable.java:303_ , during the rewrite we currently override the operands' nullability to be NOT NULL which is not needed. This causes issues if that operand is pushdown , since the input of that operand need not be not nullable whereas we forced that operand to be Not nullable.
> We rewrite the nvl function [ NVL(op1, op2) to CASE ( IS NOT NULL (op1), op1, op2) ]
> Previously we were wrongly setting final op1, op2 nullability to NOT NULL
> For Example for the query
> select nvl("name", 'undefined') FROM "hr"."emps"
> Using the test framework, (Column "name" is nullable)
> The generated plan before this change is:
> {code:java}
> EnumerableCalc(expr#0..4=[{inputs}], expr#5=[IS NOT NULL($t2)], expr#6=[CAST($t2):VARCHAR NOT NULL], expr#7=['undefined':VARCHAR], expr#8=[CASE($t5, $t6, $t7)], EXPR$0=[$t8])
> EnumerableTableScan(table=[[hr, emps]])
> {code}
> After this change:
> {code:java}
> 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]])
>
> {code}
> If we look at expr#8 , its the CASE described earlier and expr#6 is the "name" column.
> As described with this change we can assert that the nullability is preserved as nullable as required ( expr#6 is set to Nullable)
--
This message was sent by Atlassian Jira
(v8.20.1#820001)