CREATE OR REPLACE FUNCTION _timescaledb_internal.hist_sfunc (state INTERNAL, val DOUBLE PRECISION, MIN DOUBLE PRECISION, MAX DOUBLE PRECISION, nbuckets INTEGER) RETURNS INTERNAL AS '@MODULE_PATHNAME@', 'hist_sfunc' LANGUAGE C IMMUTABLE PARALLEL SAFE; CREATE OR REPLACE FUNCTION _timescaledb_internal.hist_combinefunc(state1 INTERNAL, state2 INTERNAL) RETURNS INTERNAL AS '@MODULE_PATHNAME@', 'hist_combinefunc' LANGUAGE C IMMUTABLE PARALLEL SAFE; CREATE OR REPLACE FUNCTION _timescaledb_internal.hist_serializefunc(INTERNAL) RETURNS bytea AS '@MODULE_PATHNAME@', 'hist_serializefunc' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; CREATE OR REPLACE FUNCTION _timescaledb_internal.hist_deserializefunc(bytea, INTERNAL) RETURNS INTERNAL AS '@MODULE_PATHNAME@', 'hist_deserializefunc' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; CREATE OR REPLACE FUNCTION _timescaledb_internal.hist_finalfunc(state INTERNAL, val DOUBLE PRECISION, MIN DOUBLE PRECISION, MAX DOUBLE PRECISION, nbuckets INTEGER) RETURNS INTEGER[] AS '@MODULE_PATHNAME@', 'hist_finalfunc' LANGUAGE C IMMUTABLE PARALLEL SAFE; -- Tell Postgres how to use the new function DROP AGGREGATE IF EXISTS histogram (DOUBLE PRECISION, DOUBLE PRECISION, DOUBLE PRECISION, INTEGER); CREATE AGGREGATE histogram (DOUBLE PRECISION, DOUBLE PRECISION, DOUBLE PRECISION, INTEGER) ( SFUNC = _timescaledb_internal.hist_sfunc, STYPE = INTERNAL, COMBINEFUNC = _timescaledb_internal.hist_combinefunc, SERIALFUNC = _timescaledb_internal.hist_serializefunc, DESERIALFUNC = _timescaledb_internal.hist_deserializefunc, PARALLEL = SAFE, FINALFUNC = _timescaledb_internal.hist_finalfunc, FINALFUNC_EXTRA );