/* * cmsketch_agg transition function - * * adds the given element to the transition cmsketch using the given value for p and n */ Datum cmsketch_agg_transp(PG_FUNCTION_ARGS) { MemoryContext old; MemoryContext context; CountMinSketch *state; Datum incoming = PG_GETARG_DATUM(1); float8 eps = PG_GETARG_FLOAT8(2); float8 p = PG_GETARG_FLOAT8(3); if (!AggCheckCallContext(fcinfo, &context)) elog(ERROR, "cmsketch_agg_transp called in non-aggregate context"); old = MemoryContextSwitchTo(context); if (PG_ARGISNULL(0)) state = cmsketch_startup(fcinfo, eps, p); else state = (CountMinSketch *) PG_GETARG_VARLENA_P(0); state = cmsketch_add_datum(fcinfo, state, incoming, 1); MemoryContextSwitchTo(old); PG_RETURN_POINTER(state); }
Datum cmsketch_add(PG_FUNCTION_ARGS) { CountMinSketch *cms = (CountMinSketch *) PG_GETARG_VARLENA_P(0); fcinfo->flinfo->fn_extra = lookup_type_cache(get_fn_expr_argtype(fcinfo->flinfo, 1), 0); cms = cmsketch_add_datum(fcinfo, cms, PG_GETARG_DATUM(1)); PG_RETURN_POINTER(cms); }
Datum cmsketch_addn(PG_FUNCTION_ARGS) { CountMinSketch *cms; int32 n = PG_GETARG_INT32(2); if (PG_ARGISNULL(0)) cms = CountMinSketchCreate(); else cms = (CountMinSketch *) PG_GETARG_VARLENA_P(0); if (n < 0) ereport(ERROR, (errcode(ERRCODE_INVALID_PARAMETER_VALUE), errmsg("cmsketch type doesn't support negative increments"))); if (n) { fcinfo->flinfo->fn_extra = lookup_type_cache(get_fn_expr_argtype(fcinfo->flinfo, 1), 0); cms = cmsketch_add_datum(fcinfo, cms, PG_GETARG_DATUM(1), n); } PG_RETURN_POINTER(cms); }