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: