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

Поиск
Список
Период
Сортировка
От Rushabh Lathia
Тема Re: [HACKERS] Query fails when SRFs are part of FROM clause (Commitid: 69f4b9c85f)
Дата
Msg-id CAGPqQf3CvVz=4XJkQbOcFB_4ARdxbAPDCF6ex6cdGReaqE-_TQ@mail.gmail.com
обсуждение исходный текст
Ответ на Re: [HACKERS] Query fails when SRFs are part of FROM clause (Commitid: 69f4b9c85f)  ("David G. Johnston" <david.g.johnston@gmail.com>)
Список pgsql-hackers


On Sat, Jan 28, 2017 at 3:43 AM, David G. Johnston <david.g.johnston@gmail.com> wrote:
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.


Thanks for the providing work-around query and I also understood your point.

At the same time reason to raise this issue was, because this was working before
69f4b9c85f168ae006929eec44fc44d569e846b9 commit and now its throwing
an error. So whether its intended or query started failing because of some
bug introduced with the commit.

Issues is reproducible when query re-written with LEFT JOIN LATERAL and I
continue to use CASE statement. 

SELECT *
FROM pg_constraint pc
LEFT JOIN LATERAL CAST((CASE WHEN pc.contype IN ('f','u','p') THEN generate_series(1, array_upper(pc.conkey, 1)) ELSE NULL END) AS int) gs ON true;
ERROR:  set-valued function called in context that cannot accept a set



David J.




--
Rushabh Lathia

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

Предыдущее
От: Andres Freund
Дата:
Сообщение: Re: [HACKERS] WIP: About CMake v2
Следующее
От: Kyotaro HORIGUCHI
Дата:
Сообщение: Re: [HACKERS] Radix tree for character conversion