Обсуждение: Relation ordering in FROM clause causing error related to missing entry... Or not.

Поиск
Список
Период
Сортировка

Relation ordering in FROM clause causing error related to missing entry... Or not.

От
Michael Paquier
Дата:
Hi all,

Today while playing with some queries I bumped into the following thing:
=# with count_query as (select generate_series(0,1) as a) select b
from count_query, generate_series(1, count_query.a) as b;b
---1
(1 row)
=# with count_query as (select generate_series(0,1) as a) select b
from generate_series(1, count_query.a) as b, count_query;
ERROR:  42P01: missing FROM-clause entry for table "count_query"
LINE 1: ...eries(0,1) as a) select b from generate_series(1, count_quer...
             ^
 
LOCATION:  errorMissingRTE, parse_relation.c:2850

I have been a little bit surprised by the fact that different entry
ordering in the FROM clause of the main query had different effects.
Perhaps there is something I am missing? I haven't looked at the code
but if this happens to be a bug I am fine to submit a patch.
Regards,
-- 
Michael



Re: Relation ordering in FROM clause causing error related to missing entry... Or not.

От
Stephen Frost
Дата:
Michael,

* Michael Paquier (michael.paquier@gmail.com) wrote:
> Today while playing with some queries I bumped into the following thing:
> =# with count_query as (select generate_series(0,1) as a) select b
> from count_query, generate_series(1, count_query.a) as b;
>  b
> ---
>  1
> (1 row)

The above results in an implicit LATERAL being done.

> =# with count_query as (select generate_series(0,1) as a) select b
> from generate_series(1, count_query.a) as b, count_query;
> ERROR:  42P01: missing FROM-clause entry for table "count_query"
> LINE 1: ...eries(0,1) as a) select b from generate_series(1, count_quer...
>                                                              ^
> LOCATION:  errorMissingRTE, parse_relation.c:2850

This doesn't because the generate_series() is first- where would it get
the count_query relation?

> I have been a little bit surprised by the fact that different entry
> ordering in the FROM clause of the main query had different effects.
> Perhaps there is something I am missing? I haven't looked at the code
> but if this happens to be a bug I am fine to submit a patch.

Yeah, it's simply because we can turn one into an implicit LATERAL, but
we can't do that for the other.
Thanks,
    Stephen

Re: Relation ordering in FROM clause causing error related to missing entry... Or not.

От
Alvaro Herrera
Дата:
Michael Paquier wrote:
> Hi all,
> 
> Today while playing with some queries I bumped into the following thing:
> =# with count_query as (select generate_series(0,1) as a) select b
> from count_query, generate_series(1, count_query.a) as b;
>  b
> ---
>  1
> (1 row)
> =# with count_query as (select generate_series(0,1) as a) select b
> from generate_series(1, count_query.a) as b, count_query;
> ERROR:  42P01: missing FROM-clause entry for table "count_query"
> LINE 1: ...eries(0,1) as a) select b from generate_series(1, count_quer...
>                                                              ^
> LOCATION:  errorMissingRTE, parse_relation.c:2850
> 
> I have been a little bit surprised by the fact that different entry
> ordering in the FROM clause of the main query had different effects.
> Perhaps there is something I am missing?

This seems natural to me -- in your second example, by the time you
reference count_query it hasn't yet been declared and thus it's not
available in the namespace.  This is how I expect a LATERAL reference to
work: a RTE can reference previous entries, but not ones that come
later.

(SRFs in FROM become lateral references automatically, as I recall.
Without LATERAL, you wouldn't have been able to refer to count_query at
all.)

-- 
Álvaro Herrera                http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services



Re: Relation ordering in FROM clause causing error related to missing entry... Or not.

От
Michael Paquier
Дата:
On Tue, Mar 10, 2015 at 10:30 PM, Stephen Frost <sfrost@snowman.net> wrote:
> Yeah, it's simply because we can turn one into an implicit LATERAL, but
> we can't do that for the other.

Ah, yes, thanks. I forgot that it was changed to an implicit LATERAL.
Just wondering where my mind was yesterday night...
-- 
Michael