Skip to content

Commit

Permalink
fix: List correct enum options when multiple types with same name are…
Browse files Browse the repository at this point in the history
… present

The schema cache and OpenAPI output would currently list the first found
enum with the same name instead of the correct type. One other case
where this comes up is when a regular type and an enum type have the
same name. For example in the spec fixtures, we have an enum called
"bit". Every "bit" type, no matter whether it's that enum or the
built-in bit type, will show those enum options in the OpenApi output.

Not adding a test, because OpenAPI is supposed to go away in the future
anyway.
  • Loading branch information
wolfgangwalther committed Jul 9, 2024
1 parent 1747a4f commit 01a18d8
Show file tree
Hide file tree
Showing 2 changed files with 5 additions and 5 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ This project adheres to [Semantic Versioning](http://semver.org/).
- #3093, Nested empty embeds no longer show empty values and are correctly omitted - @laurenceisla
- #3644, Make --dump-schema work with in-database pgrst.db_schemas setting - @wolfgangwalther
- #3644, Show number of timezones in schema cache load report - @wolfgangwalther
- #3644, List correct enum options in OpenApi output when multiple types with same name are present - @wolfgangwalther

### Changed

Expand Down
9 changes: 4 additions & 5 deletions src/PostgREST/SchemaCache.hs
Original file line number Diff line number Diff line change
Expand Up @@ -651,7 +651,7 @@ tablesSqlQuery =
information_schema._pg_truetypid(a.*, t.*),
information_schema._pg_truetypmod(a.*, t.*)
)::integer AS character_maximum_length,
COALESCE(bt.typname, t.typname)::name AS udt_name,
COALESCE(bt.oid, t.oid) AS base_type,
a.attnum::integer AS position
FROM pg_attribute a
LEFT JOIN pg_description AS d
Expand Down Expand Up @@ -688,14 +688,13 @@ tablesSqlQuery =
FROM columns info
LEFT OUTER JOIN (
SELECT
n.nspname AS s,
t.typname AS n,
e.enumtypid,
array_agg(e.enumlabel ORDER BY e.enumsortorder) AS vals
FROM pg_type t
JOIN pg_enum e ON t.oid = e.enumtypid
JOIN pg_namespace n ON n.oid = t.typnamespace
GROUP BY s,n
) AS enum_info ON info.udt_name = enum_info.n
GROUP BY enumtypid
) AS enum_info ON info.base_type = enum_info.enumtypid
GROUP BY info.relid
),
tbl_pk_cols AS (
Expand Down

0 comments on commit 01a18d8

Please sign in to comment.