Hi xiong,

For the simplification result below:
# "a <> 1 or a = 1 [a is nullable]"
1. UNKNOWN AS UNKNOWN: OR(IS NOT NULL(a), null)
2. UNKNOWN AS TRUE: TRUE
3. UNKNOWN AS FALSE: IS NOT NULL(a)

# "a<>1 and a = 2 [a is nullable]"
1. UNKNOWN AS UNKNOWN: =(a, '2')
2. UNKNOWN AS TRUE: =(a, '2')
3. UNKNOWN AS FALSE: =(a, '2')

IMHO, this is expected and correct.
For the first case, the result can be simplified to:
if a is null:
  null
else:
  true
then, for each unknown value, we can evaluate to the results above
correspondingly.

For the second case, the result is also correct, we can simplify `a<>1 and
a = 2` to `a = 2` regardless of nullability of a,
and `=(a, '2')` is the simplest form.

xiong duan <nobigo...@gmail.com> 于2022年2月28日周一 10:26写道:

> Hi followers.
>     When I learned how to simplify the Rexnode in Calcite. I meet a problem
> and need some help.
> For example:
> When we simplify  "a <> 1 or a = 1 [a is nullable]", (the result is
> different according to how to treat the UNKNOW value) :
>
> checkSimplify3_(        or(ne(vInt(0), literal(1)),        eq(vInt(0),
> literal(1))),        "OR(IS NOT NULL(?0.int0), null)",        "IS NOT
> NULL(?0.int0)",        "true");
>
> But when I try to simplify "a<>1 and a = 2 [a is nullable]":
>
>     checkSimplify3_(
>             and(ne(vInt(0), literal(1)),
>                     eq(vInt(0), literal(2))),
>             "=(?0.int0, 2)",
>             "=(?0.int0, 2)",
>             "=(?0.int0, 2)");
>
> And I think this result should be:
>  "a<>1 and a = 2 [a is nullable]":
>
> UNKNOW AS TRUE: a IS NULL or a = 2
> UNKNOW AS FALSE: a is NOT NULL and a =2
> UNKNOW AS UNKNOW: CASE(IS NULL(a), null, a = 2)
>
> So What did I misunderstand? It is a bug or intentional? Any feedback would
> be appreciated.
>


-- 

Best,
Benchao Li

Reply via email to