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
2.27.2 (2026-06-02)
This release contains bug fixes since the 2.27.1 release. We recommend that you upgrade at the next available opportunity.
Bugfixes
2.27.1 (2026-05-19)
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 Delete orphaned
compression_settingsbefore migrating catalog table - #9799 Fix
job_errorsview leaking failed jobs to non-owners - #9800 Check hypertable ownership before recompression
- #9801 Fix information leak in
policy_reorder_remove - #9824 Adding migration scripts for composite bloom filters
- #9828 Skip columnar index scan when grouping by an expression
- #9830 Skip
ColumnarIndexScanfor GROUPING SETS / ROLLUP / CUBE
Thanks
- @homanp for reporting an information leak with the job_errors view
2.27.0 (2026-05-12)
This release contains performance improvements and bug fixes since the 2.26.4 release. We recommend that you upgrade at the next available opportunity.
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.
UPDATEandDELETEstatements 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.UPSERTqueries 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 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 The bloom filter sparse indexes on compressed
int2columns could lead toSELECTqueries not returning the rows that actually match theWHEREcondition. 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.
Features
- #8868 Use
PG_MODULE_MAGIC_EXTforPG18 - #8967 Rewriting queries with continuous aggregates exactly matching query aggregation
- #9192 Push down scalar array operations into the columnar metadata scan by transforming them into an
OR/ANDclause. - #9355 Defer
segmentbydefault for direct compress - #9374 Use bloom filters to eliminate decompression of unrelated compressed batches during
UPSERTs. - #9396 Analyze and get
segmentbyduring direct compress - #9398 Fix chunk exclusion for
IN/ANYon open (time) dimensions - #9399 Use bloom filters to reduce decompression during
UPDATE/DELETEcommands. - #9403 Set default
segmentbyduring direct compress flush - #9437 Allow running compression as part of refresh policy for compressed continuous aggregates
- #9443 Enable vectorized aggregation in some cases when the
WHEREclause contains filters not handled through the "Vectorized Filters" facility. This includes e.g. filters ontime_bucket(). - #9458 Remove
_timescaledb_functions.repair_relation_acls - #9475 Calculate hashes for bloom filter predicates at planning time.
- #9504 Allow
ALTER TABLE RESETon materialization hypertables - #9521 Add support for reporting index creation progress
- #9559 Notice on compression settings change
- #9569 For nullable
orderbycolumns do segmentwise decompress-compress instead of segmentwise recompress. - #9583 Drop existing sparse indexes when dropping columns
- #9648 Support
ENABLE/DISABLE TRIGGERon hypertables - #9702 Allow Batch Sorted Merge for unordered chunks with no
segmentbyor when allsegmentbycolumns are pinned to aConst
Bugfixes
- #9363 Change compression job status when chunks could be compressed
- #9413 Fix incorrect decompress markers on full batch delete
- #9414 Fix
NULLcompression handling inestimate_uncompressed_size - #9417 Fix segfault in
bloom1_contains - #9479 Disallow sub-day offset for
time-bucketonDate - #9482 Forbid Batch Sort Merge on nullable
orderbycolumns - #9490 Disallow negative interval as
chunk_interval - #9500 Fix off-by-one error when building object name
- #9519 Remove self-referential
FOREIGN KEYconstraints from catalog - #9561 Simplify job history retention by replacing binary search and temp table
- #9590 Fix policy skipping uncompressed chunks
- #9596 Remove unused
process_hypertable_invalidationspolicy code - #9604 Remove dead
post_parse_analyze_hookcapture in loader - #9610 Fix use-after-free crash in
cache_destroyduring transaction abort - #9632 Preserve chunk settings during recompress
- #9640 Fix
NULLdatumCopycrash insegmentbyanalysis - #9680 Fix segfault in direct compress insert on hypertable with dropped column
- #9692 Fix internal "invalid perminfoindex 0 in RTE" error on
MERGE NOT MATCHED INSERTinto a hypertable - #9705 Avoid double
TOASTdelete whenDELETE-after-compressionis enabled - #9705 Only freeze compressed rows when truncating uncompressed chunk
- #9706 Use
bigintinestimate_uncompressed_sizecalculations - #9709 Reject mismatched element type in
bool/uuiddecompression - #9710 Return
bigintfromcompressed_data_column_size - #9711 Fix registration row leak when continuous aggregate refresh fails
- #9697 Improve
pathkeyhandling for compressed sub-paths during sort transformation - #9743 Fix the composite bloom metadata column naming scheme
- #9767 Skip dropped chunks when trying to remove
ts_cagg_invalidation_trigger - #9747 Reject inheriting from a hypertable
- #9744 Use a fixed call string for the telemetry job in
ts_stat_statementsrecording - #9736 Do logical sparse index comparison
- #9731 Avoid creating overlapping batches during recompression for multi orderby configurations
- #9717 Reject non-positive time bucket width on cagg creation
- #9707 Fix policy name comparison in remove_policies
New Settings
enable_cagg_rewrites: enables rewriting queries with CAggs. Off by default.cagg_rewrites_debug_info: prints CAgg rewrites diagnostics. Off by default.enable_columnar_scan_filter_pushdown: enables pushing the filters on columnar scan down to the compressed scan level. On by default.
Thanks
- @fabriziomello for adding support for
PG_MODULE_MAGIC_EXT - @maltalex for reporting an issue with index creation progress reporting
- @pavanmanishd for the first version of the fix for #9743
- @h0rn3t for reporting issue with recompression creating overlapping batches
2.26.4 (2026-04-28)
This release contains bug fixes since the 2.26.3 release. We recommend that you upgrade at the next available opportunity.
Bugfixes
- #9360 Sanitize
DT_NOBEGINnext_start to recover jobs stuck after primary failover - #9515 Fix
now()constification for continuous aggregate queries - #9550 Fix out of memory when propagating
ALTER TABLEto many chunks - #9605 Fix
InstrStartNodecalled twice in a row - #9607 Fix use-after-free of
PlaceHolderVar.phrelsin cached ChunkAppend plans - #9612 Fix
PlaceHolderVarerror in runtime chunk exclusion - #9614 Remove stale hypertable entries during upgrade
- #9615 Fix segfault with transition tables after column drop
- #9616 Use
DROP CASCADEfor trigger removal - #9623 Error when querying compressed chunks under Apache license
- #9625 Make
timescaledb_post_restore()reliably restart background workers in a single call - #9639 Fix lost orderby sparse index
- #9646 Replace
ERRCODE_INTERNAL_ERRORon user-reachable error paths - #9652 Add Error on missing custom job function in
ts_bgw_job_get_funci - #9655 Fix data corruption when merging chunks with different compression settings
- #9654 Fix
sort_transformcrash with hypertable on nullable side of outer join - #9656 Fix concurrent merge of compressed chunks dropping the new heap
- #9641 Fix
COPYpath with transition tables after column drop - #9660 Fix incremental continuous aggregate refresh so that
extend_last_bucketonly applies to the boundary batch - #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
2.26.3 (2026-04-14)
This release contains bug fixes since the 2.26.2 release. We recommend that you upgrade at the next available opportunity.
Bugfixes
- #9511 Fix
alter_jobfailing for retention policy withdrop_created_beforeargument - #9557 Clean up orphaned
compression_chunk_sizeentries during the extension upgrade - #9551 Fix resource leaks on error paths for during a continuous aggregate refresh
- #9563 Fix gapfill out-of-order bucket creation during DST shift
- #9571 Fix concurrent refreshes of continuous aggregates
Thanks
- @sebastian-ederer for reporting an issue with alter_job and drop_created_before
- @petergledhillinclusive for reporting the DST shift issue with time_bucket_gapfill
- @GTan615 for reporting the data duplicate issues observed during overlapping cagg refreshes
2.26.2 (2026-04-07)
This release contains bug fixes since the 2.26.1 release. We recommend that you upgrade at the next available opportunity.
Bugfixes
- #9460 Fix WAL record tracking in
EXPLAINfor direct compress - #9485 Fix use-after-free of invalidation in
tsl_compressor_free - #9486 Fix use-after-free in job owner validation
- #9487 Fix use-after-free in
reorder_chunk - #9392 Fix wrong result when performing chunk exclusion by a mutable expression
- #9510 Fix chunk skipping with dropped columns
- #9522 Fix
GROUP BY ROLLUPon compressed continuous aggregates
Thanks
- @pcayen for reporting an issue with GROUP BY ROLLUP
- @PiotrCiechomski for reporting the wrong result with chunk exclusion by a mutable expression
2.26.1 (2026-03-30)
This release contains bug fixes since the 2.26.0 release. We recommend that you upgrade at the next available opportunity.
Bugfixes
- #9455 Fix memory leak in ColumnarScan
2.26.0 (2026-03-24)
This release contains performance improvements and bug fixes since the 2.25.2 release. We recommend that you upgrade at the next available opportunity.
Highlighted features in TimescaleDB v2.26.0
- The vectorized aggregation engine now evaluates PostgreSQL functions directly on columnar arguments and stores the results in a columnar format to preserve the high-speed execution pipeline. For analytical queries that leverage functions like
time_bucket()in grouping or aggregation expressions, the function is evaluated natively without falling back to standard row-based processing. This enhancement ensures that the remainder of the query can seamlessly continue using the highly efficient columnar pipeline, yielding performance improvements of 3.5 times faster. - The query execution engine now supports composite bloom filters for
SELECTandUPSERToperations, pushing down multi-column predicates directly to compressed table scans. This optimization bypasses costly batch decompression by automatically selecting the most restrictive bloom filter to quickly verify if target values are present. Showing over two times faster query performance when a composite bloom filter is used. Additionally, query profiling now includes detailedEXPLAINstatistics to monitor batch pruning and false-positive rates. - The custom node
ColumnarIndexScanadjusts the query plan to fetch values from the sparse minmax indexes, improving query performance on the columnstore by up to 70x. For analytical queries that leverage functions likeCOUNT,MIN,MAX,FIRST(limited), andLAST(limited), the sparse index is being read instead of decompressing the batch.
Features
- #9104 Support
min(text),max(text)for C collation in columnar aggregation pipeline - #9117 Support functions like
time_bucketin the columnar aggregation and grouping pipeline. - #9142 Remove column
droppedfrom _timescaledb_catalog.chunk - #9238 Support non-partial aggregates with vectorized aggregation
- #9253 Support
VectorAggin subqueries and CTEs - #9266 Add support for
HAVINGto vectorized aggregation - #9267 Enable
ColumnarIndexScancustom scan - #9312 Remove advisory locks from bgw jobs and add graceful cancellation
- #8983 Add GUC for default chunk time interval
- #9334 Fix out-of-range timestamp error in WHERE clauses
- #9368 Enable runtime chunk exclusion on inner side of nested loop join
- #9372 Push down composite bloom filter checks to
SELECTexecution - #9374 Use bloom filters to eliminate decompression of unrelated compressed batches during
UPSERTstatements - #9382 Fix chunk creation failure after replica identity invalidation
- #9398 Fix chunk exclusion for
IN/ANYon open (time) dimensions
Bugfixes
- #9401 Fix forced refresh not consuming invalidations
- #7629 Forbid non-constant timezone parameter in
time_bucket_gapfill - #9344 Wrong result or crash on cross-type comparison of partitioning column
- #9356 Potential crash when using a hypertable with partial compression or space partitioning in a nested loop join
- #9376 Allow
CREATE EXTENSIONafter drop in the same session - #9378 Fix foreign key constraint failure when inserting into hypertable with referencing a foreign key
- #9381 Data loss with direct compress with client-ordered data in an
INSERT SELECTfrom a compressed hypertable - #9413 Fix incorrect decompress markers on full batch delete
- #9414 Fix
NULLcompression handling inestimate_uncompressed_size - #9417 Fix segfault in
bloom1_contains
GUCs
default_chunk_time_interval: Default chunk time interval for new hypertables. This is an expert configuration, please do not alter unless recommended from Tiger Data.enable_composite_bloom_indexes: Enable creation of bloom composite indexes on compressed chunks. Default:true
Thanks
- @bronzinni for reporting an issue with foreign keys on hypertables
- @janpio for reporting an issue with CREATE EXTENSION after dropping and recreating schema
- @leppaott for reporting a deadlock when deleting jobs