Re: LATERAL and VOLATILE functions

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: LATERAL and VOLATILE functions
Дата
Msg-id 29593.1355609167@sss.pgh.pa.us
обсуждение исходный текст
Ответ на LATERAL and VOLATILE functions  (Pavel Stehule <pavel.stehule@gmail.com>)
Ответы Re: LATERAL and VOLATILE functions
Список pgsql-hackers
Pavel Stehule <pavel.stehule@gmail.com> writes:
> Is this behave expected?

> -- unexpected
> postgres=# select * from generate_series(1,3) g(v), LATERAL (SELECT random()) x;
> ;
>  v        random
> ---+------------------
>  1   0.63025646051392
>  2   0.63025646051392
>  3   0.63025646051392
> (3 rows)

The LATERAL keyword is a no-op since x doesn't contain any
side-reference to g(v).  So you get a plain join between g and
a single-row relation x.

If the SQL standard actually specified what LATERAL means, we could
argue about whether that's a correct interpretation or not.  I haven't
been able to find anyplace where the spec defines the semantics though.

And I'm fairly certain that we *don't* want it to mean "recompute
for every row generated to the left of the keyword, whether there is
a variable reference or not".  Consider for example
select ... from a, b, c join lateral d on ...

If the D item only contains references to C, it's unlikely that the
programmer wants it to be re-evaluated again for each possible row
in A*B.
        regards, tom lane



В списке pgsql-hackers по дате отправления:

Предыдущее
От: Pavel Stehule
Дата:
Сообщение: LATERAL and VOLATILE functions
Следующее
От: Pavel Stehule
Дата:
Сообщение: Re: LATERAL and VOLATILE functions