Re: [HACKERS] Query fails when SRFs are part of FROM clause (Commitid: 69f4b9c85f)

Поиск
Список
Период
Сортировка
От David G. Johnston
Тема Re: [HACKERS] Query fails when SRFs are part of FROM clause (Commitid: 69f4b9c85f)
Дата
Msg-id CAKFQuwagEp+crYYadtStn5_G-WcM=7uFBEwK5z79RF2dYTViWQ@mail.gmail.com
обсуждение исходный текст
Ответ на [HACKERS] Query fails when SRFs are part of FROM clause (Commit id: 69f4b9c85f)  (Rushabh Lathia <rushabh.lathia@gmail.com>)
Ответы Re: [HACKERS] Query fails when SRFs are part of FROM clause (Commitid: 69f4b9c85f)  ("David G. Johnston" <david.g.johnston@gmail.com>)
Re: [HACKERS] Query fails when SRFs are part of FROM clause (Commitid: 69f4b9c85f)  (Rushabh Lathia <rushabh.lathia@gmail.com>)
Список pgsql-hackers
On Fri, Jan 27, 2017 at 5:28 AM, Rushabh Lathia <rushabh.lathia@gmail.com> wrote:
Consider the below test;

CREATE TABLE tab ( a int primary key);

SELECT  *
FROM pg_constraint pc,
CAST(CASE WHEN pc.contype IN ('f','u','p') THEN generate_series(1, array_upper(pc.conkey, 1)) ELSE NULL END AS int) AS position;

Above query is failing with "set-valued function called in context that cannot
accept a set". But if I remove the CASE from the query then it working just good.

Like:

SELECT  * 
FROM pg_constraint pc,
CAST(generate_series(1, array_upper(pc.conkey, 1)) AS int) AS position;

This started failing with 69f4b9c85f168ae006929eec44fc44d569e846b9. It seems
check_srf_call_placement() sets the hasTargetSRFs flag and but when the SRFs
at the rtable ofcourse this flag doesn't get set. It seems like missing something
their, but I might be completely wrong as not quire aware of this area.


I'm a bit surprised that your query actually works...and without delving into source code its hard to explain why it should/shouldn't or whether the recent SRF work was intended to impact it.

In any case the more idiomatic way of writing your query these days (since 9.4 came out) is:

SELECT *
FROM pg_constraint pc
LEFT JOIN LATERAL generate_series(1, case when contype in ('f','p','u') then array_upper(pc.conkey, 1) else 0 end) gs ON true;

generate_series is smart enough to return an empty set (instead of erroring out) when provided with (1,0) as arguments.

David J.

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

Предыдущее
От: Robert Haas
Дата:
Сообщение: Re: [HACKERS] Parallel bitmap heap scan
Следующее
От: "David G. Johnston"
Дата:
Сообщение: Re: [HACKERS] Query fails when SRFs are part of FROM clause (Commitid: 69f4b9c85f)