Re: Patch: Add parse_type Function - Mailing list pgsql-hackers

From David E. Wheeler
Subject Re: Patch: Add parse_type Function
Date
Msg-id F445E541-BAFB-4E29-B5BF-ECD1A014E952@justatheory.com
Whole thread Raw
In response to Re: Patch: Add parse_type Function  (Erik Wienhold <ewie@ewie.name>)
Responses Re: Patch: Add parse_type Function
List pgsql-hackers
On Feb 10, 2024, at 20:52, Erik Wienhold <ewie@ewie.name> wrote:
>
> Let me comment on some issues since I wrote the very first version of
> parse_type() on which David's patch is based.

Thanks Erik.

>> On 2024-02-01 01:00 +0100, jian he <jian.universality@gmail.com> wrote:
>> if you are wondering around other code deal with NULL, ErrorSaveContext.
>> NULL would be more correct?
>> `(void) parseTypeString(type, &typid, &typmod, NULL);`

Fixed.

>> also parseTypeString already explained the third argument, our
>> comments can be simplified as:
>> /*
>> * Parse type-name argument to obtain type OID and encoded typmod. We don't
>> * need to handle parseTypeString failure, just let the error be
>> * raised.
>> */


Thanks, adopted that language.

>> cosmetic issue. Looking around other error handling code, the format
>> should be something like:
>> `
>> if (get_call_result_type(fcinfo, NULL, &tupdesc) != TYPEFUNC_COMPOSITE)
>>    ereport(ERROR,
>>                  (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
>>                    errmsg("function returning record called in"
>>                                 "context that cannot accept type record")));
>> `
>
> +1

I poked around and found some other examples, yes. I went with a single long line for errmsg following the example in
adminpack.c[1]

>> `PG_FUNCTION_INFO_V1(parse_type);`
>> is unnecessary?
>> based on the error information:  https://cirrus-ci.com/task/5899457502380032
>> not sure why it only fails on windows.
>
> Yeah, it's not necessary for internal functions per [1].  It's a
> leftover from when this function was part of the pgtap extension.

Removed.

>> +#define PARSE_TYPE_STRING_COLS 2 /* Returns two columns. */
>> +#undef PARSE_TYPE_STRING_COLS
>> Are these necessary?
>> given that the comments already say return the OID and type modifier.
>
> Not sure what the convention here is but I found this in a couple of
> places, maybe even a tutorial on writing C functions.  See
> `git grep '_COLS\s\+[1-9]'` for those instances.  It's in line with my
> habit of avoiding magic constants.

Left in place for now.

>
>> +        ( <parameter>typid</parameter> <type>oid</type>,
>> +          <parameter>typmod</parameter> <type>int4</type> )
>> here `int4` should be `integer`?
>
> +1

Fixed.

> Yes, the sentence is rather handwavy.  What is meant here is that this
> function also resolves types whose typmod is determined by the SQL
> parser or some step after that.  There are types whose typmod is
> whatever value is found inside the parenthesis, e.g. bit(13) has typmod
> 13.  Our first idea before coming up with that function was to do some
> string manipulation and extract the typmod from inside the parenthesis.
> But we soon found out that other typmods don't translate one to one,
> e.g.  varchar(13) has typmod 17.  The interval type is also special
> because the typmod is some bitmask encoding of e.g. 'second(0)'.  Hence
> the mention of the SQL grammar.

I adopted some of your language here --- and fixed the spelling errors :-)

>> can be simplified:
>> +       <para>
>> +        Parses a string representing an SQL data type, optionally
>> schema-qualified.
>> +        Returns a record with two fields, <parameter>typid</parameter> and
>> +        <parameter>typmod</parameter>, representing the OID and
>> modifier for the
>> +        type. These correspond to the parameters to pass to the
>> +        <link linkend="format_type"><function>format_type</function>
>> function.</link>
>> +       </para>
>> (I don't have a strong opinion though)
>
> Sounds better.  The CREATE TABLE reference is superfluous.

Done.

Best,

David
[1]
https://github.com/postgres/postgres/blob/09eb633e1baa3b7cd7929f3cc77f9c46f63c20b1/contrib/adminpack/adminpack.c#L508-L511




Attachment

pgsql-hackers by date:

Previous
From: David Benjamin
Date:
Subject: Re: [PATCH] Avoid mixing custom and OpenSSL BIO functions
Next
From: Dave Cramer
Date:
Subject: Re: [PATCH] Add native windows on arm64 support