From 01a18d819980637962eb040ea78800882a773f0c Mon Sep 17 00:00:00 2001 From: Wolfgang Walther Date: Sun, 7 Jul 2024 21:59:56 +0200 Subject: [PATCH] fix: List correct enum options when multiple types with same name are 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. --- CHANGELOG.md | 1 + src/PostgREST/SchemaCache.hs | 9 ++++----- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bd286a051..c263acdc9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -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 diff --git a/src/PostgREST/SchemaCache.hs b/src/PostgREST/SchemaCache.hs index f1aac53b6..71fc3c8bd 100644 --- a/src/PostgREST/SchemaCache.hs +++ b/src/PostgREST/SchemaCache.hs @@ -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 @@ -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 (