Re: Patch: Add parse_type Function

From: Pavel Stehule <pavel(dot)stehule(at)gmail(dot)com>
To: "David E(dot) Wheeler" <david(at)justatheory(dot)com>
Cc: pgsql-hackers(at)lists(dot)postgresql(dot)org
Subject: Re: Patch: Add parse_type Function
Date: 2024-02-04 18:02:46
Message-ID: CAFj8pRAznFqDDO+X7KuavA3D9tOsQ2rZweiKeRyC+WPTgze6SA@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Hi

ne 4. 2. 2024 v 18:51 odesílatel David E. Wheeler <david(at)justatheory(dot)com>
napsal:

> Hackers,
>
> Attached is a patch to add a new function, `parse_type()`. It parses a
> type string and returns a record with the typid and typmod for the type, or
> raises an error if the type is invalid. It’s effectively a thin layer over
> the parser’s parseTypeString() function.
>
> The purpose of this function is to allow uses to resolve any type name,
> including aliases, to its formal name as rendered by, for example, pg_dump.
> An example:
>
> david=# WITH s(s) AS (
> SELECT * FROM unnest(ARRAY[
> 'timestamp(4)',
> 'interval(0)',
> 'interval second(0)',
> 'timestamptz',
> 'timestamptz(6)',
> 'varchar',
> 'varchar(128)'
> ])
> ),
> p(type, typid, typmod) AS (
> SELECT s, ((parse_type(s)).*)
> FROM s
> )
> SELECT type, format_type(typid, typmod) FROM p;
> type | format_type
> --------------------+--------------------------------
> timestamp(4) | timestamp(4) without time zone
> interval(0) | interval(0)
> interval second(0) | interval second(0)
> timestamptz | timestamp with time zone
> timestamptz(6) | timestamp(6) with time zone
> varchar | character varying
> varchar(128) | character varying(128)
> (7 rows)
>
>
> The use case leading to this patch was pgTAP column data type assertions.
> pgTAP traditionally required full type names for testing data types, but
> recently added support for aliases. This broke for some types, because it
> was difficult to extract the typmod correctly, and even when we did, it
> failed for types such as `interval second(0)`, where `second (0)` is the
> typmod, and there was no sensible way to access the bit mask to generate
> the proper typmod to pass to `format_type()`.
>
> Erik Wienhold wrote this function to solve the problem, and I volunteered
> to submit a patch.
>
> Potential issues and questions for this patch:
>
> * Is `parse_type()` the right name to use? I can see arguments for
> `parse_type_string()`, `pg_parse_type()`, and `pg_parse_type_string()`.
> Whatever the consensus is works for me.
>

there can be an analogy with parse_ident, so parse_type looks ok

> * The function returns a record, which is a little fussy. I could see
> adding a `format_type_string()` function that just contains `SELECT
> format_type(p.typmod, p.typid) FROM parse_type($1) p` and returns the
> formatted type. But I think it might also be useful to have access to the
> typmod and typid directly via this method, since they’re already exposed as
> `format_type()`’s arguments.
>

I think so record has sense for this case

>
> * Is format_type.c the right home for the function? I put it there because
> I closely associate it with format_type(), but happy to move it to a more
> appropriate location.
>

yes

>
> * I tried to link to `format_type` from the docs entry for `parse_type`,
> and added an ID for the former, but I’m not sure it resolves.
>

I thinks so proposed functionality can be useful

Regards

Pavel

>
> Best,
>
> David
>
>

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Tom Lane 2024-02-04 18:13:53 Re: Draft release notes for minor releases are up
Previous Message Tom Lane 2024-02-04 18:02:03 Re: Clean up command argument assembly