in src/req_float_sketch_pg_functions.c [61:95]
Datum pg_req_float_sketch_build_agg(PG_FUNCTION_ARGS) {
void* sketchptr;
float value;
int k;
bool hra;
MemoryContext oldcontext;
MemoryContext aggcontext;
if (PG_ARGISNULL(0) && PG_ARGISNULL(1)) {
PG_RETURN_NULL();
} else if (PG_ARGISNULL(1)) {
PG_RETURN_POINTER(PG_GETARG_POINTER(0)); // no update value. return unmodified state
}
if (!AggCheckCallContext(fcinfo, &aggcontext)) {
elog(ERROR, "req_float_sketch_build_agg called in non-aggregate context");
}
oldcontext = MemoryContextSwitchTo(aggcontext);
if (PG_ARGISNULL(0)) {
k = PG_NARGS() > 2 ? PG_GETARG_INT32(2) : DEFAULT_K;
hra = PG_NARGS() > 3 ? PG_GETARG_BOOL(3) : true;
sketchptr = req_float_sketch_new(k, hra);
} else {
sketchptr = PG_GETARG_POINTER(0);
}
value = PG_GETARG_FLOAT4(1);
req_float_sketch_update(sketchptr, value);
MemoryContextSwitchTo(oldcontext);
PG_RETURN_POINTER(sketchptr);
}