# TimescaleDB changelog > A time-series database built on PostgreSQL. - Vendor: Timescale - Category: Developer Tools - Official site: https://www.timescale.com - Tracked by: What's New (https://whatsnew.fyi/product/timescaledb) - Harvested from: GitHub (timescale/timescaledb) - Entries below: 10 (newest first) What's New is an index, not a publisher: every entry below links to the vendor's own release notes, which are the authoritative source. Entries are labelled where they are hand-curated sample data, pre-releases, or drawn from a secondary source such as a developer blog. ## Releases ### 2.29.1 — 2.29.1 (2026-08-04) - Date: 2026-08-04 - Version: 2.29.1 - Original notes: https://github.com/timescale/timescaledb/releases/tag/2.29.1 - Permalink: https://whatsnew.fyi/product/timescaledb/releases/2.29.1 - **security** — Fix decompressor crashes with malformed compressed data - **security** — Read hypertable max time value with an ordered scan - **security** — Add missing permission checks to internal chunk functions - **fixed** — Fix assertion failure in add_dimension() when the hypertable argument is NULL - **fixed** — Fix crash when deleting from a compressed continuous aggregate source - **fixed** — Validate max_batches in compact_chunk() - **fixed** — Reset inherited column and constraint flags on chunks during attach_chunk() - **fixed** — Fix typo in error message about MERGE support on compressed hypertables This release contains performance improvements and bug fixes since the 2.29.0 release and fixes for security vulnerabilities (#10360, #10379, #10386). You can check the [security advisory](https://github.com/timescale/timescaledb/security/advisories/GHSA-hcfx-29v5-2rcw) for more information on the vulnerability and the platforms that are affected. We recommend that you upgrade at the next available opportunity. **Bugfixes** * [#10327](https://github.com/timescale/timescaledb/pull/10327) Assertion failure in `add_dimension()` when the hypertable argument is `NULL` * [#10339](https://github.com/timescale/timescaledb/pull/10339) Fix crash when deleting from a compressed continuous aggregate source * [#10340](https://github.com/timescale/timescaledb/pull/10340) Validate `max_batches` in `compact_chunk()` * [#10352](https://github.com/timescale/timescaledb/pull/10352) Reset inherited column and constraint flags on chunks during `attach_chunk()` * [#10360](https://github.com/timescale/timescaledb/pull/10360) Fix decompressor crashes with malformed compressed data * [#10369](https://github.com/timescale/timescaledb/pull/10369) Fix typo in error message about `MERGE` support on compressed hypertables * [#10379](https://github.com/timescale/timescaledb/pull/10379) Read hypertable max time value with an ordered scan * [#10386](https://github.com/timescale/timescaledb/pull/10386) Add missing permission checks to internal chunk functions **Thanks** * @JoongHyuk-Shin for reporting and fixing `NULL` handling in `add_dimension()` * @igor2x for reporting a typo in a `MERGE` support error message * @mdisec for reporting issues with compressed data validation during decompression ### 2.29.0 — 2.29.0 (2026-07-28) - Date: 2026-07-28 - Version: 2.29.0 - Original notes: https://github.com/timescale/timescaledb/releases/tag/2.29.0 - Permalink: https://whatsnew.fyi/product/timescaledb/releases/2.29.0 - **removed** — Remove support for PostgreSQL 15 - **changed** — Speed up DML operations on hypertables by using optimized TimescaleDB hypertable expansion code instead of generic PostgreSQL inheritance hierarchy expansion - **changed** — Speed up expression evaluation in the columnar pipeline by caching common subexpressions - **added** — Add _timescaledb_functions.decompress_batch() SQL function - **changed** — Speed up some queries with small LIMIT by switching to row-by-row query execution pipeline - **changed** — Decompress less data in DML on compressed hypertables by accounting for prepared statement parameters - **added** — Add compact_chunk() function - **added** — Support concurrent refresh policies on hierarchical continuous aggregates - **added** — Add samplerate argument to _timescaledb_functions.estimate_uncompressed_size() - **changed** — Skip classifying compressed relations to speed up planning - **changed** — Don't track compressed relations as separate chunk - **changed** — Reduce memory usage of INSERT queries using direct compress and spanning multiple chunks - **added** — Add a compaction policy for unordered chunks - **changed** — Don't create separate hypertable catalog entry for hypertables with compression - **added** — Add config_merge parameter to alter_job() for merging jsonb into the existing job configuration - **added** — Add recompress_unordered columnstore policy option - **changed** — Use regclass for storing relation reference in chunk table - **added** — Add helper functions for decoding hypertable status - **added** — Add tsdb.direct_compress storage parameter that allows enabling direct compress for a given hypertable independent of global settings This release contains performance improvements and bug fixes since the 2.28.3 release. We recommend that you upgrade at the next available opportunity. **Release Highlights** * Chunk exclusion for DML operations improves the performance of `UPDATE` and `DELETE` statements on hypertables. By acquiring row exclusive locks only on the specific chunks being modified rather than the entire hypertable. This enhancement reduces lock contention in high-concurrency workloads involving DML, speeding up the planning of DML queries by using the optimized TimescaleDB chunk exclusion instead of the baseline Postgres constraint exclusion. * The query planner can now choose an additional algorithm for retrieving a small number of rows, for reading the columnstore data, optimizing the default behavior. This optimization improves some last-point queries on columnstore (think `ORDER BY time DESC LIMIT 1`) run several times faster than in previous releases. **Important: PostgreSQL 15 Support Removed** TimescaleDB 2.29.0 removes support for PostgreSQL 15. This release supports PostgreSQL 16, 17, and 18. If you are still running PostgreSQL 15, upgrade PostgreSQL before upgrading to TimescaleDB 2.29.0. **Backward-Incompatible Changes** * [#10041](https://github.com/timescale/timescaledb/pull/10041) Remove support for PostgreSQL 15 **Features** * [#9315](https://github.com/timescale/timescaledb/pull/9315) Speed up `DML` operations on hypertables by using the optimized TimescaleDB hypertable expansion code instead of the generic PostgreSQL inheritance hierarchy expansion * [#9534](https://github.com/timescale/timescaledb/pull/9534) Speed up expression evaluation in the columnar pipeline by caching common subexpressions * [#9684](https://github.com/timescale/timescaledb/pull/9684) Add `_timescaledb_functions.decompress_batch()` SQL function * [#9732](https://github.com/timescale/timescaledb/pull/9732) Speed up some queries with small `LIMIT` by switching to row-by-row query execution pipeline * [#9917](https://github.com/timescale/timescaledb/pull/9917) Decompress less data in `DML` on compressed hypertables by accounting for prepared statement parameters * [#9957](https://github.com/timescale/timescaledb/pull/9957) Add `compact_chunk()` function * [#10048](https://github.com/timescale/timescaledb/pull/10048) Support concurrent refresh policies on hierarchical continuous aggregates * [#10081](https://github.com/timescale/timescaledb/pull/10081) Add `samplerate` argument to `_timescaledb_functions.estimate_uncompressed_size()` * [#10100](https://github.com/timescale/timescaledb/pull/10100) Skip classifying compressed relations to speed up planning * [#10118](https://github.com/timescale/timescaledb/pull/10118) Don't track compressed relations as separate chunk * [#10119](https://github.com/timescale/timescaledb/pull/10119) Reduce memory usage of `INSERT` queries using direct compress and spanning multiple chunks * [#10163](https://github.com/timescale/timescaledb/pull/10163) Add a compaction policy for unordered chunks * [#10204](https://github.com/timescale/timescaledb/pull/10204) Don't create separate hypertable catalog entry for hypertables with compression * [#10217](https://github.com/timescale/timescaledb/pull/10217) Initial placeholder version of granular refresh API * [#10225](https://github.com/timescale/timescaledb/pull/10225) Add `config_merge` parameter to `alter_job()` for merging `jsonb` into the existing job configuration * [#10226](https://github.com/timescale/timescaledb/pull/10226) Add `recompress_unordered` columnstore policy option * [#10231](https://github.com/timescale/timescaledb/pull/10231) Use `regclass` for storing relation reference in chunk table * [#10237](https://github.com/timescale/timescaledb/pull/10237) Add helper functions for decoding hypertable status * [#10240](https://github.com/timescale/timescaledb/pull/10240) Add the `tsdb.direct_compress` storage parameter that allows enablin _[Truncated at 4000 characters — full notes: https://github.com/timescale/timescaledb/releases/tag/2.29.0]_ ### 2.28.3 — 2.28.3 (2026-07-16) - Date: 2026-07-16 - Version: 2.28.3 - Original notes: https://github.com/timescale/timescaledb/releases/tag/2.28.3 - Permalink: https://whatsnew.fyi/product/timescaledb/releases/2.28.3 - **fixed** — Wrong result when evaluating a function returning NULL in the columnar query execution pipeline - **fixed** — Incorrect usage of sort transformation for sort key expressions with negative constants - **fixed** — Allow enabling and disabling triggers on hypertables with columnstore enabled - **fixed** — Columnstore sort pushdown to check for different query sort key collation - **fixed** — Potentially wrong results for stddev(float4) and stddev(float8) when used with avg() in the columnar query execution pipeline - **fixed** — Race condition when enabling compression on a hypertable - **fixed** — Batch filtering for compressed DML should respect collation - **fixed** — Direct delete failed to handle array predicates with NULL values and deleted more rows than intended - **fixed** — Reuse existing dimension_slice IDs when possible - **fixed** — Truncate constraint name before trying to rename This release contains performance improvements and bug fixes since the 2.28.2 release. We recommend that you upgrade at the next available opportunity. **Bugfixes** * [#10082](https://github.com/timescale/timescaledb/pull/10082) Wrong result when evaluating a function returning `NULL` in the columnar query execution pipeline * [#10178](https://github.com/timescale/timescaledb/pull/10178) Fix incorrect usage of sort transformation for sort key expressions with negative constants * [#10179](https://github.com/timescale/timescaledb/pull/10179) Allow enabling and disabling triggers on hypertables with columnstore enabled * [#10182](https://github.com/timescale/timescaledb/pull/10182) Fix columnstore sort pushdown to check for different query sort key collation * [#10209](https://github.com/timescale/timescaledb/pull/10209) Fix potentially wrong results for `stddev(float4)` and `stddev(float8)` when used with `avg()` in the columnar query execution pipeline * [#10212](https://github.com/timescale/timescaledb/pull/10212) Fix race condition when enabling compression on a hypertable * [#10230](https://github.com/timescale/timescaledb/pull/10230) Batch filtering for compressed `DML` should respect collation * [#10254](https://github.com/timescale/timescaledb/pull/10254) Direct delete failed to handle array predicates with `NULL` values and deleted more rows than intended ([#10129](https://github.com/timescale/timescaledb/pull/10129)) * [#10257](https://github.com/timescale/timescaledb/pull/10257) Reuse existing `dimension_slice` IDs when possible * [#10265](https://github.com/timescale/timescaledb/pull/10265) Truncate constraint name before trying to rename **Thanks** * @juantxorena for reporting that triggers could not be enabled or disabled on hypertables with columnstore enabled ### 2.28.2 — 2.28.2 (2026-06-30) - Date: 2026-06-30 - Version: 2.28.2 - Original notes: https://github.com/timescale/timescaledb/releases/tag/2.28.2 - Permalink: https://whatsnew.fyi/product/timescaledb/releases/2.28.2 - **fixed** — Fix bgw_job_stat_history migration for 2.28.1 - **fixed** — Fix chunk_constraint migration - **fixed** — Fix column ordering on first/last-based sparse indexes - **fixed** — Automatically drop incompatible smallint bloom filters when upgrading instead of stopping the upgrade This release contains bug fixes since the 2.28.1 release. We recommend that you upgrade at the next available opportunity. **Bugfixes** * [#10126](https://github.com/timescale/timescaledb/pull/10126) Fix `bgw_job_stat_history` migration for 2.28.1 * [#10133](https://github.com/timescale/timescaledb/pull/10133) Fix `chunk_constraint` migration * [#10137](https://github.com/timescale/timescaledb/pull/10137) Fix column ordering on `first`/`last`-based sparse indexes * [#10164](https://github.com/timescale/timescaledb/pull/10164) Automatically drop incompatible smallint bloom filters when upgrading instead of stopping the upgrade **Thanks** * @juantxorena for reporting an issue with update script for 2.28.1 * @rusha1333 for reporting an issue when upgrading to 2.28.1 ### 2.28.1 — 2.28.1 (2026-06-23) - Date: 2026-06-23 - Version: 2.28.1 - Original notes: https://github.com/timescale/timescaledb/releases/tag/2.28.1 - Permalink: https://whatsnew.fyi/product/timescaledb/releases/2.28.1 - **fixed** — Fix potential crash on DML on compressed tables when the plan uses Bitmap Heap Scan - **fixed** — Fix column rename for compressed chunks - **fixed** — Enforce CHECK, NOT NULL and view WITH CHECK OPTION constraints for direct compress inserts - **fixed** — Fix error when using first/last aggregates in a HAVING clause - **fixed** — Fix first/last optimization returning the same value for aggregates that share the value column but order by different columns - **fixed** — Fix internal error in first/last for unsortable types - **fixed** — Fix bgw_job_stat_history definition - **fixed** — Fix uncompressed size estimate for varlen - **fixed** — Fix deleting every row on compressed hypertable with subquery returning constant false - **fixed** — Fix use-after-free in ALTER TABLE ADD CONSTRAINT This release contains performance improvements and bug fixes since the 2.28.0 release. We recommend that you upgrade at the next available opportunity. **Bugfixes** * [#9913](https://github.com/timescale/timescaledb/pull/9913) Fix potential crash on `DML` on compressed tables when the plan uses `Bitmap Heap Scan` * [#10091](https://github.com/timescale/timescaledb/pull/10091) Fix column rename for compressed chunks * [#10056](https://github.com/timescale/timescaledb/pull/10056) Enforce `CHECK`, `NOT NULL` and view `WITH CHECK OPTION` constraints for direct compress inserts * [#10059](https://github.com/timescale/timescaledb/pull/10059) Fix error when using `first`/`last` aggregates in a `HAVING` clause * [#10060](https://github.com/timescale/timescaledb/pull/10060) Fix `first`/`last` optimization returning the same value for aggregates that share the value column but order by different columns * [#10061](https://github.com/timescale/timescaledb/pull/10061) Fix internal error in `first`/`last` for unsortable types * [#10069](https://github.com/timescale/timescaledb/pull/10069) Fix `bgw_job_stat_history` definition * [#10073](https://github.com/timescale/timescaledb/pull/10073) Fix uncompressed size estimate for `varlen` * [#10089](https://github.com/timescale/timescaledb/pull/10089) Fix deleting every row on compressed hypertable with subquery returning constant false * [#10094](https://github.com/timescale/timescaledb/pull/10094) Fix use-after-free in `ALTER TABLE ADD CONSTRAINT` **Thanks** * @skrenes for reporting a problem with the `job_history` view when upgrading to 2.28.0 ### 2.28.0 — 2.28.0 (2026-06-16) - Date: 2026-06-16 - Version: 2.28.0 - Original notes: https://github.com/timescale/timescaledb/releases/tag/2.28.0 - Permalink: https://whatsnew.fyi/product/timescaledb/releases/2.28.0 - **added** — TimescaleDB derives first(value, time) and last(value, time) aggregates straight from the columnstore's batch metadata, skipping batch decompression entirely for faster recency queries - **added** — refresh_continuous_aggregate() can now run incrementally in batches with tunable parameters buckets_per_batch, max_batches_per_execution, and refresh_newest_first - **added** — Vectorized execution now covers CASE expressions to evaluate CASE ... WHEN expressions directly on compressed data - **added** — Add new aggregations to a continuous aggregate without rebuilding it using ALTER MATERIALIZED VIEW with ADD COLUMN and GENERATED ALWAYS AS - **added** — Support ANALYZE and VACUUM on continuous aggregates by redirecting to the underlying materialization hypertable - **added** — Increase the parallelism of SELECT queries over compressed hypertables to approximately match the uncompressed data size - **added** — Mark hypertable and chunk as user catalog tables - **added** — Add first/last sparse indexes to compression - **added** — Allow database owner to configure hypertables and policies - **added** — Add in-memory observability for compressed chunks - **added** — Improve GapFill row count estimate - **added** — Allow subquery results which are exec params as GapFill arguments - **added** — Suppress continuous aggregate invalidation tracking during bulk loads - **added** — Add rebuild_sparse_index function - **added** — Add a function to lock OSM chunk's dimension slice - **changed** — Relax lock during continuous aggregate invalidation log processing to no longer block unrelated concurrent operations - **removed** — Remove adaptive chunking - **removed** — Remove _timescaledb_catalog.chunk_constraint table and replace with compatibility view - **deprecated** — PostgreSQL 15 support will be dropped in version 2.29.0, with only PostgreSQL 16, 17, and 18 supported going forward This release contains performance improvements and bug fixes since the 2.27.2 release. We recommend that you upgrade at the next available opportunity. **Highlighted features in TimescaleDB v2.28.0** * **Faster `first()` and `last()` queries on compressed data.** TimescaleDB derives `first(value, time)` and `last(value, time)` aggregates straight from the columnstore's batch metadata, skipping batch decompression entirely. For the "latest reading per series" lookups that time-series workloads run constantly, that means meaningfully faster recency queries with no changes to your SQL queries. * **Lighter, less disruptive continuous aggregate refreshes.** `refresh_continuous_aggregate()` can now run incrementally in batches — the same behavior refresh policies already use — enabling breaking large manual refreshes into smaller chunks (tunable via `buckets_per_batch`, `max_batches_per_execution`, and `refresh_newest_first`) instead of one heavy operation. Refreshes also now take a lighter lock while processing the invalidation log, so they no longer block unrelated concurrent operations on the same continuous aggregate, improving behavior for concurrent workloads. * **Vectorized execution now covers `CASE` expressions.** TimescaleDB's columnar executor can now evaluate `CASE ... WHEN` expressions directly on compressed data, so queries using conditional logic stay on the fast vectorized path instead of falling back to slower row-by-row decompression. This speeds up a common pattern — conditional aggregations and computed columns over compressed history — with no query changes needed. * **Add new aggregations to a continuous aggregate without rebuilding it.** You can now run `ALTER MATERIALIZED VIEW ADD COLUMN GENERATED ALWAYS AS () STORED` to add a new computed aggregate to an existing continuous aggregate in place — no more dropping and recreating the whole aggregate just to track one more metric. New data populates the column going forward, letting your rollups evolve alongside your application. (Existing rows start as `NULL`; a forced refresh backfills them when you need historical values.) **Deprecation Notice: PostgreSQL 15 Support** This release marks the final minor version of TimescaleDB that will support PostgreSQL 15. Starting with our next release, version 2.29.0, we will officially drop support for Postgres 15, and only support Postgres 16, 17, and 18; however, all future patch releases within the current 2.28 version cycle will continue to fully support it. We recommend planning your PostgreSQL upgrades accordingly to ensure a smooth transition. **Deprecation Notice: `chunk_constraint` Catalog Table** Please note that the `_timescaledb_catalog.chunk_constraint` table has been dropped and temporarily replaced by a view, which introduces a change to the underlying objects while maintaining current query behavior. However, this compatibility view will be completely removed in a future release. To ensure your queries remain compatible moving forward, we strongly advise transitioning to the stable contracts provided by our [informational views](https://www.tigerdata.com/docs/reference/timescaledb/informational-views). **Backward-Incompatible Changes** * [#9934](https://github.com/timescale/timescaledb/pull/9934) Remove adaptive chunking **Features** * [#4054](https://github.com/timescale/timescaledb/pull/4054) Support `ANALYZE` and `VACUUM` on continuous aggregates by redirecting to the underlying materialization hypertable * [#9125](https://github.com/timescale/timescaledb/pull/9125) Increase the parallelism of `SELECT` queries over compressed hypertables to approximately match the uncompressed data size * [#9410](https://github.com/timescale/timescaledb/pull/9410) Mark `hypertable` and `chunk` as user catalog tables * [#9416](https://github.com/timescale/timescaledb/pull/9416) Support some forms of `CASE` expression in columnar aggregation and grouping * [#9580]( _[Truncated at 4000 characters — full notes: https://github.com/timescale/timescaledb/releases/tag/2.28.0]_ ### 2.27.2 — 2.27.2 (2026-06-02) - Date: 2026-06-02 - Version: 2.27.2 - Original notes: https://github.com/timescale/timescaledb/releases/tag/2.27.2 - Permalink: https://whatsnew.fyi/product/timescaledb/releases/2.27.2 - **fixed** — Remove refresh policy check when adding columnstore policy - **fixed** — Fix wrong results and crashes when grouping by columns that are not in the SELECT list with vectorized aggregation or columnar index scan - **fixed** — Skip ColumnarIndexScan when the qual contains a SubPlan This release contains bug fixes since the 2.27.1 release. We recommend that you upgrade at the next available opportunity. **Bugfixes** * [#9895](https://github.com/timescale/timescaledb/pull/9895) Remove refresh policy check when adding columnstore policy * [#9902](https://github.com/timescale/timescaledb/pull/9902) Fix wrong results and crashes when grouping by columns that are not in the `SELECT` list with vectorized aggregation or columnar index scan * [#9908](https://github.com/timescale/timescaledb/pull/9908) Skip `ColumnarIndexScan` when the qual contains a SubPlan ### 2.27.1 — 2.27.1 (2026-05-19) - Date: 2026-05-19 - Version: 2.27.1 - Original notes: https://github.com/timescale/timescaledb/releases/tag/2.27.1 - Permalink: https://whatsnew.fyi/product/timescaledb/releases/2.27.1 - **fixed** — Delete orphaned compression_settings before migrating catalog table - **security** — Fix job_errors view leaking failed jobs to non-owners - **security** — Check hypertable ownership before recompression - **security** — Fix information leak in policy_reorder_remove - **fixed** — Add migration scripts for composite bloom filters - **fixed** — Skip columnar index scan when grouping by an expression - **fixed** — Skip ColumnarIndexScan for GROUPING SETS / ROLLUP / CUBE #### TimescaleDB Changelog **Please note: When updating your database, you should connect using `psql` with the `-X` flag to prevent any `.psqlrc` commands from accidentally triggering the load of a previous DB version.** This release contains performance improvements and bug fixes since the 2.27.0 release. We recommend that you upgrade at the next available opportunity. **Bugfixes** * [#9795](https://github.com/timescale/timescaledb/pull/9795) Delete orphaned `compression_settings` before migrating catalog table * [#9799](https://github.com/timescale/timescaledb/pull/9799) Fix `job_errors` view leaking failed jobs to non-owners * [#9800](https://github.com/timescale/timescaledb/pull/9800) Check hypertable ownership before recompression * [#9801](https://github.com/timescale/timescaledb/pull/9801) Fix information leak in `policy_reorder_remove` * [#9824](https://github.com/timescale/timescaledb/pull/9824) Adding migration scripts for composite bloom filters * [#9828](https://github.com/timescale/timescaledb/pull/9828) Skip columnar index scan when grouping by an expression * [#9830](https://github.com/timescale/timescaledb/pull/9830) Skip `ColumnarIndexScan` for GROUPING SETS / ROLLUP / CUBE **Thanks** * @homanp for reporting an information leak with the job_errors view ### 2.27.0 — 2.27.0 (2026-05-12) - Date: 2026-05-12 - Version: 2.27.0 - Original notes: https://github.com/timescale/timescaledb/releases/tag/2.27.0 - Permalink: https://whatsnew.fyi/product/timescaledb/releases/2.27.0 - **added** — Hypercore engine now supports vectorized implementation of filters evaluated inline through the standard Postgres function path, expanding queries that can use the faster columnstore path with speedups ranging from 30% up to 2x - **added** — UPDATE and DELETE statements with equality predicates can now use bloom filters to skip decompressing batches, with EXPLAIN reporting filtering activity via new Compressed batches filtered and Batches filtered after decompression counters - **added** — UPSERT queries can now leverage bloom filters including composite ones to skip decompressing batches when arbiter values are guaranteed not to be present - **added** — Use PG_MODULE_MAGIC_EXT for PG18 - **added** — Rewrite queries with continuous aggregates exactly matching query aggregation - **added** — Push down scalar array operations into the columnar metadata scan by transforming them into an OR/AND clause - **added** — Defer segmentby default for direct compress - **added** — Analyze and get segmentby during direct compress - **added** — Allow running compression as part of refresh policy for compressed continuous aggregates - **added** — Enable vectorized aggregation in some cases when the WHERE clause contains filters not handled through the Vectorized Filters facility including filters on time_bucket() - **added** — Allow ALTER TABLE RESET on materialization hypertables - **added** — Add support for reporting index creation progress - **changed** — Calculate hashes for bloom filter predicates at planning time - **changed** — For nullable orderby columns do segmentwise decompress-compress instead of segmentwise recompress - **fixed** — Fix chunk exclusion for IN/ANY on open time dimensions - **fixed** — Bloom filter sparse indexes on compressed int2 columns could lead to SELECT queries not returning rows that actually match the WHERE condition - **removed** — Remove _timescaledb_functions.repair_relation_acls - **deprecated** — PostgreSQL 15 will no longer be supported in the June 2026 release of TimescaleDB - **security** — Introduce new naming convention for composite bloom filter metadata requiring legacy metadata columns to be renamed before upgrade This release contains performance improvements and bug fixes since the 2.26.4 release. We recommend that you upgrade at the next available opportunity. ⚠️ Due to a problem during release process the Window's releases artifacts attached to this release are not valid. Download valid Windows binaries from: * [TimescaleDB Windows PG15](https://database-eng-exceptional-releases.s3.amazonaws.com/2.27.0/timescaledb-postgresql-15-windows-amd64.zip ) * [TimescaleDB Windows PG16](https://database-eng-exceptional-releases.s3.amazonaws.com/2.27.0/timescaledb-postgresql-16-windows-amd64.zip ) * [TimescaleDB Windows PG17](https://database-eng-exceptional-releases.s3.amazonaws.com/2.27.0/timescaledb-postgresql-17-windows-amd64.zip) * [TimescaleDB Windows PG18](https://database-eng-exceptional-releases.s3.amazonaws.com/2.27.0/timescaledb-postgresql-18-windows-amd64.zip) **Highlighted features in TimescaleDB v2.27.0** * The Hypercore engine now supports a vectorized implementation of filters by evaluating them inline through the standard Postgres function path. This expands the set of queries (including continuous aggregate refreshes) that can take the faster path through the columnstore, yielding speedups ranging from 30% up to 2x in benchmarks. * `UPDATE` and `DELETE` statements with equality predicates can now use bloom filters to skip decompressing batches whose compressed rows can't match. When multiple bloom filters apply, they are evaluated in decreasing order of column count (most selective first), and EXPLAIN now reports filtering activity via the new "Compressed batches filtered" and "Batches filtered after decompression counters". The query performance increases in some case up to 160 times. * `UPSERT` queries can now leverage bloom filters (including composite ones) to skip decompressing batches when the arbiter values are guaranteed not to be present, with the most-selective filter chosen automatically when multiple apply. EXPLAIN output adds new statistics — batches checked by bloom, batches pruned by bloom, batches without bloom, and bloom false positives — for visibility into pruning effectiveness. **Upcoming PostgreSQL 15 EOL announcement** As a reminder, the upcoming TimescaleDB release in June 2026 will officially be the last version with support for PostgreSQL 15. This deprecation was initially announced in the [v2.23.0 changelog](https://github.com/timescale/timescaledb/releases/tag/2.23.0) on October 29, 2025, to provide users ample time to prepare. To ensure uninterrupted access to new features, bugfixes and performance enhancements, all instances must be upgraded to PostgreSQL 16 or greater. **Backward-Incompatible Changes** * [#9579](https://github.com/timescale/timescaledb/pull/9579) The bloom filter sparse indexes on compressed `int2` columns could lead to `SELECT` queries not returning the rows that actually match the `WHERE` condition. The upgrade is blocked for the affected databases, and the incorrect indexes have to be dropped manually before the upgrade. * This release introduces a new naming convention for composite bloom filter metadata. While this change will not disrupt query processing, v2.27 cannot automatically utilize composite bloom filters generated in v2.26. To convert your existing v2.26 composite bloom filters, the legacy metadata columns must be renamed. This is a lightweight, catalog-only operation requiring zero data recompression, which can be done with [this migration script](https://github.com/timescale/timescaledb-extras/blob/main/utils/2.27.x-fix-composite-bloom-columns.sql). **Features** * [#8868](https://github.com/timescale/timescaledb/pull/8868) Use `PG_MODULE_MAGIC_EXT` for `PG18` * [#8967](https://github.com/timescale/timescaledb/pull/8967) Rewriting queries with continuous aggregates exactly matching query aggregation * [#9192](https://github.com/timescale/timescaledb/pull/9192) Push down scalar array operations into the columnar metadata scan by tran _[Truncated at 4000 characters — full notes: https://github.com/timescale/timescaledb/releases/tag/2.27.0]_ ### 2.26.4 — 2.26.4 (2026-04-28) - Date: 2026-04-28 - Version: 2.26.4 - Original notes: https://github.com/timescale/timescaledb/releases/tag/2.26.4 - Permalink: https://whatsnew.fyi/product/timescaledb/releases/2.26.4 - **fixed** — Sanitize DT_NOBEGIN next_start to recover jobs stuck after primary failover - **fixed** — Fix now() constification for continuous aggregate queries - **fixed** — Fix out of memory when propagating ALTER TABLE to many chunks - **fixed** — Fix InstrStartNode called twice in a row - **fixed** — Fix use-after-free of PlaceHolderVar.phrels in cached ChunkAppend plans - **fixed** — Fix PlaceHolderVar error in runtime chunk exclusion - **fixed** — Remove stale hypertable entries during upgrade - **fixed** — Fix segfault with transition tables after column drop - **fixed** — Use DROP CASCADE for trigger removal - **fixed** — Error when querying compressed chunks under Apache license - **fixed** — Make timescaledb_post_restore() reliably restart background workers in a single call - **fixed** — Fix lost orderby sparse index - **fixed** — Replace ERRCODE_INTERNAL_ERROR on user-reachable error paths - **fixed** — Add error on missing custom job function in ts_bgw_job_get_funci - **fixed** — Fix data corruption when merging chunks with different compression settings - **fixed** — Fix sort_transform crash with hypertable on nullable side of outer join - **fixed** — Fix concurrent merge of compressed chunks dropping the new heap - **fixed** — Fix COPY path with transition tables after column drop - **fixed** — Fix incremental continuous aggregate refresh so that extend_last_bucket only applies to the boundary batch - **fixed** — Fix segmentby crash in cagg invalidation tracking This release contains bug fixes since the 2.26.3 release. We recommend that you upgrade at the next available opportunity. **Bugfixes** * [#9360](https://github.com/timescale/timescaledb/pull/9360) Sanitize `DT_NOBEGIN` next_start to recover jobs stuck after primary failover * [#9515](https://github.com/timescale/timescaledb/pull/9515) Fix `now()` constification for continuous aggregate queries * [#9550](https://github.com/timescale/timescaledb/pull/9550) Fix out of memory when propagating `ALTER TABLE` to many chunks * [#9605](https://github.com/timescale/timescaledb/pull/9605) Fix `InstrStartNode` called twice in a row * [#9607](https://github.com/timescale/timescaledb/pull/9607) Fix use-after-free of `PlaceHolderVar.phrels` in cached ChunkAppend plans * [#9612](https://github.com/timescale/timescaledb/pull/9612) Fix `PlaceHolderVar` error in runtime chunk exclusion * [#9614](https://github.com/timescale/timescaledb/pull/9614) Remove stale hypertable entries during upgrade * [#9615](https://github.com/timescale/timescaledb/pull/9615) Fix segfault with transition tables after column drop * [#9616](https://github.com/timescale/timescaledb/pull/9616) Use `DROP CASCADE` for trigger removal * [#9623](https://github.com/timescale/timescaledb/pull/9623) Error when querying compressed chunks under Apache license * [#9625](https://github.com/timescale/timescaledb/pull/9625) Make `timescaledb_post_restore()` reliably restart background workers in a single call * [#9639](https://github.com/timescale/timescaledb/pull/9639) Fix lost orderby sparse index * [#9646](https://github.com/timescale/timescaledb/pull/9646) Replace `ERRCODE_INTERNAL_ERROR` on user-reachable error paths * [#9652](https://github.com/timescale/timescaledb/pull/9652) Add Error on missing custom job function in `ts_bgw_job_get_funci` * [#9655](https://github.com/timescale/timescaledb/pull/9655) Fix data corruption when merging chunks with different compression settings * [#9654](https://github.com/timescale/timescaledb/pull/9654) Fix `sort_transform` crash with hypertable on nullable side of outer join * [#9656](https://github.com/timescale/timescaledb/pull/9656) Fix concurrent merge of compressed chunks dropping the new heap * [#9641](https://github.com/timescale/timescaledb/pull/9641) Fix `COPY` path with transition tables after column drop * [#9660](https://github.com/timescale/timescaledb/pull/9660) Fix incremental continuous aggregate refresh so that `extend_last_bucket` only applies to the boundary batch * [#9674](https://github.com/timescale/timescaledb/pull/9674) Fix segmentby crash in cagg invalidation tracking **Thanks** * @GetsuDer and @WeiJie-JL for reporting an error with timescaledb and extensions using Explain * @igor2x for reporting a problem when trying to query compressed data with the Apache license * @ivaaaan for reporting an issue with constraint pushdown in continuous aggregate queries * @patstrom for reporting a segfault with transition table triggers after dropping a column * @patstrom for reporting an out-of-memory error when dropping constraints * @pcayen for reporting an issue with GROUP BY ROLLUP on views over hypertables