Re: general purpose array_sort

From: Junwang Zhao <zhjwpku(at)gmail(dot)com>
To: jian he <jian(dot)universality(at)gmail(dot)com>
Cc: "David G(dot) Johnston" <david(dot)g(dot)johnston(at)gmail(dot)com>, PostgreSQL Hackers <pgsql-hackers(at)lists(dot)postgresql(dot)org>, "andreas(at)proxel(dot)se" <andreas(at)proxel(dot)se>, Robert Haas <robertmhaas(at)gmail(dot)com>, Amit Langote <amitlangote09(at)gmail(dot)com>
Subject: Re: general purpose array_sort
Date: 2024-10-02 14:46:15
Message-ID: CAEG8a3KUiAM6_DSQHQb6Ox0Og1S7-sT5h45WJsmkF_Y-tGHKoQ@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Wed, Oct 2, 2024 at 9:51 AM jian he <jian(dot)universality(at)gmail(dot)com> wrote:
>
> > >
> > > + typentry = (TypeCacheEntry *) fcinfo->flinfo->fn_extra;
> > > + if (typentry == NULL || typentry->type_id != elmtyp)
> > > + {
> > > + typentry = lookup_type_cache(elmtyp, sort_asc ? TYPECACHE_LT_OPR :
> > > TYPECACHE_GT_OPR);
> > > + fcinfo->flinfo->fn_extra = (void *) typentry;
> > > + }
> > > you need to one-time check typentry->lt_opr or typentry->gt_opr exists?
> > > see CreateStatistics.
> > > /* Disallow data types without a less-than operator */
> > > type = lookup_type_cache(attForm->atttypid, TYPECACHE_LT_OPR);
> > > if (type->lt_opr == InvalidOid)
> > > ereport(ERROR,
> > > (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
> > > errmsg("column \"%s\" cannot be used in
> > > statistics because its type %s has no default btree operator class",
> > > attname, format_type_be(attForm->atttypid))));
> >
> > I added an Assert for this part, not sure if that is enough.
> >
>
> i think it really should be:
>
> if (typentry == NULL || typentry->type_id != elmtyp)
> {
> typentry = lookup_type_cache(elmtyp, sort_asc ? TYPECACHE_LT_OPR :
> TYPECACHE_GT_OPR);
> fcinfo->flinfo->fn_extra = (void *) typentry;
> if ((sort_asc && !OidIsValid(typentry->lt_opr) || (!sort_as &&
> OidIsValid(typentry->gt_opr));
> ereport(ERROR,....)
> }
>
> Imagine a type that doesn't have TYPECACHE_LT_OPR or TYPECACHE_GT_OPR
> then we cannot do the sort, we should just error out.
>
> I just tried this colour type [1] with (CREATE TYPE colour (INPUT =
> colour_in, OUTPUT = colour_out, LIKE = pg_catalog.int4);
>
> select array_sort('{#FF0000, #FF0000}'::colour[]);
> of course it will segfault with your new Assert.
>
>
> [1] https://github.com/hlinnaka/colour-datatype/blob/master/colour.c

Make sense, PFA v5 with Jian's suggestion.

--
Regards
Junwang Zhao

Attachment Content-Type Size
v5-0001-general-purpose-array_sort.patch application/octet-stream 19.9 KB

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Tony Wayne 2024-10-02 15:02:02 Re: bgwrite process is too lazy
Previous Message Laurenz Albe 2024-10-02 14:44:46 Re: bgwrite process is too lazy