Re: Add pg_basetype() function to obtain a DOMAIN base type

Поиск
Список
Период
Сортировка
От Steve Chavez
Тема Re: Add pg_basetype() function to obtain a DOMAIN base type
Дата
Msg-id CAGRrpzbr6b7VP=DvGZ2W5t-NyczzBUZfd4qCVm7pVPepJOLaUw@mail.gmail.com
обсуждение исходный текст
Ответ на Add pg_basetype() function to obtain a DOMAIN base type  (Steve Chavez <steve@supabase.io>)
Ответы Re: Add pg_basetype() function to obtain a DOMAIN base type  (Alexander Korotkov <aekorotkov@gmail.com>)
Список pgsql-hackers
Just to give a data point for the need of this function:


This is also a common use case for services/extensions that require postgres metadata for their correct functioning, like postgREST or pg_graphql.

Here's a query for getting domain base types, taken from the postgREST codebase:

So having `pg_basetype` would be really helpful in those cases.

Looking forward to hearing any feedback. Or if this would be a bad idea.

Best regards,
Steve Chavez

On Sat, 9 Sept 2023 at 01:17, Steve Chavez <steve@supabase.io> wrote:
Hello hackers,

Currently obtaining the base type of a domain involves a somewhat long recursive query. Consider:

```
create domain mytext as text;
create domain mytext_child_1 as mytext;
create domain mytext_child_2 as mytext_child_1;
```

To get `mytext_child_2` base type we can do:

```
WITH RECURSIVE
recurse AS (
  SELECT
    oid,
    typbasetype,
    COALESCE(NULLIF(typbasetype, 0), oid) AS base
  FROM pg_type
  UNION
  SELECT
    t.oid,
    b.typbasetype,
    COALESCE(NULLIF(b.typbasetype, 0), b.oid) AS base
  FROM recurse t
  JOIN pg_type b ON t.typbasetype = b.oid
)
SELECT
  oid::regtype,
  base::regtype
FROM recurse
WHERE typbasetype = 0 and oid = 'mytext_child_2'::regtype;

      oid       | base
----------------+------
 mytext_child_2 | text
```

Core has the `getBaseType` function, which already gets a domain base type recursively.

I've attached a patch that exposes a `pg_basetype` SQL function that uses `getBaseType`, so the long query above just becomes:

```
select pg_basetype('mytext_child_2'::regtype);
 pg_basetype
-------------
 text
(1 row)
```

Tests and docs are added.

Best regards,
Steve Chavez

В списке pgsql-hackers по дате отправления:

Предыдущее
От: torikoshia
Дата:
Сообщение: Re: POC PATCH: copy from ... exceptions to: (was Re: VLDB Features)
Следующее
От: Peter Eisentraut
Дата:
Сообщение: Re: pg_resetwal tests, logging, and docs update