2.30.2 (2026-09-29)
This release contains bug fixes since the 2.30.1 release. We recommend that you upgrade at the next available opportunity.
Bugfixes
- #10665 Fix crash when merging chunks with different column layouts
- #10668 Fix
DROP SCHEMA CASCADEleaving orphaned compressed chunks - #10682 Fix vectorized text comparison ignoring a non-deterministic collation given in the query
- #10609 Fix race while updating granular refresh setting for hypertable
- #10613 Rename the granular refresh options to
timescaledb.cagg_granular_refresh_* - #10636 Free the tenant tracker's shared memory when its hypertable is dropped
- #10585 Potential crash in
CREATE TABLE ASquery selecting from a compressed hypertable
2.30.1 (2026-09-17)
This release contains bug fixes since the 2.30.0 release. We recommend that you upgrade at the next available opportunity.
Bugfixes
- #10580 Fix missing conflicts for
INSERT ... ON CONFLICTwith multiple unique constraints - #10583 Fix
NULLconflict resolution on single-column bloom filtering - #10592 Fix duplicate rows from
DeferredChunkAppendwhenLIMITis not pushed down - #10593 Fix
cannot cast type cstringerror inDeferredChunkAppendqueries
Thanks
2.30.0 (08.09.2026)
This release contains performance improvements and bug fixes since the 2.29.2 release. We recommend that you upgrade at the next available opportunity.
Highlighted features in TimescaleDB v2.30.0 Blazing fast LIMIT queries with the newly introduced DeferredChunkAppend. This custom node reduces planning significantly by delaying chunk expansion. During planning the hypertable stays unexpanded and only during execution are chunks enumerated on demand. Combined with the optimizations to FIRST and LAST sparse indexes, this addition executes last-point queries far more efficiently and quickly. This changes the scaling of the "What is the last reading from this sensor" query from linear with number of chunks to constant if it can be found in the most recent chunk. The true power of the custom node starts to show with increasing amount of chunks, see more elaborate benchmarks.
Features
- https://github.com/timescale/timescaledb/pull/10147 Support segmentwise batch sorted merge for overlapping batches
- https://github.com/timescale/timescaledb/pull/10292 Add
DeferredChunkAppendcustom scan - https://github.com/timescale/timescaledb/pull/10354 Adds DML support for concurrent compaction
- https://github.com/timescale/timescaledb/pull/10388 Add custom toaster for compression
Bugfixes
- https://github.com/timescale/timescaledb/issues/10058 Apply new sortkeys for in-memory recompression
- https://github.com/timescale/timescaledb/pull/10128 Include hypertable chunks in publications created with
FOR TABLES IN SCHEMA - https://github.com/timescale/timescaledb/issues/10325 Avoid test errors when building from a source archive without a git repository
- https://github.com/timescale/timescaledb/pull/10408 Verify columns and their types in
create_compressed_chunk - https://github.com/timescale/timescaledb/pull/10515 Fix row level security checks after dropping hypertable columns
- https://github.com/timescale/timescaledb/issues/9905 Potentially incorrect result of a join when the join clause contains
time_bucket - https://github.com/timescale/timescaledb/issues/9920 Fix the "XX000: failed to evaluate runtime constant in vectorized filter" error in some queries that use stable functions in
WHEREclause and the columnar aggregation pipeline - https://github.com/timescale/timescaledb/pull/10499 Potentially wrong query result when hypertable chunks are filtered out at query run time, the filter condition uses an uncorrelated subquery, and the query uses a parallel execution plan
- https://github.com/timescale/timescaledb/pull/10513 Remove
user_catalog_tableoption from catalog tables - https://github.com/timescale/timescaledb/pull/10506 Correctly match
NULLtuples to compressed batches withNULLboundaries during recompression - https://github.com/timescale/timescaledb/pull/10524 Shared memory leak in the chunk stats subsystem when databases are dropped
- https://github.com/timescale/timescaledb/pull/10535 Fix chunk merging with default sparse indexes
- https://github.com/timescale/timescaledb/pull/10536 Skip batch size check when direct compress is set as hypertable option
- https://github.com/timescale/timescaledb/pull/10539 Allow deletes from the policy chunk stats table when the database publishes all tables
GUCs
enable_deferred_chunk_append: Custom scan node for hypertables that iterates chunks at execution instead of expanding every chunk at plan time. Default: true.use_custom_toaster: Use a custom TOAST writer for compressed row inserts. Default: false.
Thanks
- @tureba for reporting the problem with building from a source archive without a git repository https://github.com/timescale/timescaledb/issues/10325
- @AlexFavre for reporting a failed extension update when a publication for all tables exists https://github.com/timescale/timescaledb/issues/10477
- @peterecofit for reporting potentially wrong query result when hypertable chunks are filtered out at query run time https://github.com/timescale/timescaledb/issues/10503
- @esdanieljaegers for reporting the issue and providing steps for reproduction https://github.com/timescale/timescaledb/issues/10511
2.29.2 (2026-08-18)
This release contains bug fixes since the 2.29.1 release. We recommend that you upgrade at the next available opportunity.
Bugfixes
- #10189 Fix user-defined functions named
time_bucketcausing SQLSTATEXX000 - #10363 Fix
time_bucket_gapfill()with window aggregates over constants - #10416 Repair mismatched dimensional
CHECKconstraints - #10423 Fix compressed
SkipScandropping uncompressed rows when sort keys do not match distinct keys - #10430 Do not attach
SkipScanto mismatchedIndexScanpaths underMergeAppend - #9921 Fix wrong results for
IS NULLpredicates with min/max sparse-index pushdown
Thanks
- @borisborelly for reporting incorrect results with
COUNT(DISTINCT)due toSkipScandropping uncompressed rows.
2.29.1 (2026-08-04)
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 for more information on the vulnerability and the platforms that are affected. We recommend that you upgrade at the next available opportunity.
Bugfixes
- #10327 Assertion failure in
add_dimension()when the hypertable argument isNULL - #10339 Fix crash when deleting from a compressed continuous aggregate source
- #10340 Validate
max_batchesincompact_chunk() - #10352 Reset inherited column and constraint flags on chunks during
attach_chunk() - #10360 Fix decompressor crashes with malformed compressed data
- #10369 Fix typo in error message about
MERGEsupport on compressed hypertables - #10379 Read hypertable max time value with an ordered scan
- #10386 Add missing permission checks to internal chunk functions
Thanks
- @JoongHyuk-Shin for reporting and fixing
NULLhandling inadd_dimension() - @igor2x for reporting a typo in a
MERGEsupport error message - @mdisec for reporting issues with compressed data validation during decompression
2.29.0 (2026-07-28)
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 drastically improves the performance of
UPDATEandDELETEstatements on hypertables. By acquiring exclusive locks only on the specific chunks being modified rather than the entire hypertable, this enhancement eliminates massive lock contention and keeps high-concurrency workloads running smoothly without unnecessary slowdowns. - Intelligent row-by-row decompression enables the query planner to decompress data row-by-row rather than in large batches when an operation prioritizes a fast initial response (such as queries with
LIMITclauses). This dramatically reduces memory overhead and query latency, ensuring lightning-fast performance when you only need to retrieve a small subset of records from your compressed hypertables.
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 Remove support for PostgreSQL 15
Features
- #9315 Speed up
DMLoperations on hypertables by using the optimized TimescaleDB hypertable expansion code instead of the generic PostgreSQL inheritance hierarchy expansion - #9534 Speed up expression evaluation in the columnar pipeline by caching common subexpressions
- #9684 Add
_timescaledb_functions.decompress_batch()SQL function - #9732 Speed up some queries with small
LIMITby switching to row-by-row query execution pipeline - #9917 Decompress less data in
DMLon compressed hypertables by accounting for prepared statement parameters - #9957 Add
compact_chunk()function - #10048 Support concurrent refresh policies on hierarchical continuous aggregates
- #10081 Add
samplerateargument to_timescaledb_functions.estimate_uncompressed_size() - #10100 Skip classifying compressed relations to speed up planning
- #10118 Don't track compressed relations as separate chunk
- #10119 Reduce memory usage of
INSERTqueries using direct compress and spanning multiple chunks - #10163 Add a compaction policy for unordered chunks
- #10204 Don't create separate hypertable catalog entry for hypertables with compression
- #10217 Initial placeholder version of granular refresh API
- #10225 Add
config_mergeparameter toalter_job()for mergingjsonbinto the existing job configuration - #10226 Add
recompress_unorderedcolumnstore policy option - #10231 Use
regclassfor storing relation reference in chunk table - #10237 Add helper functions for decoding hypertable status
- #10240 Add the
tsdb.direct_compressstorage parameter that allows enabling direct compress for a given hypertable independent of global settings - #10266 Add
max_batchestocompact_chunk() - #10299 Add
continuous_aggs_tenant_trackingandhypertable_cagg_settingscatalogs
Bugfixes
- #10013 Make ownership error messages on continuous aggregates consistent
- #10052 Result of
MIN/MAXaggregate functions in columnar aggregation pipeline possibly inconsistent with plain PostgreSQL result - #10071 Prune the real-time branch of hierarchical continuous aggregates at any nesting depth
- #10143 Fix division by zero when planning
time_bucketwith zero width - #10199 Fix
initial_starthandling inbuild_job_info - #10213 Cache sort pathkeys per hypertable
- #10221 Fix incremental refresh skipping the last bucket
- #10278 Drop
job_errorsview inbgw_job_stat_historymigration - #10280
RETURNINGclause returned no rows forINSERTusing direct compress - #10281 Disable direct compress when the destination table has an exclusion constraint so the constraint is still enforced
- #10282 Only count directly compressed rows toward the command tag when the
INSERTsets it - #10286 Propagate
VACUUMon a chunk to the compressed relation when running on the chunk directly - #10302 Fix useless-join removal and self-join elimination for hypertables
- #10313 Allow running
ALTER EXTENSION timescaledb UPDATEinside a transaction block - #10315 Fix overlap detection with running max
- #10324 Fix stale index entries after
rebuild_sparse_index()on compressed chunks
GUCs
timescaledb.enable_hypertable_expansion_for_dml: allow using the optimized TimescaleDB hypertable expansion code forUPDATEandDELETEinstead of the generic PostgreSQL inheritance hierarchy expansion. On by default.
Thanks
- @FrancescEthon and @ManuelEthon for reporting an issue with incremental refresh skipping the last bucket
- @h0rn3t for reporting a problem with
VACUUMnot propagating to the compressed relation - @igor2x for reporting an issue with locking during DML statements on hypertables
- @MaximeEthon for reporting an issue with prepared statement parameters in DML decompression
- @proddata for reporting a problem when upgrading from 2.15.3 to 2.28.2
- @tureba for reporting and fixing stale sparse-index entries after rebuild
- @viniciusrsouza for reporting an issue with hierarchical continuous aggregates
2.28.3 (2026-07-16)
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 Wrong result when evaluating a function returning
NULLin the columnar query execution pipeline - #10178 Fix incorrect usage of sort transformation for sort key expressions with negative constants
- #10179 Allow enabling and disabling triggers on hypertables with columnstore enabled
- #10182 Fix columnstore sort pushdown to check for different query sort key collation
- #10209 Fix potentially wrong results for
stddev(float4)andstddev(float8)when used withavg()in the columnar query execution pipeline - #10212 Fix race condition when enabling compression on a hypertable
- #10230 Batch filtering for compressed
DMLshould respect collation - #10254 Direct delete failed to handle array predicates with
NULLvalues and deleted more rows than intended (#10129) - #10257 Reuse existing
dimension_sliceIDs when possible - #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 (2026-06-30)
This release contains bug fixes since the 2.28.1 release. We recommend that you upgrade at the next available opportunity.
Bugfixes
- #10126 Fix
bgw_job_stat_historymigration for 2.28.1 - #10133 Fix
chunk_constraintmigration - #10137 Fix column ordering on
first/last-based sparse indexes - #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 (2026-06-23)
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 Fix potential crash on
DMLon compressed tables when the plan usesBitmap Heap Scan - #10091 Fix column rename for compressed chunks
- #10056 Enforce
CHECK,NOT NULLand viewWITH CHECK OPTIONconstraints for direct compress inserts - #10059 Fix error when using
first/lastaggregates in aHAVINGclause - #10060 Fix
first/lastoptimization returning the same value for aggregates that share the value column but order by different columns - #10061 Fix internal error in
first/lastfor unsortable types - #10069 Fix
bgw_job_stat_historydefinition - #10073 Fix uncompressed size estimate for
varlen - #10089 Fix deleting every row on compressed hypertable with subquery returning constant false
- #10094 Fix use-after-free in
ALTER TABLE ADD CONSTRAINT
Thanks
- @skrenes for reporting a problem with the
job_historyview when upgrading to 2.28.0
2.28.0 (2026-06-16)
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()andlast()queries on compressed data. TimescaleDB derivesfirst(value, time)andlast(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 viabuckets_per_batch,max_batches_per_execution, andrefresh_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
CASEexpressions. TimescaleDB's columnar executor can now evaluateCASE ... WHENexpressions 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 <cagg> ADD COLUMN <name> <type> GENERATED ALWAYS AS (<aggregate>) STOREDto 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 asNULL; 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.
Backward-Incompatible Changes
- #9934 Remove adaptive chunking
Features
- #4054 Support
ANALYZEandVACUUMon continuous aggregates by redirecting to the underlying materialization hypertable - #9125 Increase the parallelism of
SELECTqueries over compressed hypertables to approximately match the uncompressed data size - #9410 Mark
hypertableandchunkas user catalog tables - #9416 Support some forms of
CASEexpression in columnar aggregation and grouping - #9580 Add
first/lastsparse indexes to compression - #9784 Use
first/lastsparse index fororderbymetadata on new compressed chunks - #9668 Allow database owner to configure hypertables and policies
- #9701 Relax lock during continuous aggregate invalidation log processing
- #9730 Add in-memory observability for compressed chunks
- #9735 Improve
GapFillrow count estimate - #9821 Allow subquery results which are exec params as GapFill arguments
- #9825 Support
ADD COLUMNon continuous aggregates - #9842 Suppress continuous aggregate invalidation tracking during bulk loads
- #9878 Remove
chunk_constraintcatalog tracking for foreign keys - #9893 Remove
chunk_constraintcatalog tracking for non-dimensional constraints - #9903 Incremental refresh for
refresh_continuous_aggregate() - #9915 Remove
_timescaledb_catalog.chunk_constrainttable - #9938 Add
rebuild_sparse_indexfunction - #9964 Add a function to lock OSM chunk's dimension slice
- #9980 Support
first/last(value, time)inColumnarIndexScan
Bugfixes
- #9708 Guard time bucket parameter handling against bad input
- #9745 Check constraints when adding unique constraints to chunks
- #9890 Fix incremental refresh batch boundaries to align with variable-width buckets and start only where a chunk and an invalidation overlap
- #9914 Fix use-after-free in segmentwise recompression
- #9929 Fix background jobs being bumped in the queue forever and never running
- #9955 Fix wrong results when using Batch Sorted Merge with no first-last index on a non-leading order by column
- #9967 Block upgrade after downgrade with first/last indexes present
- #9976 Fix wrong results when comparing a date column to a
timestamptzvalue - #9977 Fix
COPY WHEREinto a hypertable with dropped columns - #9981 Fix set-returning functions in the sort key of
ColumnarScan - #9982 Reject
ALTER TABLE ... INHERITwhen the parent is a hypertable - #9984 Fix handling of
NOT VALID NOT NULLconstraint for query optimization - #9986 Handle
MERGE WHEN NOT MATCHED BY SOURCEon hypertables - #9988 Fix
time_bucket_gapfillfunction detection - #10003 Block unsafe updates of unique columns on compressed chunks
- #10024 Fix
approximate_row_counthandling of Infinity - #10025 Fix rename on compressed continuous aggregates
- #10026 Fix chunk skipping near
PG_INT64_MAX
New Settings
skip_cagg_invalidation: skip continuous aggregate invalidation tracking for DML and DDL in the current session/transaction. Off by default.stats_max_chunks: set the per-database compressed chunk statistics cache capacity. Defaults to 1024 chunks; set to 0 to disable the feature.
Thanks
- @Fabian-2596 for suggesting more accurate GapFill row count estimate
- @otjdiepluong for fixing spelling mistakes in timescaledb source code comments
- @scimad and @Nosfistis for suggesting expanding coverage for gapfill arguments