in src/req_float_sketch_pg_functions.c [419:468]
Datum pg_req_float_sketch_get_histogram(PG_FUNCTION_ARGS) {
const bytea* bytes_in;
void* sketchptr;
int num_bins;
bool inclusive;
float* split_points;
float min_value;
float max_value;
float delta;
// output array of bins
Datum* result;
ArrayType* arr_out;
int16 elmlen_out;
bool elmbyval_out;
char elmalign_out;
int arr_len_out;
int i;
bytes_in = PG_GETARG_BYTEA_P(0);
sketchptr = req_float_sketch_deserialize(VARDATA(bytes_in), VARSIZE(bytes_in) - VARHDRSZ);
num_bins = PG_NARGS() > 1 ? PG_GETARG_INT32(1) : DEFAULT_NUM_BINS;
if (num_bins < 2) {
elog(ERROR, "at least two bins expected");
}
inclusive = PG_NARGS() > 2 ? PG_GETARG_BOOL(2) : false;
split_points = palloc(sizeof(float) * (num_bins - 1));
min_value = req_float_sketch_get_quantile(sketchptr, 0, inclusive);
max_value = req_float_sketch_get_quantile(sketchptr, 1, inclusive);
delta = (max_value - min_value) / num_bins;
for (i = 0; i < num_bins - 1; i++) {
split_points[i] = min_value + delta * (i + 1);
}
result = (Datum*) req_float_sketch_get_pmf_or_cdf(sketchptr, split_points, num_bins - 1, false, true, inclusive);
pfree(split_points);
// construct output array
arr_len_out = num_bins;
get_typlenbyvalalign(FLOAT8OID, &elmlen_out, &elmbyval_out, &elmalign_out);
arr_out = construct_array(result, arr_len_out, FLOAT8OID, elmlen_out, elmbyval_out, elmalign_out);
req_float_sketch_delete(sketchptr);
PG_RETURN_ARRAYTYPE_P(arr_out);
}