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:
@ -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))
|
||||
|
@ -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
|
||||
|
Reference in New Issue
Block a user