From: Tom Lane Date: Wed, 23 Mar 2005 19:07:03 +0000 (+0000) Subject: Previous "64-bit fix" for intagg didn't actually work. This is already X-Git-Tag: REL7_4_8~28 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b4fd104204c0cd81fe942511e172a867b5a29704;p=postgresql Previous "64-bit fix" for intagg didn't actually work. This is already fixed properly in CVS tip, but we need a band-aid for back branches. Per report from Ron Mayer. --- diff --git a/contrib/intagg/int_aggregate.c b/contrib/intagg/int_aggregate.c index cb0f1f3a45..75cd34fe6e 100644 --- a/contrib/intagg/int_aggregate.c +++ b/contrib/intagg/int_aggregate.c @@ -144,10 +144,12 @@ int_agg_state(PG_FUNCTION_ARGS) PGARRAY *state; PGARRAY *p; - if (PG_ARGISNULL(0)) - state = NULL; - else - state = (PGARRAY *) PG_GETARG_POINTER(0); + /* + * We can keep a pointer in the datum even though nodeAgg thinks it's + * an int4. Note we assume the initial state of int4 zero will look + * like a null pointer. + */ + state = (PGARRAY *) PG_GETARG_POINTER(0); p = GetPGArray(state, 1); if (!PG_ARGISNULL(1)) diff --git a/contrib/intagg/int_aggregate.sql.in b/contrib/intagg/int_aggregate.sql.in index caaf01afdb..af31f22839 100644 --- a/contrib/intagg/int_aggregate.sql.in +++ b/contrib/intagg/int_aggregate.sql.in @@ -1,16 +1,22 @@ -- Adjust this setting to control where the objects get created. SET search_path = public; +-- +-- The aggregate transition state (denoted INT4 in caps below) is really +-- an array, ie, int4[]. We have to lie and pretend it is a pass-by-value +-- datatype so that nodeAgg.c will not try to do memory management for it. +-- + -- Internal function for the aggregate -- Is called for each item in an aggregation -CREATE OR REPLACE FUNCTION int_agg_state (int4[], int4) -RETURNS int4[] +CREATE OR REPLACE FUNCTION int_agg_state (INT4, int4) +RETURNS INT4 AS 'MODULE_PATHNAME','int_agg_state' -LANGUAGE 'C'; +LANGUAGE 'C' STRICT; -- Internal function for the aggregate -- Is called at the end of the aggregation, and returns an array. -CREATE OR REPLACE FUNCTION int_agg_final_array (int4[]) +CREATE OR REPLACE FUNCTION int_agg_final_array (INT4) RETURNS int4[] AS 'MODULE_PATHNAME','int_agg_final_array' LANGUAGE 'C' STRICT; @@ -20,14 +26,15 @@ LANGUAGE 'C' STRICT; CREATE AGGREGATE int_array_aggregate ( BASETYPE = int4, SFUNC = int_agg_state, - STYPE = int4[], - FINALFUNC = int_agg_final_array + STYPE = INT4, + FINALFUNC = int_agg_final_array, + INITCOND = 0 ); -- The aggregate component functions are not designed to be called -- independently, so disable public access to them -REVOKE ALL ON FUNCTION int_agg_state (int4[], int4) FROM PUBLIC; -REVOKE ALL ON FUNCTION int_agg_final_array (int4[]) FROM PUBLIC; +REVOKE ALL ON FUNCTION int_agg_state (INT4, int4) FROM PUBLIC; +REVOKE ALL ON FUNCTION int_agg_final_array (INT4) FROM PUBLIC; -- The enumeration function -- returns each element in a one dimensional integer array