Re: Postgres turns LEFT JOIN into INNER JOIN - incorrect results

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: Postgres turns LEFT JOIN into INNER JOIN - incorrect results
Дата
Msg-id 355906.1623765902@sss.pgh.pa.us
обсуждение исходный текст
Ответ на Postgres turns LEFT JOIN into INNER JOIN - incorrect results  (Floris Van Nee <florisvannee@Optiver.com>)
Список pgsql-bugs
Floris Van Nee <florisvannee@Optiver.com> writes:
> We've ran into a situation in which Postgres returns an incorrect query result. I've managed to narrow it down to the
followingreproducible example. I've encountered it on 12.4, but it reproduces on HEAD. 

I don't think this is incorrect.  I was stumped at first too, but then
I tried changing this:

> CREATE OR REPLACE FUNCTION test_internal(_a text)
> RETURNS TABLE(_a text)

to

CREATE OR REPLACE FUNCTION test_internal(_a text)
RETURNS TABLE(__a text)

and the issue went away.  After that it became pretty clear what
is happening: in

> CREATE OR REPLACE FUNCTION test(_a text)
> RETURNS TABLE(a text)
> LANGUAGE sql
> STABLE PARALLEL SAFE ROWS 1
> AS $function$
>    SELECT
>       t2.a
>    FROM (VALUES ('a')) t2(a)
>    LEFT JOIN test_internal(_a) t1 ON TRUE
>    WHERE t2.a = _a
> $function$
> ;

the unqualified "_a" in the WHERE clause is taken to refer to the output
column of "test_internal(_a) t1", not the outer function's parameter
as you're supposing.  Given that interpretation, it's valid to
strength-reduce the join.

Short answer: too many "_a"s.

            regards, tom lane



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

Предыдущее
От: Floris Van Nee
Дата:
Сообщение: RE: Postgres turns LEFT JOIN into INNER JOIN - incorrect results
Следующее
От: Eric Alders
Дата:
Сообщение: Postgres Escalating Lock based on Blocked Stmts