Datum pg_req_float_sketch_merge_agg()

in src/req_float_sketch_pg_functions.c [97:134]


Datum pg_req_float_sketch_merge_agg(PG_FUNCTION_ARGS) {
  void* sketchptr;
  bytea* sketch_bytes;
  void* in_sketchptr;
  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_merge_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 ? k : DEFAULT_K, hra);
  } else {
    sketchptr = PG_GETARG_POINTER(0);
  }

  sketch_bytes = PG_GETARG_BYTEA_P(1);
  in_sketchptr = req_float_sketch_deserialize(VARDATA(sketch_bytes), VARSIZE(sketch_bytes) - VARHDRSZ);
  req_float_sketch_merge(sketchptr, in_sketchptr);
  req_float_sketch_delete(in_sketchptr);

  MemoryContextSwitchTo(oldcontext);

  PG_RETURN_POINTER(sketchptr);
}