incomplete removal of not referenced CTEs

Поиск
Список
Период
Сортировка
От Tomas Vondra
Тема incomplete removal of not referenced CTEs
Дата
Msg-id 39c62675-6b37-5482-52c5-aa84c0fbe896@2ndquadrant.com
обсуждение исходный текст
Ответы Re: incomplete removal of not referenced CTEs  (Andres Freund <andres@anarazel.de>)
Re: incomplete removal of not referenced CTEs  (Tom Lane <tgl@sss.pgh.pa.us>)
Список pgsql-hackers
Hi,

While investigating a CTE-related query, I've noticed that we don't
really remove all unreachable CTEs. For example, for this query
   with a as (select 1),        b as (select * from a),        c as (select * from b)   select 2;

where none of the CTEs if (directly or indirectly) referenced from the
query, we get a plan like this:
                      QUERY PLAN
---------------------------------------------------------Result  (cost=0.03..0.04 rows=1 width=4)  CTE a    ->  Result
(cost=0.00..0.01rows=1 width=4)  CTE b    ->  CTE Scan on a  (cost=0.00..0.02 rows=1 width=4)
 
(5 rows)

So we only remove the top-level CTE, but we fail to remove the other
CTEs because we don't tweak the refcount in SS_process_ctes().

Of course, it's harmless as none of those CTEs gets actually executed,
but is this intentional, or do we want/need to fix it? I don't see
anything about this in the docs, but it seems a bit awkward and
confusing to remove only some of the CTEs - I think we should either
remove all or none of them.

I don't think that should be particularly difficult - ISTM we need to
make SS_process_ctes a bit smarter, essentially by adding a loop to
remove the CTEs recursively (and decrease the refcount).

regards

-- 
Tomas Vondra                  http://www.2ndQuadrant.com
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services



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

Предыдущее
От: Peter van Hardenberg
Дата:
Сообщение: Re: \timing interval
Следующее
От: Tom Lane
Дата:
Сообщение: Re: \timing interval