1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-15 19:21:59 +03:00

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.
This commit is contained in:
Tom Lane
2005-03-23 19:07:18 +00:00
parent acb42e9cb9
commit ce49ae9041
2 changed files with 21 additions and 12 deletions

View File

@ -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))

View File

@ -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