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
v3.6.14
- Fix potential
CoalescingBufferQueuedesync by tracking each body reader index separately by @gavinbunney in https://github.com/Netflix/zuul/pull/2146
Full Changelog: https://github.com/Netflix/zuul/compare/v3.6.13...v3.6.14
v3.6.13
- Ensure
SslExceptionsHandlerswallows all client SSL exceptions, not just handshake failures by @gavinbunney in https://github.com/Netflix/zuul/pull/2145 - Revert "Fix for connection leak issue with HTTP 1xx responses (#2137)" by @matthoffman in https://github.com/Netflix/zuul/pull/2147
- Allow subclasses to override
writeBufferedBodyContentby @gavinbunney in https://github.com/Netflix/zuul/pull/2148
Full Changelog: https://github.com/Netflix/zuul/compare/v3.6.12...v3.6.13
9.4.3
QuestDB 9.4.3 brings some key bug-fixes, along with parquet-native tables and new parquet-querying performance enhancements, with order-of-magnitude speedups for ORDER BY ... LIMIT queries.
For any questions or feedback, please join us on Slack or on Discourse.
See also our prettier release notes page.
- Two-bound
LIMIT nullsemantics changed, aligningLIMIT lo, hiwithLIMIT n:LIMIT null, nnow returns the first N rows (previously the full sorted set)LIMIT n, nullnow returns the empty result (previously all rows).LIMIT nullis unchanged, and returns the full result set.
EXPLAINplan output rewording for encodable sorts:- There was inconsistency in the rendering for 'encoding sorts'; this plan node will now render consistently as
Encode sort light. - If you assert any particular query plan shapes in your regression suite, you will need to update the assertions.
- There was inconsistency in the rendering for 'encoding sorts'; this plan node will now render consistently as
Tables can now store partitions in PARQUET format by default, rather than only NATIVE. Previously, you would need to:
- Run
ALTER TABLE ... CONVERT PARTITION ... TO PARQUETqueries to synchronously convert partitions in QuestDB OSS. - Enable
STORAGE POLICYto asynchronously convert partitions in QuestDB Enterprise.
CREATE TABLE trades (ts TIMESTAMP, price DOUBLE, sym SYMBOL)
TIMESTAMP(ts) PARTITION BY DAY FORMAT PARQUET WAL;
ALTER TABLE trades SET FORMAT PARQUET;
ALTER TABLE trades SET FORMAT NATIVE;
Please note that:
FORMAT PARQUETcan only be set on partitioned write-ahead-log (WAL) tables.- When applying
FORMAT PARQUETviaALTER TABLE, historical partitions will not be automatically converted. FORMAT NATIVEremains the default format for tables in QuestDB.- Out-of-order writes are more expensive when applied to parquet partitions.
There is a fine balance of memory budget versus CPU time when scanning and decoding parquet row groups. A fixed number of decode slots was an inflexible way to balance these two concerns.
Therefore, we have introduced a new memory-budget configuration and deprecated the old slot-based config:
- New:
cairo.sql.parquet.cache.memory.size- This is a per-cursor byte budget for decoded row groups (default 256 MB).
- Deprecated:
cairo.sql.parquet.frame.cache.capacity- This is still accepted, but not used.
The query engine has a number of optimisations based on the native-format data layout. We've revised the long top-K query path for parquet partitions, by removing a sorting tree and pruning projected columns earlier in the process. This is most valuable for queries over wide tables, with a significant sort plus limit workload.
This dramatically reduces unnecessary row-group decoding, and thus improves the scalability of this query shape for larger limits:
ILP/TCP is a mostly-deprecated ingestion path, though maintained for backwards compatibility. As part of this maintenance, we have fixed a bug which could cause stale data to be written to a table, affecting DECIMAL, LONG256 and implicit casts from BINARY to SYMBOL. This only impacted concurrent writes, so a straightforward single worker TCP stream was unaffected.
Thank you to our users who continue to use this feature and give us valuable feedback that helps us to keep it well-maintained.
With the upcoming QuestDB 10.0 release, we recommend planning an upgrade to our new ingestion API, which brings dramatically better performance and usability across the board.
- feat(sql): add
is_end_of_monthSQL function by @Dracylfrr in #7214 - feat(core): add periodic memory usage logging by @jerrinot in #7042
- feat(core): support parquet format table level by @ideoma in #7107
- feat(sql): add a memory-budgeted cache for Parquet random access by @puzpuzpuz in #7230
- perf(sql): speed up ORDER BY ... LIMIT N queries by @kafka1991 in #7222
- perf(sql): speed up parallel ORDER BY ... LIMIT N queries with encoded sort keys by @kafka1991 in #7241
- perf(sql): skip parquet decoding of rows that LIMIT discards by @kafka1991 in #7215
- perf(sql): push down filters into joins wrapped in views and subqueries by @ideoma in #7244
- perf(parquet): speed up partition-to-parquet conversion and reduce file size by @RaphDal in #7206
- fix(sql): fix internal error when a dotted name follows an operator by @bluestreak01 in #7260
- fix(core): fix NATIVE_INDEX_READER leak when a posting-index row cursor is closed after its reader by @bluestreak01 in #7256
- fix(sql): fix wrong results in splice, right and full outer joins with a left-table filter by @puzpuzpuz in #7225
- fix(core): fix unexpected logout during HTTP session rotation by @brunocalza in #7249
- fix(sql): fix internal error when an IN subquery contains a join, and handle declared variables in join ON clauses by @puzpuzpuz in #7211
- fix(core): fix snapshot restore accepting truncated parquet partitions when _pm sidecar exists by @bluestreak01 in #7243
- fix(core): fix POSTING-indexed symbol queries returning wrong rows or crashing by @bluestreak01 in #7253
- fix(wal): fix symbol value corruption when skipping replaced transactions across DDL by @jovfer in #7248
- fix(core): fix Parquet crashes on malformed files and data corruption on partial reads by @glasstiger in #7223
- fix(ilp): fix data corruption in concurrent ILP over TCP by @jerrinot in #7240
- fix(sql): fix wrong first/last results in parallel GROUP BY by @ideoma in #7224
- fix(core): fix posting index crash and wrong covered reads after rollback by @bluestreak01 in #7229
- fix(qwp): fix unresponsive network I/O under heavy QWP ingestion by @jerrinot in #7231
- fix(core): fix crash and native memory overrun in covering index out-of-order commits by @bluestreak01 in #7227
Full Changelog: 9.4.2...9.4.3
v1.47.0 🦇
We now support using the search personalization feature on federated search requests.
Like page/hitPerPage or limit/offset, the personalization option must be specified in the federation attribute to work properly. Otherwise, an error will be returned reminding you to move the attribute in federation.
By @ManyTheFish in https://github.com/meilisearch/meilisearch/pull/6414
- We now better support the tokenizer-related settings
- We improved the quality of the new settings indexer to enhance the engine's performance when changing the locales, the dictionary, synonyms, stop words, separator, and non-separator tokens.
- This makes the new settings indexer feature-complete, meaning that, unless you set the
MEILI_EXPERIMENTAL_NO_EDITION_2024_FOR_SETTINGSenvironment variable totrue, all settings tasks can now be handled by the new settings indexer, bringing a better scaling behavior, much faster cancellation, and a more precise progress view.
By @Kerollmops in https://github.com/meilisearch/meilisearch/pull/6409
We expose more Prometheus metrics to improve observability, specifically to show more metrics on document throughput and ease debugging.
By @Kerollmops in https://github.com/meilisearch/meilisearch/pull/6430
- Putting attributeRank/ wordPosition before words in the rankingRules list will no longer remove hits from the response, by @pjdurden in https://github.com/meilisearch/meilisearch/pull/6437
- Meilisearch will no longer ignore the
searchCutoffMsin some conditions when embedding documents, by @dureuill in https://github.com/meilisearch/meilisearch/pull/6447 - Meilisearch will no longer fail to proxy a search request with a filter containing a
'during remote federated search oruseNetwork: truesearch requests, by @dureuill in https://github.com/meilisearch/meilisearch/pull/6445
- CI: Prevent shell injection in GitHub Actions release workflows by @curquiza in https://github.com/meilisearch/meilisearch/pull/6420
Refactor the search pipeline to mutualize the code. The new implementation will always perform a federated search under the hood, and then the output will be transformed into the expected route's output.
Noticeable changes from the user perspective:
- Some error messages have been modified
- Small breaking change: a few error codes change, such as
MultiSearch<Error><-->Search<Error>
- Make it easier and less error-prone to declare a type that is used as a body parameter on a Meilisearch endpoint, by @dureuill in https://github.com/meilisearch/meilisearch/pull/6429
- Remove the now unused
vectorStoreBackendsetting from the settings, by @Kerollmops in https://github.com/meilisearch/meilisearch/pull/6399 - Replace custom hf-hub git dependency by the official one by @Kerollmops in https://github.com/meilisearch/meilisearch/pull/6442
- Update Python SDK test CI by @Strift in https://github.com/meilisearch/meilisearch/pull/6439
- Refactor the code to use the
MustStopProcessingtype everywhere by @Kerollmops in https://github.com/meilisearch/meilisearch/pull/6423
- @pjdurden made their first contribution in https://github.com/meilisearch/meilisearch/pull/6437
Full Changelog: https://github.com/meilisearch/meilisearch/compare/v1.46.1...v1.47.0
4.34
-
S3
- s3: export per-bucket quota and read-only state metrics by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9923
- s3: validate copy source path segments by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9929
- [s3] validate indirect filer path inputs by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9931
- [s3]: preserve multipart copy checksums by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9948
- s3: give account-less identities a distinct owner instead of admin by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9962
- s3: give STS sessions a distinct owner account instead of admin by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9963
- s3tables: scope management authorization to the caller's identity by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9961
- s3: register account-less identities' synthesized account so ACL/owner ids resolve by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9971
-
Misc
- fix(tests): 32-bit build of EC e2e tests, type-check linux/386 in CI by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9922
- ci: run weed tests on linux/386 by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9924
- fix(util): ignore comment only sql input by @7y-9 in https://github.com/seaweedfs/seaweedfs/pull/9933
-
Shell
- shell: volume.tier.move can move volumes between data centers by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9925
- shell: stop ec.encode/ec.rebuild from destroying live EC shards (no crash needed) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9939
-
Admin Server
- admin: configure maintenance tasks via admin.toml by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9926
- admin: native at-a-glance trend sparklines on the dashboard by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9957
- admin: fold dashboard sparklines into the existing cards (de-dup) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9964
- admin: add connected Mount Clients page and dashboard section by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9968
-
Volume Server
- feat(storage): sweep leftover empty EC .dat stubs on volume server startup by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9927
- fix(storage): never let an empty .dat delete healthy distributed EC shards by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9930
- fix(ec): crash-safe ecx-journal fold and shard rebuild (fsync before publish, no short-read-as-success) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9938
- fix(ec): never delete recoverable EC shards on startup/reconcile (the non-empty-.dat sibling of the stub bug) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9941
- [volume] preserve volume data mtime across tier moves by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9947
- fix(replication): verify-before-destroy in VolumeCopy, check.disk, and over-replication trim by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9943
- fix(vacuum): crash-safe compaction commit with a durable .cpc marker, fsync-before-rename, and a reload fence by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9944
- fix(tiering): never delete a shared remote object while replicas still reference it by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9942
- fix(ec): make ec.decode write-path crash-safe and atomic by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9949
- fix(ec): persist EC source readonly mark and skip writable replicas on orphan cleanup by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9950
- [volume] preserve compression state during replication by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9946
- fix(ec): don't fabricate a stub .vif when mounting an EC volume by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9951
- fix(ec): group orphan-source completeness by encode generation (topology encode_ts_ns) by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9952
- fix(ec): fence stale-worker EC shard cleanup by encode generation by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9953
- fix(storage): delete/unmount every copy of a duplicate volume id by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9954
- fix(ec): remove shared EC index only when no shard remains node-wide by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9955
- fix(ec): recover EC shards with the volume's own ratio, not the build default by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9958
- refactor(ec_balance): make the balance planner per-volume ratio-capable by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9960
-
Metrics
- metrics: overhaul Grafana dashboard for full metric coverage by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9956
- metrics: guard time()-based dashboard panels against unset gauges by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9965
- metrics: add per-bucket S3 panels and volume slot utilization to dashboard by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9969
- filer: keep metadata-subscription send gauge fresh on idle heartbeat by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9966
-
Helm Charts
- [helm]: configure JWT expiration by @chrislusf in https://github.com/seaweedfs/seaweedfs/pull/9940
Full Changelog: https://github.com/seaweedfs/seaweedfs/compare/4.33...4.34
v3.6.12
- Fix for vulnerability where callers could see content meant for other callers if the origin returns an HTTP 1xx response #2137
Presto 0.298
See the release notes at https://prestodb.io/docs/current/release/release-0.298.html
v25.3.5
- fix(backup): reject incremental backups whose read_ts has regressed by @matthewmcneely in https://github.com/dgraph-io/dgraph/pull/9707
- chore(deps): Upgrade go 1.26.4; add a openvex for false positive CVE report by @matthewmcneely in https://github.com/dgraph-io/dgraph/pull/9735
- chore: remove unused buildvars.ComposeBuildDir Var by @mlwelles in https://github.com/dgraph-io/dgraph/pull/9704
- chore(ci): disable scheduled jepsen test runs by @matthewmcneely in https://github.com/dgraph-io/dgraph/pull/9729
- docs(changelog): backfill v25.3.1-v25.3.4 and v24.1.6-v24.1.9 entries by @mlwelles in https://github.com/dgraph-io/dgraph/pull/9705
Full Changelog: https://github.com/dgraph-io/dgraph/compare/v25.3.4...v25.3.5
v25.3.5
- fix(backup): reject incremental backups whose read_ts has regressed by @matthewmcneely in https://github.com/dgraph-io/dgraph/pull/9707
- chore(deps): Upgrade go 1.26.4; add a openvex for false positive CVE report by @matthewmcneely in https://github.com/dgraph-io/dgraph/pull/9735
- chore: remove unused buildvars.ComposeBuildDir Var by @mlwelles in https://github.com/dgraph-io/dgraph/pull/9704
- chore(ci): disable scheduled jepsen test runs by @matthewmcneely in https://github.com/dgraph-io/dgraph/pull/9729
- docs(changelog): backfill v25.3.1-v25.3.4 and v24.1.6-v24.1.9 entries by @mlwelles in https://github.com/dgraph-io/dgraph/pull/9705
Full Changelog: https://github.com/dgraph-io/dgraph/compare/v25.3.4...v25.3.5