Thread: UNION/INTERSECT in subselects

UNION/INTERSECT in subselects

From
Florent Guillaume
Date:
Hi, I'm using 7.0.2 and I have a problem with UNION in some subselects,
namely the following works:select * from a where a.f in (select 1)
but this doesn't:select * from a where a.f in (select 1 union select 2)

In the grammar we have : in_expr:  SubSelect | ...
but SubSelect doesn't allow UNIONs, only select_clause does.

Could in_expr be changed to use select_clause instead without adverse
ill effects ?

In fact SubSelect is used all over the place, so maybe it's better to
switch select_clause and SubSelect in the definitions for SelectStmt,
select_clause and SubSelect ?


Thanks,
Florent

(Please Cc: me in your answers)


Re: UNION/INTERSECT in subselects

From
Tom Lane
Date:
Florent Guillaume <efge@mail.com> writes:
> In the grammar we have :
>   in_expr:  SubSelect | ...
> but SubSelect doesn't allow UNIONs, only select_clause does.

> Could in_expr be changed to use select_clause instead without adverse
> ill effects ?

Unfortunately the problems with union/intersect/except go a lot deeper
than the grammar.  Take a look at the rewriter and the planner, if
you have a strong stomach.  They're just not built to deal with these
constructs except at the top level of a query.  (The executor would
likely work just fine, if only the upstream modules would give it a
valid plan ...)

I'm hoping to see this stuff cleaned up during the much-talked-of
querytree redesign that we plan for the 7.2 cycle.  AFAICS there is
no way to fix it without some pretty serious hacking on the querytree
representation of union etc.
        regards, tom lane