parent_01_10 partition of main_parent for values from (0) to (10) partition by list (id);
create table parent_10_20 partition of main_parent for values from (10) to (20) partition by list (id);
create table parent_20_30 partition of main_parent for values from (20) to (30) partition by list (id);
create table parent_01 partition of parent_01_10 for values in (1);
create table parent_11 partition of parent_10_20 for values in (11);
create table parent_21 partition of parent_20_30 for values in (21);
with recursive src as (
select t.inhparent::regclass, t.inhrelid::regclass
from pg_catalog.pg_inherits t
where t.inhparent = 'main_parent'::regclass
union all
select t.inhparent::regclass, t.inhrelid::regclass
from pg_catalog.pg_inherits t join src on t.inhparent = src.inhrelid
)
select src.*, c.relkind, s.*
from src
join pg_class c on c.oid = src.inhrelid
left join lateral (select * from pgstattuple_approx(src.inhrelid) where c.relkind != 'p' offset 0) s on c.relkind != 'p'
а почему тут без offset 0 не работает? это баг или фича?
https://dbfiddle.uk/Cas7B80n
наверно всё же фича, ничто же не запрещает postgres переносить условие из подзапроса в join
Похоже, что функция из pgstattuple сходит с ума, когда пытается примениться на пустом сете внутри lateral join Можно вместо offset 0 написать offset null или limit 1, тоже работает. Это точно не задокументированное поведение, так что больше похоже на плохую совместимость этой функции из расширения с планировщиком при использовании lateral join. А костыль с offset/limit просто меняет разбор запроса, план иначе строится и выполняется
Обсуждают сегодня