[ 
https://issues.apache.org/jira/browse/CALCITE-4446?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Julian Hyde updated CALCITE-4446:
---------------------------------
    Description: 
Implement three-valued logic for SEARCH operator.

Consider the expression {{x IN (10, 20)}}, which we might represent as 
{{SEARCH(x, Sarg(10, 20))}}. Suppose we invoke this with a value of {{NULL}} 
for {{x}}. Do we want it to return UNKNOWN, FALSE or TRUE? The answer is: all 
of the above.

Here are the 3 variants:
* {{Sarg(10, 20, UNKNOWN AS TRUE)}}: {{x IS NULL OR x IN (10, 20)}} → TRUE
* {{Sarg(10, 20, UNKNOWN AS UNKNOWN)}}: {{x IN (10, 20)}} → UNKNOWN
* {{Sarg(10, 20, UNKNOWN AS FALSE)}}: {{x IS NOT NULL AND (x IN (10, 20))}} 
→ FALSE

Currently {{class Sarg}} has a field {{boolean containsNull}} which deals with 
the first two cases. Changing {{boolean containsNull}} to {{RexUnknownAs 
unknownAs}} (which has 3 values) will allow us to represent the third. The new 
representation is symmetrical under negation, which de Morgan's law suggests is 
a good thing.

  was:
Implement three-valued logic for SEARCH operator.

Consider the expression {{x IN (10, 20)}}, which we might represent as 
{{SEARCH(x, SARG(10, 20))}}. Suppose we invoke this with a value of {{NULL}} 
for {{x}}. Do we want it to return UNKNOWN, FALSE or TRUE? The answer is: all 
of the above.

Here are the 3 variants:
* {{SEARCH(10, 20, UNKNOWN AS TRUE)}}: {{x IS NULL OR x IN (10, 20)}} → 
TRUE
* {{SEARCH(10, 20, UNKNOWN AS UNKNOWN)}}: {{x IN (10, 20)}} → UNKNOWN
* {{SEARCH(10, 20, UNKNOWN AS FALSE)}}: {{x IS NOT NULL AND (x IN (10, 20))}} 
→ FALSE

Currently {{class Sarg}} has a field {{boolean containsNull}} which deals with 
the first two cases. Changing {{boolean containsNull}} to {{RexUnknownAs 
unknownAs}} (which has 3 values) will allow us to represent the third. The new 
representation is symmetrical under negation, which de Morgan's law suggests is 
a good thing.


> Implement three-valued logic for SEARCH operator 
> -------------------------------------------------
>
>                 Key: CALCITE-4446
>                 URL: https://issues.apache.org/jira/browse/CALCITE-4446
>             Project: Calcite
>          Issue Type: Bug
>            Reporter: Julian Hyde
>            Priority: Major
>
> Implement three-valued logic for SEARCH operator.
> Consider the expression {{x IN (10, 20)}}, which we might represent as 
> {{SEARCH(x, Sarg(10, 20))}}. Suppose we invoke this with a value of {{NULL}} 
> for {{x}}. Do we want it to return UNKNOWN, FALSE or TRUE? The answer is: all 
> of the above.
> Here are the 3 variants:
> * {{Sarg(10, 20, UNKNOWN AS TRUE)}}: {{x IS NULL OR x IN (10, 20)}} → 
> TRUE
> * {{Sarg(10, 20, UNKNOWN AS UNKNOWN)}}: {{x IN (10, 20)}} → UNKNOWN
> * {{Sarg(10, 20, UNKNOWN AS FALSE)}}: {{x IS NOT NULL AND (x IN (10, 20))}} 
> → FALSE
> Currently {{class Sarg}} has a field {{boolean containsNull}} which deals 
> with the first two cases. Changing {{boolean containsNull}} to {{RexUnknownAs 
> unknownAs}} (which has 3 values) will allow us to represent the third. The 
> new representation is symmetrical under negation, which de Morgan's law 
> suggests is a good thing.



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

Reply via email to