Skip to content

Commit

Permalink
fix: Prevent infinite recursion with self-referencing views
Browse files Browse the repository at this point in the history
Fixes PostgREST#2283

Signed-off-by: Wolfgang Walther <[email protected]>
  • Loading branch information
wolfgangwalther committed Oct 26, 2022
1 parent 3bee6b1 commit 9be6747
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 3 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
14 changes: 11 additions & 3 deletions src/PostgREST/SchemaCache.hs
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand 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,
Expand Down
4 changes: 4 additions & 0 deletions test/spec/fixtures/schema.sql
Original file line number Diff line number Diff line change
Expand Up @@ -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;

0 comments on commit 9be6747

Please sign in to comment.