-- This file and its contents are licensed under the Apache License 2.0. -- Please see the included NOTICE for copyright information and -- LICENSE-APACHE for a copy of the license. CREATE OR REPLACE FUNCTION _timescaledb_functions.first_sfunc(internal, anyelement, "any") RETURNS internal AS '@MODULE_PATHNAME@', 'ts_first_sfunc' LANGUAGE C IMMUTABLE PARALLEL SAFE; CREATE OR REPLACE FUNCTION _timescaledb_functions.first_combinefunc(internal, internal) RETURNS internal AS '@MODULE_PATHNAME@', 'ts_first_combinefunc' LANGUAGE C IMMUTABLE PARALLEL SAFE; CREATE OR REPLACE FUNCTION _timescaledb_functions.last_sfunc(internal, anyelement, "any") RETURNS internal AS '@MODULE_PATHNAME@', 'ts_last_sfunc' LANGUAGE C IMMUTABLE PARALLEL SAFE; CREATE OR REPLACE FUNCTION _timescaledb_functions.last_combinefunc(internal, internal) RETURNS internal AS '@MODULE_PATHNAME@', 'ts_last_combinefunc' LANGUAGE C IMMUTABLE PARALLEL SAFE; CREATE OR REPLACE FUNCTION _timescaledb_functions.bookend_finalfunc(internal, anyelement, "any") RETURNS anyelement AS '@MODULE_PATHNAME@', 'ts_bookend_finalfunc' LANGUAGE C IMMUTABLE PARALLEL SAFE; CREATE OR REPLACE FUNCTION _timescaledb_functions.bookend_serializefunc(internal) RETURNS bytea AS '@MODULE_PATHNAME@', 'ts_bookend_serializefunc' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; CREATE OR REPLACE FUNCTION _timescaledb_functions.bookend_deserializefunc(bytea, internal) RETURNS internal AS '@MODULE_PATHNAME@', 'ts_bookend_deserializefunc' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE; -- We started using CREATE OR REPLACE AGGREGATE for aggregate creation once the syntax was fully supported -- as it is easier to support idempotent changes this way. This will allow for changes to functions supporting -- the aggregate, and, for instance, the definition and inclusion of inverse functions for window function -- support. However, it should still be noted that changes to the data structures used for the internal -- state of the aggregate must be backwards compatible and the old format must be accepted by any new functions -- in order for them to continue working with Continuous Aggregates, where old states may have been materialized. --This aggregate returns the "first" value of the first argument when ordered by the second argument. --Ex. first(temp, time) returns the temp value for the row with the lowest time CREATE OR REPLACE AGGREGATE @extschema@.first(anyelement, "any") ( SFUNC = _timescaledb_functions.first_sfunc, STYPE = internal, COMBINEFUNC = _timescaledb_functions.first_combinefunc, SERIALFUNC = _timescaledb_functions.bookend_serializefunc, DESERIALFUNC = _timescaledb_functions.bookend_deserializefunc, PARALLEL = SAFE, FINALFUNC = _timescaledb_functions.bookend_finalfunc, FINALFUNC_EXTRA ); --This aggregate returns the "last" value of the first argument when ordered by the second argument. --Ex. last(temp, time) returns the temp value for the row with highest time CREATE OR REPLACE AGGREGATE @extschema@.last(anyelement, "any") ( SFUNC = _timescaledb_functions.last_sfunc, STYPE = internal, COMBINEFUNC = _timescaledb_functions.last_combinefunc, SERIALFUNC = _timescaledb_functions.bookend_serializefunc, DESERIALFUNC = _timescaledb_functions.bookend_deserializefunc, PARALLEL = SAFE, FINALFUNC = _timescaledb_functions.bookend_finalfunc, FINALFUNC_EXTRA );