diff --git a/CHANGELOG.md b/CHANGELOG.md index ecc181feb5..1760f3a8d4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/src/PostgREST/SchemaCache.hs b/src/PostgREST/SchemaCache.hs index 3b576fe792..84ef9c9c0b 100644 --- a/src/PostgREST/SchemaCache.hs +++ b/src/PostgREST/SchemaCache.hs @@ -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, diff --git a/test/spec/fixtures/schema.sql b/test/spec/fixtures/schema.sql index 87350b22e1..b830d81683 100644 --- a/test/spec/fixtures/schema.sql +++ b/test/spec/fixtures/schema.sql @@ -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;