in src/quantiles_double_sketch_pg_functions.c [351:397]
Datum pg_quantiles_double_sketch_get_quantiles(PG_FUNCTION_ARGS) {
const bytea* bytes_in;
void* sketchptr;
// input array of fractions
ArrayType* arr_in;
Oid elmtype_in;
int16 elmlen_in;
bool elmbyval_in;
char elmalign_in;
Datum* data_in;
bool* nulls_in;
int arr_len;
double* fractions;
// output array of quantiles
Datum* quantiles;
ArrayType* arr_out;
int16 elmlen_out;
bool elmbyval_out;
char elmalign_out;
int i;
bytes_in = PG_GETARG_BYTEA_P(0);
sketchptr = quantiles_double_sketch_deserialize(VARDATA(bytes_in), VARSIZE(bytes_in) - VARHDRSZ);
arr_in = PG_GETARG_ARRAYTYPE_P(1);
elmtype_in = ARR_ELEMTYPE(arr_in);
get_typlenbyvalalign(elmtype_in, &elmlen_in, &elmbyval_in, &elmalign_in);
deconstruct_array(arr_in, elmtype_in, elmlen_in, elmbyval_in, elmalign_in, &data_in, &nulls_in, &arr_len);
fractions = palloc(sizeof(double) * arr_len);
for (i = 0; i < arr_len; i++) {
fractions[i] = DatumGetFloat8(data_in[i]);
}
quantiles = (Datum*) quantiles_double_sketch_get_quantiles(sketchptr, fractions, arr_len);
pfree(fractions);
// construct output array of quantiles
get_typlenbyvalalign(FLOAT8OID, &elmlen_out, &elmbyval_out, &elmalign_out);
arr_out = construct_array(quantiles, arr_len, FLOAT8OID, elmlen_out, elmbyval_out, elmalign_out);
quantiles_double_sketch_delete(sketchptr);
PG_RETURN_ARRAYTYPE_P(arr_out);
}