Exemple #1
0
/*
 * 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);
}
Exemple #2
0
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);
}
Exemple #3
0
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);
}