69{
70 MemoryContext aggcontext, old;
74 Datum argType = get_fn_expr_argtype(fcinfo->flinfo, 1);
75
76 if (argType == InvalidOid)
77 ereport(ERROR,
78 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
79 errmsg("could not determine input data type")));
80
81 if ( ! AggCheckCallContext(fcinfo, &aggcontext) )
82 {
83
84 elog(ERROR, "%s called in non-aggregate context", __func__);
85 aggcontext = NULL;
86 }
87
88 if ( PG_ARGISNULL(0) )
89 {
91
95
96 for (int i = 0; i < n; i++)
97 {
98 Datum argument = PG_GETARG_DATUM(i+2);
99 Oid dataOid = get_fn_expr_argtype(fcinfo->flinfo, i+2);
100 old = MemoryContextSwitchTo(aggcontext);
101 state->
data[i] = datumCopy(argument, get_typbyval(dataOid), get_typlen(dataOid));
102 MemoryContextSwitchTo(old);
103 }
104 }
105 else
106 {
108 }
109
110 if (!PG_ARGISNULL(1))
111 gser = PG_GETARG_GSERIALIZED_P(1);
112
113
114 old = MemoryContextSwitchTo(aggcontext);
115 if (gser)
117
118
121 else
122 state->
geoms = list_make1(geom);
123
124 MemoryContextSwitchTo(old);
125
126 PG_RETURN_POINTER(state);
127}
LWGEOM * lwgeom_from_gserialized(const GSERIALIZED *g)
Allocate a new LWGEOM from a GSERIALIZED.
LWGEOM * lwgeom_clone_deep(const LWGEOM *lwgeom)
Deep clone an LWGEOM, everything is copied.
#define CollectionBuildStateDataSize
To pass the internal state of our collection between the transfn and finalfn we need to wrap it into ...
Datum data[CollectionBuildStateDataSize]