fix: Prevent infinite recursion with self-referencing views

Fixes #2283

Signed-off-by: Wolfgang Walther <walther@technowledgy.de>
This commit is contained in:
Wolfgang Walther
2022-10-26 21:33:30 +02:00
parent 3bee6b1e27
commit 9be6747b66
3 changed files with 16 additions and 3 deletions
+1
View File
@@ -14,6 +14,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
- #2518, Fix a regression when embedding views where base tables have a different column order for FK columns - @wolfgangwalther
- #2458, Fix a regression with the location header when inserting into views with PKs from multiple tables - @wolfgangwalther
- #2356, Fix a regression in openapi output with mode follow-privileges - @wolfgangwalther
- #2283, Fix infinite recursion when loading schema cache with self-referencing view - @wolfgangwalther
### Deprecated
+11 -3
View File
@@ -895,8 +895,13 @@ allViewsKeyDependencies =
(entry->>'resorigcol')::int as resorigcol
from target_entries
),
recursion as(
select r.*
-- CYCLE detection according to PG docs: https://www.postgresql.org/docs/current/queries-with.html#QUERIES-WITH-CYCLE
-- Can be replaced with CYCLE clause once PG v13 is EOL.
recursion(view_id, view_schema, view_name, view_column, resorigtbl, resorigcol, is_cycle, path) as(
select
r.*,
false,
ARRAY[resorigtbl]
from results r
where view_schema = ANY ($1)
union all
@@ -906,9 +911,12 @@ allViewsKeyDependencies =
view.view_name,
view.view_column,
tab.resorigtbl,
tab.resorigcol
tab.resorigcol,
tab.resorigtbl = ANY(path),
path || tab.resorigtbl
from recursion view
join results tab on view.resorigtbl=tab.view_id and view.resorigcol=tab.view_column
where not is_cycle
)
select
sch.nspname as table_schema,
+4
View File
@@ -2902,3 +2902,7 @@ $$;
create trigger ins instead of insert on with_multiple_pks
for each row execute procedure with_multiple_pks_insert();
-- issue https://github.com/PostgREST/postgrest/issues/2283
create view self_recursive_view as table projects;
create or replace view self_recursive_view as table self_recursive_view;