You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@calcite.apache.org by Benchao Li <li...@apache.org> on 2022/03/03 00:52:11 UTC
Re: [Discuss] The RexSimplify about "a <> 1 and a = 2"
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 <no...@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
Re: [Discuss] The RexSimplify about "a <> 1 and a = 2"
Posted by xiong duan <no...@gmail.com>.
Hi, Followers.
Thanks for the feedback. Yes, I have a misunderstanding about this.
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 UNKNOWN: CASE(IS NULL(a), null, a = 2)
This is wrong. Because I omit the a is still nullable after the
optimization.
Julian Hyde <jh...@gmail.com> 于2022年3月3日周四 17:23写道:
> Note that https://issues.apache.org/jira/browse/CALCITE-1794 <
> https://issues.apache.org/jira/browse/CALCITE-1794> deals with very
> similar expressions (albeit with CAST, and optimized using SARGs rather
> than RexSimplify) and was just fixed today.
>
> > On Mar 2, 2022, at 4:52 PM, Benchao Li <li...@apache.org> wrote:
> >
> > 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 <no...@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
>
>
Re: [Discuss] The RexSimplify about "a <> 1 and a = 2"
Posted by Julian Hyde <jh...@gmail.com>.
Note that https://issues.apache.org/jira/browse/CALCITE-1794 <https://issues.apache.org/jira/browse/CALCITE-1794> deals with very similar expressions (albeit with CAST, and optimized using SARGs rather than RexSimplify) and was just fixed today.
> On Mar 2, 2022, at 4:52 PM, Benchao Li <li...@apache.org> wrote:
>
> 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 <no...@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