summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2005-03-23 19:07:18 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2005-03-23 19:07:18 +0000
commitce49ae9041cb03df45d75da9135ea8a0c6de0e45 (patch)
tree58ada037a79e2d2aab3cda3b057bc341a30f8a0b
parentacb42e9cb91be1117f10662e4f0a1c51d5d55469 (diff)
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.
-rw-r--r--contrib/intagg/int_aggregate.c10
-rw-r--r--contrib/intagg/int_aggregate.sql.in23
2 files changed, 21 insertions, 12 deletions
diff --git a/contrib/intagg/int_aggregate.c b/contrib/intagg/int_aggregate.c
index abb84801fb2..b964bf8862c 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 caaf01afdb9..af31f228393 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