From: | Chapman Flack <chap(at)anastigmatix(dot)net> |
---|---|
To: | Paul Jungwirth <pj(at)illuminatedcomputing(dot)com>, pgsql-hackers(at)lists(dot)postgresql(dot)org |
Subject: | Re: range_agg with multirange inputs |
Date: | 2022-03-10 22:07:12 |
Message-ID: | 622A7690.4020800@anastigmatix.net |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
On 03/05/22 15:53, Paul Jungwirth wrote:
> On 3/1/22 13:33, Chapman Flack wrote:
>> I think the 4 lines should suffice, but it looks like this patch was
>> generated from a rebase of the old one (with three lines) that ended up
>> putting the new 'range_agg' entry ahead of 'max' in func.sgml, which
>> position is now baked into the 4 lines of context. :)
>
> You're right, my last rebase messed up the docs. Here it is fixed. Sorry
> about that!
When I apply this patch, I get a func.sgml with two entries for
range_intersect_agg(anymultirange).
> I like the elog solution. I've changed them in both places.
It looks like you've now got elog in three places: the "must be called
with a range or multirange" in multirange_agg_transfn and
multirange_intersect_agg_transfn, and the "called in non-aggregate
context" in multirange_agg_transfn.
I think that last is also ok, given that its state type is internal,
so it shouldn't be reachable in a user call.
In range_agg_transfn, you've changed the message in the "must be called
with a range or multirange"; that seems like another good candidate to
be an elog.
> I see 13 other shared finalfns (using select array_agg(aggfnoid::regproc) as
> procs, array_agg(aggtransfn) as transfns, aggfinalfn from pg_aggregate where
> aggfinalfn is distinct from 0 group by aggfinalfn having count(*) > 1;) but
> a comment can't hurt! Added.
I think your query finds aggregate declarations that share the same SQL
function declaration as their finalizer functions. That seems to be more
common.
The query I used looks for cases where different SQL-declared functions
appear as finalizers of aggregates, but the different SQL declared functions
share the same internal C implementation. That's the query where this seems
to be the unique result.
WITH
finals(regp) AS (
SELECT DISTINCT
CAST(aggfinalfn AS regprocedure)
FROM
pg_aggregate
WHERE
aggfinalfn <> 0 -- InvalidOid
)
SELECT
prosrc, array_agg(regp)
FROM
pg_proc, finals
WHERE
oid = regp AND prolang = 12 -- INTERNALlanguageId
GROUP BY
prosrc
HAVING
count(*) > 1;
In other words, I think the interesting thing to say in the C comment
is not "shared by range_agg(anyrange) and range_agg(anymultirange)", but
"shared by range_agg_finalfn(internal,anyrange) and
multirange_agg_finalfn(internal,anymultirange)".
It seems a little extra surprising to have one C function declared in SQL
with two different names and parameter signatures. It ends up working
out because it relies on get_fn_expr_rettype, which can do its job for
either polymorphic type it might find in the parameter declaration.
But that's a bit subtle. :)
Regards,
-Chap
From | Date | Subject | |
---|---|---|---|
Next Message | David G. Johnston | 2022-03-10 22:12:27 | Re: role self-revocation |
Previous Message | Justin Pryzby | 2022-03-10 22:06:12 | Re: Adding CI to our tree |