This changelog should be updated as part of a PR if the work is worth noting (most of them should be). If unsure, always add an entry here for any PR targeted for the next release. It's easier to remove than add an entry at final review time for the next release.
Full Changelog: [TODO]
1.23.0 (2026-06-02)
Full Changelog: [TODO]
1.22.0 (2025-10-24)
- Fix days_in_month behaviour when supplied date is not start of month by @svenklemm in #880
- Update rust version to 1.89 by @dbeck in #884
- Update pgrx version to 0.16.0 by @dbeck in #881
- Change to ruby 3.1 by @svenklemm in #886
- PG18 support by @syvb in #891
@svyb
1.21.0 (2025-04-17)
Full Changelog: [TODO]
1.19.0 (2024-11-14)
Full Changelog: [TODO]
1.18.0 (2023-11-28)
- #776: PostgreSQL 16 support
Full Changelog: [TODO]
1.17.0 (2023-07-06)
- #761: Make sure nmost combine uses correct memctx
Full Changelog: [TODO]
1.16.0 (2023-04-05)
- #733: Fix a bug when rolling up overlapping heartbeat_aggs
- #740: When interpolating an 'locf' time weighted average, extend last point to interpolation boundary
- #742: Ignore incoming NULL values in hyperloglog rollup
- #741: Stabilize
approx_count_distinct - #748: Stabilize
approx_percentile_array - #745: Stabilize date utility functions
- #751: Stabilize
min_n/max_n/min_n_by/max_n_by - #752: Stabilize
mcv_agg, this was previously ourtopn_agg
- #743: Remove support for direct upgrades from toolkit versions more than 1 year old. Toolkit versions 1.4.x and 1.5.x will have to upgrade to an intermediate version before upgrading to 1.16.0.
- #744: Fix nightly CI failures from building TimescaleDB on Enterprise Linux
- #749: Added num_live_ranges, num_gaps, and trim_to accessors for heartbeat aggregates
Full Changelog: https://github.com/timescale/timescaledb-toolkit/compare/1.15.0...1.16.0
1.15.0 (2023-03-08)
- #715: Fix out-of-bounds indexing error in
state_aggrollup
- #722: Stabilize heartbeat aggregate.
- #724: Stabilize integral and interpolated_integral for time-weighted-average.
- #723: Stabilized
state_agg
- #716: Add arrow operator support for counter aggregate and time-weighted aggregate interpolated accessors.
- #716: Remove experimental versions of interpolated accessors for counter aggregate and time-weighted aggregates. The stable versions introduced in 1.14.0 should be used instead.
- #723: Added
state_atfunction forstate_agg - #709: Updated pgx version to 0.7.1
Full Changelog: https://github.com/timescale/timescaledb-toolkit/compare/1.14.0...1.15.0
1.14.0 (2023-02-09)
- #660: Heartbeat aggregate rollup should interpolate aggregates
- #679: Heartbeat agg rollup producing invalid aggregates.
- #701: Stabilize candlestick.
- #650: Stabilize interpolated_delta & interpolated_rate for counter aggregate, and interpolated_average for time-weighted aggregate.
- #685: rollup for freq_agg and topn_agg
- #692: Support specifying a range to
duration_into specify a time range to get states in for state aggregates - #692: Removed
nextparameter from interpolated state aggregate functions - #692: Renamed
state_aggtocompact_state_aggandtimeline_aggtostate_agg - #699:
interpolated_duration_in/duration_in/interpolated_state_periods/state_periodshave the first two arguments swapped: now the aggregate is first and the state is second - #699:
into_values/into_int_valuesnow returns a table with intervals instead of microseconds
Full Changelog: https://github.com/timescale/timescaledb-toolkit/compare/1.13.1...1.14.0
1.13.1 (2023-01-03)
Full Changelog: https://github.com/timescale/timescaledb-toolkit/compare/1.13.0...1.13.1
- #664 Support PostgreSQL 15.
1.13.0 (2022-12-13)
-
#615: Heartbeat aggregate
Users can use the new
heartbeat_agg(timestamp, start_time, agg_interval, heartbeat_interval)to track the liveness of a system in the range (start_time,start_time+agg_interval). Each timestamp seen in that range is assumed to indicate system liveness for the followingheartbeat_interval.Once constructed, users can query heartbeat aggregates for
uptimeanddowntime, as well as query forlive_rangesordead_ranges. Users can also check forlive_at(timestamp).Heartbeat aggregates can also interpolated to better see behavior around the boundaries of the individual aggregates.
-
#620: Expose TDigest type
This is a prototype for building
TDigestobjects client-side, forINSERTinto tables.This is a lightly tested prototype; try it out at your own risk!
-
#635: AsOf joins for timevectors
This allows users to join two timevectors with the following semantics
timevectorA -> asof(timevectorB). This will return records with the LOCF value from timevectorA at the timestamps from timevectorB. Specifically the returned records contain, for each value in timevectorB, {the LOCF value from timevectorA, the value from timevectorB, the timestamp from timevectorB}. -
#609: New
approx_percentile_array()functionUsers can use the new
toolkit_experimental.approx_percentile_array(percentiles)to generate an array of percentile results instead of having to call and rebuild the aggregate multiple times. -
#636: New
timeline_aggaggregate, which is similar tostate_aggbut tracks the entire state timeline instead of just the duration in each state. -
#640: Support
rollupforstate_aggandtimeline_agg. -
#640: Support integer states for
state_aggandtimeline_agg. -
#638: Introducing Time Vector Templates.
Users can use the new experimental function toolkit_experimental.to_text(timevector(time, value),format_string) to render a formatted text representation of their time vector series. These changes also include toolkit_experimental.to_plotly(timevector(time, value)), which will render your time vector series in a format suitable for use with plotly.
- #644: Fix bug in Candlestick aggregate and reenable partial aggregation.
Full Changelog: https://github.com/timescale/timescaledb-toolkit/compare/1.12.1...1.13.0
1.12.1 (2022-11-17)
- #624: Remove partial aggregation for Candlestick aggregates. We've determined that the cause for the bad results lives somewhere in the functions that are used to support partial aggregation. We can at least prevent folks from running the candlestick aggregates in parallel mode and hitting this bug by dropping support for partial aggregation until we've resolved the issue.
1.12.0 (2022-11-08)
-
#596: Introduce Candlestick Aggregate. Users can use either the
toolkit_experimental.candlestick_agg(timestamp, price, volume)aggregate or thetoolkit_experimental.candlestick(timestamp, open, high, low, close, volume)function, depending on whether they are starting from tick data or already aggregated data. Both the aggregate form and the function form ofCandlesticksupport the following (experimental) accessors (in addition to being re-aggregated viarollup):open,high,low,close,open_time,high_time,low_time,close_time,volume,vwap(Volume Weighted Average Price) NOTE: This functionality improves upon and replaces the need fortoolkit_experimental.ohlcwhich will be removed in the next release. -
#590: New
min_n/max_nfunctions and relatedmin_n_by/max_n_by. The former is used to get the top N values from a column while the later will also track some additional data, such as another column or even the entire row. These should give the same results as aSELECT ... ORDER BY ... LIMIT n, except they can be composed and combined like other toolkit aggregates.
- #568: Allow
approx_countaccessor function to take NULL inputs. - #574: Add default unit to interpolated_integral.
- RPM packages for CentOS 7 have returned.
- New Homebrew formula available for macOS installation:
brew install timescale/tap/timescaledb-toolkit. - #547: Update pgx to 0.5.0. This is necessary for adding Postgres 15 support coming soon.
- #571: Update CI docker image for pgx 0.5.0.
- #599: Reduce floating point error when using
stats_aggin moving aggregate mode. - #589: Update pgx to 0.5.4.
- #594: Verify that pgx doesn't generate CREATE OR REPLACE FUNCTION.
- #592: Add build script option to install in release mode.
- @zyro for reporting null handling issue on
count_min_sketch.
Full Changelog: https://github.com/timescale/timescaledb-toolkit/compare/1.11.0...1.12.0
1.11.0 (2022-09-21)
- arm64/aarch64 DEB packages are now available for Ubuntu 20.04 (focal) & 22.04 (jammy), and Debian 10 (buster) & 11 (bulleye).
- #526: Add
integralandinterpolated_integralfunctions for the time_weight aggregate. Makestrapezoidalan alias forlinearintime_weightas it might be a more familiar numeric integral method for some. - #517: Add a gap preserving
lttbnamedgp_lttbto handle downsampling of data with large gaps. - #513: Add
first_val,last_val,first_timeandlast_timetotime_weightandcounter_aggto access the first and the last data points within the aggregate data structures. - #527: Rename
{open, high, low, close}_atto{open, high, low, close}_timeto be consistent with newly addedfirst_timeandlast_timeaccessor functions.
- #498: Stabilize
asap_smoothaggregate.
- #509, #531: Fix bugs in
hyperloglog. Error rates are now significantly more consistent when the number of buckets are close to the actual cardinality. - #514: Fix a bug in
toolkit_experimental.interpolated_delta. - #503: Fix bitwise logic in timevector combine.
- #507: Fix a typo in
approx_count_distinct.
- DEB packages for Ubuntu 18.04 (Bionic) on amd64 are now available.
- #536: Document equirement to use same compiler for cargo-pgx and Toolkit.
- #535: Make tests pass in Canadian locales.
- #537: Enforce
cargo fmtin CI. - #524: Updating Toolkit To Start Using Cargo Fmt.
- #522: Move update-tester tests to markdown files.
- @BenSandeen for fixing typos and errors in the hyperloglog++ implementation.
- @jaskij for reporting security advisories and suggestion on documenting support for PG 14.
- @jeremyhaberman for fixing a typo in
APPROX_COUNT_DISTINCT_DEFAULT_SIZE. - @jledentu for reporting an error on
interpolated_delta. - @stevedrip for a very detailed bug report on hyperloglog++ and suggestions for fixing it.
Full Changelog: https://github.com/timescale/timescaledb-toolkit/compare/1.10.1...1.11.0
1.10.1 (2022-08-18)
- #490: Month normalization function
month_normalizeand the helper functiondays_in_month, useful for normalizing data to a fixed month length for more meaningful month-to-month comparison. - #496:
OHLCaggregate, and the associatedrollupand accessor functionsopen,high,low,close,{open, high, low, close}_atmainly for trading data.
- #495:
LTTBdownsampling function. - #491, #488: The arrow operators (->) of the accessor functions for
stats_agg,percentile_agg,counter_agg,gauge_aggandhyperloglog. As an example,averageaccessor can now be used withstats_agglike this,select location, stats_agg(temperature) -> average() AS avg_temperature from conditions group by location
- #465: Off by one error in state_agg interpolate.
- Fix an issue where the 1.9.0 release unintentionally identified the toolkit extension version as 1.10.0-dev in the postgresql control file.
- #467: Document supported platforms in Readme.
- #463: Use pg14 as an example for instructions in instead of pg13. Add reference to deb and rpm packages.
Full Changelog: https://github.com/timescale/timescaledb-toolkit/compare/1.8.0...1.10.1
1.9.0 (2022-08-16)
An incorrect version (1.10.0-dev) was used which can cause upgrade failures. Not made GA.
1.8.0 (2022-07-05)
- #454: Saturating Math for i32/integers:
saturating_addsaturating_add_possaturating_subsaturating_sub_possaturating_mul
- #456: Adding interpolating accessors:
interpolated_duration_intostate_agg,interpolated_averagetotime_weight,interpolated_deltainterpolated_ratetocounter_aggandgauge_agg.
- #388: Create Count-Min Sketch crate.
- #459: Add a convenient
approx_count_distinctfunction which internally uses hyperloglog with a default bucket size of 2^15. - #458: Add
count_min_sketchaggregate andapprox_countaccessor. - #434: Initial changes to support aarch64-unknown-linux-gnu.
- #429: Support explicit NULL values in timevectors.
- #441: Relax tolerance in UDDSketch merge assertions.
- #444: Fix default collation deserialization.
- #451: Improve error message for HyperLogLog.
- #417: Include both pgx 0.2.x and pgx 0.4.x in CI image.
- #416: Prepare for the 1.8.0 cycle.
- #418: Made update-tester require two versions of cargo-pgx.
- #421: Don't install pgx as root or under "/".
- #427: Fix failing update-tester in CI.
- #428: Update github cache keys.
- #430: Lock pgx versions all the way.
- #408: Upgrade to pgx 0.4.5.
- #436: Change which cargo-pgx subcommand is added to PATH in CI image.
- #432: Remove PATH hack in tools/build script.
- #437: GitHub Actions improvements.
- #448: Run clippy GitHub Actions job without qualification.
- #446: Update README.md.
- #414: Specify Ubuntu 20.04 instead of 'latest' in github configuration.
- @tyhoff for reporting UDDSketch assertion error #396.
- @hardikm10 for reporting hyperloglog deserialization issue #443.
Full Changelog: https://github.com/timescale/timescaledb-toolkit/compare/1.7.0...1.8.0
1.7.0 (2022-05-10)
- #389: Create typed specialization for
freq_aggandtopn_agg.
- #378: Return INTERVAL from
duration_in(TEXT, StateAgg)instead ofi64. - #379: Handle NULL output from our aggregates:
asap,counter_agg,freq_agg,gauge_agg,hyperloglog,lttb,stats_agg,tdigest,uddsketch.
- #367: Switch stabilization tests to new info, meaning that there's one central location for stabilization info.
- #372: Improve tools/build flexibility for local builds.
- #394: Copy almost all the counter_agg functions for gauge_agg.
- #395: Remove GUC as they are no longer needed.
- #399: Allow manual packaging.
- #405: Update CI to rust 1.60.
- #407: Update postgres versions in ci Dockerfile.
- #409: Make dependencies version explicit in our CI image.
- #404: Refactor TimeVector to greatly simplify structure.
- #412: Allow building CI image in Actions.
- #411, #413: Create reportpackagingfailures.yml for reporting packaging failures not from CI builds.
Full Changelog: https://github.com/timescale/timescaledb-toolkit/compare/1.6.0...1.7.0
1.6.0 (2022-03-29)
- #330: Add serialization for FrequencyTransState.
- #368: Add
into_valuesfunction forstate_agg. - #370: Add a
topn (topn_agg)variant offreq_agg, which is more convenient to use. - #375: Add
gauge_aggand associated accessor functionsdelta,idelta_left,idelta_right, and therollupfunction.
- #332: Speed up builds by fixing github action cache and cargo build cache.
- #377: Stop auto building nightly image.
Full Changelog: https://github.com/timescale/timescaledb-toolkit/compare/1.5.2...1.6.0
1.5.2 (2022-03-07)
HIGH PRIORITY SECURITY UPDATE.
- There's a vulnerability in Toolkit 1.5 and earlier due to the fact that it creates a PLPGSQL function using CREATE OR REPLACE and without properly locking down the search path. This means that a user could pre-create the trigger function to run arbitrary code. To fix this we remove the trigger entirely; it no longer pulls its weight. This fix locks down our update scripts to only use CREATE OR REPLACE when actually necessary; while we don't yet have an exploit for the other functions, it would be unsurprising if one exists.
- #351: Make serialize functions strict to handle NULL values in partitioned aggregates.
- @svenklemm for reporting the vulnerability.
Full Changelog: https://github.com/timescale/timescaledb-toolkit/compare/1.5.0...1.5.2
1.5.0 (2022-01-31)
The first version that unifies the community build with Timescale Cloud build.
freq_aggfor estimating the most common elements in a column.state_aggfor measuring the total time spent in different states.
- Enforce clippy linting.
- Update rust to 1.57.
Full Changelog: https://github.com/timescale/timescaledb-toolkit/compare/1.4.0...1.5.0
1.4.0, 1.4.0-cloud (2021-11-17)
- Postgres 14 support.
- Upgrade pgx to 0.2.
Full Changelog: https://github.com/timescale/timescaledb-toolkit/compare/1.3.1...1.4.0-cloud
1.3.1, 1.3.1-cloud (2021-10-27)
- Postgres 14 support.
- Upgrade pgx to 0.2.
Full Changelog: https://github.com/timescale/timescaledb-toolkit/compare/1.3.0...1.3.1-cloud
1.3.0, 1.3.0-cloud (2021-10-18)
timevectorfunction pipelines: a compact and more readable way to perform a sequence of analytic operations such as the following one,timevector(ts, val) -> sort() -> delta() -> abs() -> sum()->accessor for Toolkit types enables syntax likestats_agg(data) -> average().to_epoch()wrapper forextract ('EPOCH' FROM timestamp)that makes it work more like an inverse ofto_timestamp(DOUBLE PRECISION).
counter_agghelper functions for Prometheus-style resetting monotonic counters.hyperloglogefficient approximate COUNT DISTINCT.stats_aggtwo-step aggregate for common statistics.
- This release changes the textual I/O format for Toolkit types. We are uncertain if we will need to do so again in the future. Due to this we currently only support dump/restore within a single version of the extension.
Full Changelog: https://github.com/timescale/timescaledb-toolkit/compare/1.2.0...1.3.0-cloud
1.2.0, 1.2.0-cloud (2021-09-14)
- Refinements to
hyperloglogincluding a function to report relative error and fixing the functionality ofrollup. - Introduction of a
topnapproximation API. Presently this will only work for integer data, but expect to see further refinements that greatly expand this behavior. - New
map_seriesandmap_datapipeline elements for the time series API that allow uses to provide custom transforms of their time series data. Additionally introduced a|>>pipeline operator for an even more streamlined interface into the new mapping functionality.
- Make a pass through all toolkit functions to correctly label behavior as immutable and parallel safe. This should improve the optimizations Postgres can apply to toolkit plans, particularly when run in a Timescale multinode cluster.
- Improve handling of internal data structures to reduce extraneous copies of data.
Full Changelog: https://github.com/timescale/timescaledb-toolkit/compare/1.1.0...1.2.0-cloud
1.1.0, 1.1.0-cloud (2021-08-04)
hyperlogloghas been updated to use Hyperloglog++ under the hood. This does not change the user-facing API but should improve the accuracy of hyperloglog() estimates. This is the last major change expected for hyperloglog() and is now a candidate for stabilization pending user feedback.- We've started experimenting with the pipeline API. While it's still very much a work in progress, it's at a point where the high-level concepts should be understandable. For example, a pipeline that outputs the daily change of a set of data, interpolating away any gaps in daily data, could look like
It's still early days for this API and it is not yet polished, but we would love feedback about its direction.
SELECT timeseries(time, val) |> sort() |> resample_to_rate('trailing_average', '24 hours', true) |> fill_holes('interpolate') |> delta() FROM ...
- Fix a small memory leak in aggregation functions. This could have leaked ≈8 bytes per aggregate call.
Full Changelog: https://github.com/timescale/timescaledb-toolkit/compare/1.0.0...1.1.0-cloud
1.0.0, 1.0.0-cloud (2021-07-12)
This release renames the extension to TimescaleDB Toolkit from Timescale Analytics and starts stabilizing functionality.
stats_agg()eases the analysis of more sophisticated bucketed statistics, such as rolling averages. (Docs are forthcoming, until then fell free to peruse the design discussion doc.timeserieswhich will serve as a building block for many pipelines, and unifies the output of lttb and ASAP.
- Percentile-approximation algorithms including
percentile_agg(),uddsketch()andtdigest()along with their associated functions. These are especially useful for computing percentiles in continuous aggregates. - Time-weighted average along with its associated functions. This eases taking the average over an irregularly spaced dataset that only includes changepoints.
- The on-disk layout
uddsketchhas be reworked to store buckets compressed. This can result in an orders-of-magnitude reduction in it's storage requirements. - The textual format
uddsketchhas been reworked to be more readable. - Functions that take in a
uddsketchortdigesthave been reworked to be 0-copy when applicable, improving the performance of such functions by 10-100x.
Full Changelog: https://github.com/timescale/timescaledb-toolkit/compare/0.3.0...1.0.0-cloud
0.3.0, 0.3.0-cloud (2021-06-17)
- Internal improvements.
- Largely prep work for the upcoming 1.0 release.
Full Changelog: https://github.com/timescale/timescaledb-toolkit/compare/0.2.0...0.3.0-cloud
0.2.0 (2021-04-08), 0.2.0-cloud (2021-04-29)
- ASAP Smoothing (
asap_smooth) – A graph smoothing algorithm that highlights changes. - Counter Aggregates (
counter_agg) – Tools to ease working with reset-able counters. - Largest Triangle Three Buckets (
lttb) – A downsampling algorithm that tries to preserve visual similarity. - Time Bucket Range – A version of
time_bucket()that outputs the [start, end) times of the bucket. - Update
UddSketchwith an aggregate that merges multipleUddSketchsand various internal improvements.
Full Changelog: https://github.com/timescale/timescaledb-toolkit/compare/0.1.0...0.2.0-cloud
0.1.0 (2021-03-03)
hyperloglog– An approximate COUNT DISTINCT based on hashing that provides reasonable accuracy in constant space.tdigest– A quantile estimate sketch optimized to provide more accurate estimates near the tails (i.e. 0.001 or 0.995) than conventional approaches.uddsketch– A quantile estimate sketch which provides a guaranteed maximum relative error.- Time-weighted average (
time_weight) – A time-weighted averaging function to determine the value of things proportionate to the time they are set.
- None. All features are experimental.