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 по дате отправления: