I agree that NOT IN is toxic, and it is error-prone.
But you can't prevent people writing SQL with not in sub-queries, would you 
rather let optimizer generate inefficient plan?

- Haisheng

------------------------------------------------------------------
发件人:Julian Hyde<jh...@apache.org>
日 期:2020年07月20日 11:56:35
收件人:dev@calcite.apache.org<dev@calcite.apache.org>
主 题:Re: [DISCUSS] New Join Type: ANTI_NOTIN

Yuck!

NOT IN is toxic. I'd rather keep it out of the algebra.

On Sun, Jul 19, 2020 at 8:24 PM Haisheng Yuan <hy...@apache.org> wrote:
>
> Hi all,
>
> Currently, JoinRelType.ANTI only represents NOT_EXISTS subquery (thanks to 
> Ruben for reminding).
> For some simple boolean context NOT_IN subquery, we can't transform it to 
> ANTI join. e.g.:
>
> SELECT * FROM foo WHERE a NOT IN (SELECT b FROM bar); -- bar.b is nullable
>
> Because if there is a null value in the results of subquery, the NOT IN 
> predicate will return false, the whole query returns empty. And in Calcite, 
> the plan for this kind of query is inefficient.
>
> If we have ANTI_NOTIN to represent this kind of join, we can generate more 
> efficient plan, as long as the query executor support it.
>
> Thoughts?
>
> Haisheng Yuan
>
>

Reply via email to