date: 2026-10-09
title: 'Spice v2.4.0-rc.1 (Oct 8, 2026)'
type: blog
authors: [sgrebnov]
tags: [release, performance, caching, http, s3, huggingface]
Spice v2.4.0-rc.1 is now available! 🔥
Spice v2.4.0-rc.1 is the first release candidate for v2.4.0. It adds performance improvements, S3 event-driven ingestion, SQL results-cache warmup, and adaptive HTTP rate controls. The release also upgrades to DataFusion v55, Ballista v55, Arrow v59, Vortex v0.86, Iceberg v0.11, and Turso v0.81.
Highlights in v2.4.0-rc.1 include:
What's New in v2.4.0-rc.1
Performance & Query Engine
This release upgrades Apache DataFusion to the v55.2.0 dependency line and Apache Arrow to v59.3.0. It also upgrades Vortex to v0.86.1, Apache Iceberg to the v0.11.0 fork, and Apache Ballista to v55.
Apache DataFusion v55
The DataFusion v55 release (opens in a new tab) adds the following improvements:
- Sort pushdown and TopK pruning: Parquet scans reevaluate each unread row group as the threshold for
ORDER BY ... LIMIT tightens. They skip groups that cannot contribute to the result. TopK pruning also supports multiple sort columns.
- Join planning: The optimizer converts eligible inner joins to semi joins and removes redundant sides of outer joins. It also orders filter predicates by estimated cost.
- Aggregation and expressions: Multi-column
GROUP BY uses column-oriented storage for all supported key types, such as fixed-size binary UUIDs. More string functions preserve dictionary encoding, and IN lists use specialized paths for small integer types.
- Parquet reads: Scans skip nested fields that the declared schema does not contain. They also skip page-index reads when a file has no page index.
- Spill handling: Sorts bound the number of streams in a merge. If memory is insufficient, they spill the largest stream again in smaller batches.
- SQL diagnostics and functions:
EXPLAIN accepts PostgreSQL-style options and FORMAT pgjson. New array functions cover element-wise addition, subtraction, scaling, sums, and averages.
Spice carries these changes through its query plans and preserves statistics across plan wrappers. Cayenne keeps Vortex scans below 10 MiB unsplit to avoid repeated footer reads. See #14612 (opens in a new tab).
Vortex v0.79.0 to v0.86.1
Spice v2.3.2 used the Vortex v0.79.0 fork. This upgrade covers the full upstream range from v0.79.0 through v0.86.1, not only the v0.86 changes:
- Types and arithmetic: Vortex adds native
Map arrays, Arrow map conversion, and operations and compression for maps. It also adds union arrays and decimal addition, subtraction, multiplication, and division.
- Row selection: Piecewise-sequence indices represent contiguous selections without an expanded index for every row. Specialized paths handle chunked arrays, fixed-size lists, variable-length lists, and binary values.
- Scans and expressions: Layout scans gain a physical plan and expression optimization. Filters can pass through scalar functions with multiple arguments. Filters on wide lists restrict child elements to the selected range, and constant masks can resolve from metadata.
- Compression: Binary arrays support FSST compression with variable-length offsets. OnPair becomes a stable encoding for reads and gains a storage-backed dictionary. Vortex can convert run-end arrays of lists and decimals.
- File metadata: Files can store custom metadata. Readers cache decoded type descriptions, and file-format editions define the supported encodings and types.
- Memory and execution: Builders append nested values in batches, preserve list views, and propagate buffer allocators. Expression rewrites retain unchanged nodes, and row functions support batch execution.
- Correctness and validation: NULL handling changes cover dictionary predicates,
BETWEEN bounds, and empty arrays. Readers add validation for footer offsets, compression metadata, and array indices. Other corrections cover nested scalar hashes, decimal operations, and variable-length binary selections above 4 GiB.
See the complete Vortex v0.79.0 to v0.86.1 changelog (opens in a new tab) for every upstream change. Changes to standalone Vortex bindings and GPU execution do not imply new Spice features.
Apache Iceberg v0.11.0
Spice updates its Iceberg reader and catalog integrations from v0.10.1 to the v0.11.0 fork for DataFusion 55 and Arrow 59. The upstream v0.11 changes (opens in a new tab) extend reads and catalog compatibility:
- Iceberg v3 reads: The reader applies deletion vectors from Puffin files and carries row identifiers and sequence numbers through scans.
- Metadata-only scans: Metadata-only projections do not require data-column reads. Manifest reads reuse partition types, and positional-delete processing buffers runs instead of allocating a key per row.
- REST catalogs: Clients negotiate server-advertised endpoints and use session-scoped OAuth2 authentication.
The upgrade also aligns Iceberg storage with OpenDAL v0.58. See #14771 (opens in a new tab).
Apache Ballista v55
Spice.ai Enterprise (opens in a new tab) feature. See the Enterprise documentation (opens in a new tab).
The Ballista v55 upgrade (opens in a new tab) adds virtual-core resource accounting for distributed tasks. A protocol-version handshake detects incompatible schedulers and executors. Cancellation identifies tasks by their task IDs, and task-state records use an append-only model.
Schedulers and executors must run the same version. Upgrade all cluster components together.
S3 Event-Driven Ingestion
S3 (opens in a new tab) listing datasets can use refresh_mode: changes with S3 event notifications delivered through SQS:
datasets:
- from: s3://my-bucket/events/
name: events
params:
file_format: parquet
s3_region: us-east-1
s3_auth: iam_role
s3_changes_queue_url: ${ secrets:events_queue_url }
acceleration:
enabled: true
engine: cayenne
mode: file
refresh_mode: changes
datasets:
- from: s3://my-bucket/events/
name: events
params:
file_format: parquet
s3_region: us-east-1
s3_auth: iam_role
s3_changes_queue_url: ${ secrets:events_queue_url }
acceleration:
enabled: true
engine: cayenne
mode: file
refresh_mode: changes
New object notifications append the object's rows. A periodic listing backfill covers missed or expired notifications. Each dataset needs its own queue and permissions to read and delete SQS messages, alongside its S3 read/list permissions.
This is object ingestion: removal notifications are ignored by default. Set s3_on_object_removed: rebuild to rebuild the entire prefix when an object is removed. An overwrite of an already applied object key is not ingested again; use new object keys for incoming data. See #14121 (opens in a new tab).
SQL Results-Cache Warmup and Shared Fetches
The SQL results cache can persist query plan shapes and replay them after a dataset's first full or append refresh:
runtime:
caching:
sql_results:
enabled: true
warmup: on_first_refresh
runtime:
caching:
sql_results:
enabled: true
warmup: on_first_refresh
For example, run these queries against an accelerated orders dataset with warmup enabled:
SELECT id, status FROM orders WHERE id = 1;
SELECT id, status FROM orders WHERE id = 2;
SELECT id, status FROM orders WHERE id = 1;
SELECT id, status FROM orders WHERE id = 2;
Spice records one query shape because only the equality-filter value differs. After a restart and the dataset's first full or append refresh, warmup reruns that shape with distinct id values from the refreshed dataset, filling the cache before the dataset becomes ready. Keep the local .spice/data directory across restarts, or configure runtime.state.location, to retain recorded query shapes.
Warmup replays up to ten distinct recorded query shapes and tries up to 1,024 distinct filter-value combinations per shape, stopping when the cache is full. A dataset stays not ready until warmup completes. Later refreshes do not repeat warmup. The feature requires the default plan-based cache key; cache_key_type: sql is incompatible. See #14178 (opens in a new tab).
Concurrent cache-miss fetches for the same request now share a source fetch. SQL results caching also includes changes for tables updated during query execution and for stale results served while revalidation runs. HTTP dataset caching supports RFC 5861 stale-if-error handling. See #14142 (opens in a new tab), #14710 (opens in a new tab), #14708 (opens in a new tab), and #14134 (opens in a new tab).
SQL, search, and embedding caches now use Spice's sharded cache backend. Existing engine: moka and engine: pingora values are accepted for configuration compatibility but no longer select a backend.
Adaptive HTTP Rate Controls
HTTP rate controls now adapt admission to upstream failures while staying within configured request limits. rate_control_acquire_timeout bounds how long a request waits for capacity and defaults to the connector's client timeout. rate_control_failure_threshold and rate_control_window control the response to upstream failures.
In Spice.ai Enterprise, instances that share a runtime.state.location coordinate per-second and per-minute limits through shared state; OSS instances keep these limits in memory independently. Concurrency limits remain local to each instance. Components sharing an upstream origin must use matching rate-control settings. See HTTP rate-control documentation (opens in a new tab) and #14143 (opens in a new tab).
ORC Files and Object Metadata Queries
Listing connectors support file_format: orc. Object-store listing also uses predicates on metadata columns, including _last_modified, to narrow eligible objects. Queries that select only partition or metadata columns can use those values without reading file contents. See #14075 (opens in a new tab), #14265 (opens in a new tab), #14303 (opens in a new tab), and #14116 (opens in a new tab).
Hugging Face Datasets
The new Hugging Face data connector (opens in a new tab) queries and accelerates datasets from the Hugging Face Hub. It supports Parquet, CSV, TSV, JSON, and ORC files. Public datasets need no credentials:
datasets:
- from: hf://datasets/stanfordnlp/imdb/plain_text/
name: imdb
acceleration:
enabled: true
datasets:
- from: hf://datasets/stanfordnlp/imdb/plain_text/
name: imdb
acceleration:
enabled: true
The location format is hf://datasets/<owner>/<dataset>[@<revision>][/<path>]. A path can select a file, a folder, or a glob. A revision can name a branch, a tag, or a commit. Use @~parquet to select the Hub's automatic Parquet conversion.
Set hf_token for private or gated datasets. Set hf_endpoint for a Hub mirror or proxy. Each scan reads one commit. Refreshes follow the selected branch, but the dataset keeps its registered schema until reload. See #14877 (opens in a new tab).
Automatic Primary-Key Handling
Cayenne keeps one row per primary_key without requiring an on_conflict policy. When a dataset sets time_column, the row with the newest time wins; without it, the last arrival wins. This applies to full and append refreshes as well as writes. Existing explicit conflict policies remain accepted during the deprecation period.
datasets:
- from: s3://my-bucket/orders/
name: orders
time_column: updated_at
params:
file_format: parquet
acceleration:
enabled: true
engine: cayenne
mode: file
primary_key: id
datasets:
- from: s3://my-bucket/orders/
name: orders
time_column: updated_at
params:
file_format: parquet
acceleration:
enabled: true
engine: cayenne
mode: file
primary_key: id
For a read-write dataset whose writes should stay in its acceleration, set acceleration.write_mode: acceleration. Its source need not support writes. This mode cannot be combined with a dataset that refreshes by changes.
Cayenne secondary indexes also support dynamic join filters, and their write handling covers inserts, updates, deletes, and refreshes. See #14726 (opens in a new tab), #14282 (opens in a new tab), and #14593 (opens in a new tab).
PostgreSQL and MySQL replication, and MongoDB change streams, rejected Cayenne datasets that omitted on_conflict. Their validation still required an explicit upsert policy. These sources now accept Cayenne datasets with primary_key alone. See #14880 (opens in a new tab).
For file-mode Cayenne datasets, append refreshes failed with a configuration that combined primary_key, time_column, and retention_sql. The refresh selected a version-resolution path that did not support retention. The refresh now resolves each key's newest version before Cayenne applies retention. See #14878 (opens in a new tab).
Cayenne maintained aggregates now share one compact index of per-key contributions across views. Rebuilds capture concurrent writes and apply them after the scan. The aggregate budget uses 10% of a bounded query pool without the former 512 MiB cap. An unbounded pool retains the 512 MiB budget. See #14762 (opens in a new tab).
Read Datasets from Published Snapshots
Spice.ai Enterprise (opens in a new tab) feature. See the Enterprise documentation (opens in a new tab).
A dataset can now read published acceleration snapshots directly, without configuring the original source connector:
datasets:
- from: s3://my-bucket/spice/snapshots/orders/
name: orders
params:
file_format: snapshot
s3_region: us-east-1
datasets:
- from: s3://my-bucket/spice/snapshots/orders/
name: orders
params:
file_format: snapshot
s3_region: us-east-1
Spice reads the snapshot metadata to select the engine, restores the published data, and checks for newer snapshots. The dataset is read-only. Snapshot-mode readers can also use S3 notifications delivered through SQS, with periodic checks retained for missed notifications. Each reader process needs its own queue.
This release includes changes to snapshot retries, slow-connection bootstrap, publication metadata, and coordination between snapshot archiving and Cayenne maintenance. Cayenne datasets with a datalake tier cannot create acceleration snapshots. See snapshot documentation (opens in a new tab), #14529 (opens in a new tab), and #14335 (opens in a new tab).
Connector and Protocol Updates
- Connector status: ADBC, Databricks Spark Connect and SQL Warehouse, FlightSQL, Glue, HTTP/HTTPS, Iceberg, Localpod, and MongoDB are now Stable data connectors.
- MCP: support for specification version
2026-07-28, alongside the earlier protocol era. See #14043 (opens in a new tab).
- GitHub: nested GraphQL pagination and rate-limit pacing updates; the default concurrency limit is now four. See #14179 (opens in a new tab) and #14431 (opens in a new tab).
- GitHub nested pages: Scans could return incomplete reviews or comments because pagination accepted a short page as complete. The connector now rejects incomplete connections and repeated cursors. It retries a failed nested page without another fetch of the outer page. Datasets with the same token also share the REST quota. See #14862 (opens in a new tab).
- Iceberg REST: Clients could read an empty dataset because the catalog synthesized metadata without snapshots. The catalog now returns the source metadata for Iceberg datasets that Spice reads unchanged. Other datasets return
400 BadRequestException. Clients need their own storage credentials. See #14588 (opens in a new tab) and Breaking Changes (opens in a new tab).
Other Fixes
The release includes fixes in the following areas; the linked PRs provide details of the changes:
- Cayenne queries and writes: NULL-aware
NOT IN, maintained aggregates, dynamic filters, partition-filter forwarding, memory-mode DML and retention, and primary-key handling across CDC checkpoints. See #14429 (opens in a new tab), #14761 (opens in a new tab), #14370 (opens in a new tab), #14047 (opens in a new tab), and #14344 (opens in a new tab).
- Startup and reloads: retry datasets with unavailable sources, serve existing accelerations during source outages, and invalidate cached plans and results on catalog replacement or dataset unload. See #14623 (opens in a new tab), #14624 (opens in a new tab), #13914 (opens in a new tab), and #14365 (opens in a new tab).
- Federation: local evaluation of casts and functions whose source semantics differ, plus filter pushdown changes for DynamoDB, Cosmos DB, and MongoDB. See #14484 (opens in a new tab), #14601 (opens in a new tab), and #14419 (opens in a new tab).
- HTTP and GraphQL: response-status handling during refresh, retry-budget handling, non-JSON gateway responses, and URL redaction in HTTP errors. See #13538 (opens in a new tab), #14313 (opens in a new tab), #14781 (opens in a new tab), and #14490 (opens in a new tab).
- Search: deletion of obsolete Elasticsearch chunks, non-finite embedding handling, and source-scan coordination during full-text refresh. See #13960 (opens in a new tab), #13902 (opens in a new tab), and #14663 (opens in a new tab).
- Models and tools: tool-call-only assistant turns, required tool choices, streaming tool-use completion, model-load diagnostics, and propagation of the API-key principal into MCP tool calls. See #14232 (opens in a new tab), #14460 (opens in a new tab), #14548 (opens in a new tab), and #14828 (opens in a new tab).
- CDC shutdown and reconnects: source-position recording before accelerations close, and MySQL shared-stream reconnect handling. See #14702 (opens in a new tab) and #14751 (opens in a new tab).
- SQL weekdays:
date_part('dow') aligns with EXTRACT(dow), with Sunday represented as zero. See #14796 (opens in a new tab).
- Cayenne schema statistics: Decimal bounds could retain an old scale after schema evolution because maintenance published statistics from the previous schema. Cayenne now rejects statistics from an obsolete schema and keeps row counts conservative. See #14856 (opens in a new tab).
- Vector search:
vector_search planning failed after the DataFusion 55 upgrade because a second optimization pass tried to reorder a join with a dynamic filter. The planner now preserves that join's input order. See #14857 (opens in a new tab).
Default accelerator: Datasets and views that enable acceleration without engine now use Cayenne (opens in a new tab). Explicit engine settings keep their behavior. Storage still defaults to memory. Set mode: file for persistent acceleration. See Breaking Changes (opens in a new tab) for migration guidance.
Dependency Updates
| Dependency / Component | Version |
|---|
| DataFusion | v55.2.0 |
| Apache Arrow | v59.3.0 |
| Vortex | v0.86.1 |
| Apache Iceberg | v0.11.0 |
| Apache Ballista | v55.0.0 |
| Turso | v0.8.1 |
| ADBC | v0.24 |
| Rust toolchain | v1.98.1 |
Contributors
Breaking Changes
Cayenne is the default accelerator on supported platforms. A dataset or view that omits acceleration.engine switches from Arrow to Cayenne. To retain Arrow, set engine: arrow explicitly before upgrading. Windows keeps Arrow as its default. Persistent datasets should continue to name their engine and use mode: file.
on_conflict is deprecated and scheduled for removal in v3.0. Cayenne automatically keeps one row per primary key, choosing the newest time_column value when configured, or the last arrival otherwise. Existing explicit policies remain supported during the deprecation period. Review those policies before removing them, especially drop or policies that reject conflicting rows.
on_conflict no longer routes writes to the acceleration. For read-write datasets whose writes should stay in the acceleration, use:
acceleration:
enabled: true
engine: cayenne
write_mode: acceleration
acceleration:
enabled: true
engine: cayenne
write_mode: acceleration
This setting cannot be used with refresh_mode: changes, including a connector's default change-stream mode. The default write_through and write_back modes require a writable source.
Cache engine selection is retired. engine: moka and engine: pingora remain accepted but are ignored. Remove the field and use caching_policy to select eviction behavior.
GitHub connector default concurrency is four. Review explicit concurrency settings if your deployment relied on the previous default.
HTTP rate-control waits are bounded by default. Requests waiting for rate-control capacity now time out after the connector's client timeout. Set rate_control_acquire_timeout to a suitable duration, or 0 to retain the previous unbounded wait behavior.
Cayenne acceleration snapshots are unavailable for datalake-tier datasets. Review snapshot settings on datasets using cayenne_datalake_location; this release disables snapshotting that configuration.
Iceberg REST no longer synthesizes metadata for unsupported datasets. GET /v1/namespaces/{namespace}/tables/{table} returns 400 BadRequestException for accelerated datasets, views, and other datasets that Spice does not read unchanged from Iceberg. If a client used this endpoint for schema discovery, use SQL DESCRIBE or information_schema.columns instead. Query these datasets through /v1/sql or Arrow Flight SQL. For eligible Iceberg datasets, clients read the source metadata and need their own storage access. See the Get a table API (opens in a new tab).
Cookbook Updates
The Spice Cookbook (opens in a new tab) provides recipes to help you get started with Spice.
Upgrading
To upgrade to v2.4.0-rc.1 once the release artifacts are available, use one of the following methods:
CLI:
spice upgrade v2.4.0-rc.1
spice upgrade v2.4.0-rc.1
Docker:
Pull the spiceai/spiceai:2.4.0-rc.1 image:
docker pull spiceai/spiceai:2.4.0-rc.1
docker pull spiceai/spiceai:2.4.0-rc.1
For available tags, see DockerHub (opens in a new tab).
Helm:
helm repo update
helm upgrade spiceai spiceai/spiceai --version 2.4.0-rc.1
helm repo update
helm upgrade spiceai spiceai/spiceai --version 2.4.0-rc.1
AWS Marketplace:
Spice is available in the AWS Marketplace (opens in a new tab). Marketplace availability follows its published versions.
What's Changed
Changelog
- fix(runtime): discard cached logical plans when a hot reload replaces a catalog (fixes #13910) by @claudespice (opens in a new tab) in #13914 (opens in a new tab)
- fix(acceleration): let a schema repair correct a checkpoint without resetting the freshness clock (fixes #13817) by @claudespice (opens in a new tab) in #13894 (opens in a new tab)
- fix(search): filter a chunked Elasticsearch delete on a field that can match the key (fixes #13714) by @claudespice (opens in a new tab) in #13926 (opens in a new tab)
- fix(search): classify a partially non-finite embedding as unindexable on every backend (fixes #13872) by @claudespice (opens in a new tab) in #13902 (opens in a new tab)
- fix: stabilize GitHub tests and bound GraphQL registration (fixes #13762) by @lukekim (opens in a new tab) in #13939 (opens in a new tab)
- fix(postgres): decode versioned JSONB binary replication values by @phillipleblanc (opens in a new tab) in #13962 (opens in a new tab)
- docs: require a reviewed Enhancement before any user-facing surface changes by @lukekim (opens in a new tab) in #13970 (opens in a new tab)
- ci: upgrade spiceio setup action to v0.9.0 by @lukekim (opens in a new tab) in #13971 (opens in a new tab)
- fix(postgres): preserve microseconds in timestamp writeback by @phillipleblanc (opens in a new tab) in #13963 (opens in a new tab)
- feat(hash-index): verify the bloom filter's block index with Verus by @lukekim (opens in a new tab) in #13777 (opens in a new tab)
- build(deps-dev): bump js-yaml by @dependabot (opens in a new tab) in #13989 (opens in a new tab)
- docs: release notes for v2.3.0 by @bjchambers (opens in a new tab) in #13999 (opens in a new tab)
- fix(ci): drop the dangling substrait-compliance submodule pointer by @bjchambers (opens in a new tab) in #14002 (opens in a new tab)
- fix(cayenne): release the keyset bytes an abandoned PK checkout accounted (fixes #13668) by @grokspice (opens in a new tab) in #13925 (opens in a new tab)
- fix(caching): keep a declared key from disabling eviction and stranding stale rows (fixes #13976) by @bjchambers (opens in a new tab) in #13992 (opens in a new tab)
- Add Substrait compliance harness (IBM TPC-H Mode A + FlightSQL Mode B stub) by @lukekim (opens in a new tab) in #13879 (opens in a new tab)
- ci: skip DynamoDB TPC-H benches in OSS testoperator dispatch by @phillipleblanc (opens in a new tab) in #14016 (opens in a new tab)
- docs: update security support and roadmap after v2.3.0 by @phillipleblanc (opens in a new tab) in #14024 (opens in a new tab)
- chore: post v2.3.0 release housekeeping by @bjchambers (opens in a new tab) in #13969 (opens in a new tab)
- test(adbc): guard BigQuery corpus offline and in release gate by @phillipleblanc (opens in a new tab) in #14017 (opens in a new tab)
- fix(duckdb): deny the regexp built-ins DuckDB cannot answer faithfully (fixes #13809) by @claudespice (opens in a new tab) in #13871 (opens in a new tab)
- fix: Update tpch benchmark snapshots for federated/adbc[bigquery].yaml by @app/github-actions (opens in a new tab) in #13984 (opens in a new tab)
- fix(search): drop the chunks a shortened row no longer produces from a chunked index (refs #13717) by @claudespice (opens in a new tab) in #13960 (opens in a new tab)
- Reduce Cayenne allocations during primary-key validation and filtering by @lukekim (opens in a new tab) in #14009 (opens in a new tab)
- test(forks): guard seven fork patches that had no repo-side test by @krinart (opens in a new tab) in #13996 (opens in a new tab)
- fix(deps): bump arrow-rs to correctly-rounded Decimal→Float cast (closes #13978) by @Jeadie (opens in a new tab) in #14012 (opens in a new tab)
- perf(vortex): defer projection setup on filtered scans until the filter resolves by @bjchambers (opens in a new tab) in #14035 (opens in a new tab)
- endgame: include spiceai/skills versioned release by @lukekim (opens in a new tab) in #14031 (opens in a new tab)
- fix(caching): partition doomed entries at the survivor cutoff so eviction converges (closes #13994) by @Jeadie (opens in a new tab) in #14021 (opens in a new tab)
- fix(deps): bump arrow-rs fork pin for Decimal->Float rounding fix by @Jeadie (opens in a new tab) in #14049 (opens in a new tab)
- Fix subqueries with use_source acceleration by @phillipleblanc (opens in a new tab) in #14022 (opens in a new tab)
- fix(cayenne): make DELETE, UPDATE and INSERT work on a
mode: memory acceleration (fixes #12008) by @bjchambers (opens in a new tab) in #14047 (opens in a new tab)
- fix: clarify OpenDAL S3 retry warnings by @lukekim (opens in a new tab) in #14040 (opens in a new tab)
- test(s3): run the parquet-overwrite fixtures on RustFS by @bjchambers (opens in a new tab) in #14067 (opens in a new tab)
- feat(cayenne): materialize multi-reference CTEs on the query path by @lukekim (opens in a new tab) in #13918 (opens in a new tab)
- perf(vortex): answer a constant IN list by probing a set, and falsify it by interval by @bjchambers (opens in a new tab) in #14061 (opens in a new tab)
- perf(vortex): skip a scan split whose zones cannot satisfy the filter by @peasee (opens in a new tab) in #14064 (opens in a new tab)
- fix(arrow): report an exact row count from the indexed point-lookup scan by @krinart (opens in a new tab) in #13972 (opens in a new tab)
- fix(cayenne): apply
sort_columns with refresh_mode: full by @peasee (opens in a new tab) in #14063 (opens in a new tab)
- fix(smb): pad an empty CREATE buffer so Samba lists the share root (fixes #13293) by @grokspice (opens in a new tab) in #14050 (opens in a new tab)
- perf(cache): key the logical-plan cache on SQL text, not parameter values by @bjchambers (opens in a new tab) in #14069 (opens in a new tab)
- fix: harden HuggingFace E2E chat against slow Metal generation by @lukekim (opens in a new tab) in #14072 (opens in a new tab)
- fix(cayenne): move accelerator filesystem I/O off Tokio workers by @lukekim (opens in a new tab) in #14073 (opens in a new tab)
- test(chbench): enable CTE materialization and IVM on mysql/postgres adaptive HTAP by @lukekim (opens in a new tab) in #14070 (opens in a new tab)
- ci: run Substrait Mode A TPC-H on pull requests and the merge queue by @lukekim (opens in a new tab) in #14071 (opens in a new tab)
- feat(mcp): support MCP specification 2026-07-28 (dual-era) by @lukekim (opens in a new tab) in #14043 (opens in a new tab)
- fix(ci): call a linker that died of a signal an infrastructure failure, not a check failure (fixes #13614) by @grokspice (opens in a new tab) in #14044 (opens in a new tab)
- fix: Provide temporary directory in docker images by @Jeadie (opens in a new tab) in #14089 (opens in a new tab)
- fix: restore OSS installer, CLI and test workflow coverage by @phillipleblanc (opens in a new tab) in #14025 (opens in a new tab)
- Delete v2.2.0.md by @Jeadie (opens in a new tab) in #14095 (opens in a new tab)
- docs(release): add v2.3.1 release notes by @phillipleblanc (opens in a new tab) in #14094 (opens in a new tab)
- fix(test): allow DELETE in the CORS allow-methods assertion by @claudespice (opens in a new tab) in #14098 (opens in a new tab)
- fix(ci): stop install-protoc unzipping into a shared ~/.local by @lukekim (opens in a new tab) in #14097 (opens in a new tab)
- feat(connectors): add ORC listing format via in-repo FileFormat by @lukekim (opens in a new tab) in #14075 (opens in a new tab)
- fix(cayenne): run snapshot bootstrap check before opening the metastore by @Jeadie (opens in a new tab) in #14093 (opens in a new tab)
- feat(cache): verify the results-cache namespace prefix with Verus by @lukekim (opens in a new tab) in #14074 (opens in a new tab)
- feat(cloud-connect): add a GetDatasets command that answers the /v1/datasets document (refs #13369) by @grokspice (opens in a new tab) in #14051 (opens in a new tab)
- Suppress Cayenne startup logs when no Cayenne dataset is configured by @Jeadie (opens in a new tab) in #14042 (opens in a new tab)
- fix(cache): re-bind parameter values when revalidating a stale result (fixes #14099) by @bjchambers (opens in a new tab) in #14100 (opens in a new tab)
- fix(cluster): support distributed HTTP scans by @phillipleblanc (opens in a new tab) in #14108 (opens in a new tab)
- fix(bigquery): keep ILIKE evaluation local by @phillipleblanc (opens in a new tab) in #14110 (opens in a new tab)
- docs: update security support for v2.3.1 by @phillipleblanc (opens in a new tab) in #14117 (opens in a new tab)
- feat(cayenne): reuse ScanView until write, lag only for read-only CDC by @lukekim (opens in a new tab) in #14055 (opens in a new tab)
- fix(deps): remediate open Dependabot alerts by @phillipleblanc (opens in a new tab) in #14111 (opens in a new tab)
- fix(testoperator): validate results in every scale factor 1 TPC-H, TPC-DS and ClickBench benchmark by @lukekim (opens in a new tab) in #14119 (opens in a new tab)
- fix(cayenne): reject ambiguous metastore paths by @phillipleblanc (opens in a new tab) in #14130 (opens in a new tab)
- perf: serve results-cache hits where the request arrives and cut per-hit overhead by @lukekim (opens in a new tab) in #14103 (opens in a new tab)
- test(runtime): record query previews in the management export test by @lukekim (opens in a new tab) in #14155 (opens in a new tab)
- ci: upgrade spiceio setup action to v0.11.0 by @lukekim (opens in a new tab) in #14152 (opens in a new tab)
- feat(caching): Make
caching_stale_if_error RFC-5861 compliant (with stale-if-error header) by @Jeadie (opens in a new tab) in #14134 (opens in a new tab)
- perf(runtime-table): defer cache-eviction key extraction to entries a delete actually names by @Jeadie (opens in a new tab) in #14138 (opens in a new tab)
- fix(runtime): report the acceleration.ready_state deprecation once per component (fixes #13749) by @claudespice (opens in a new tab) in #14006 (opens in a new tab)
- fix(runtime): write the inferred Arrow sort order under the prefixed key its validation accepts (fixes #14023) by @claudespice (opens in a new tab) in #14032 (opens in a new tab)
- fix(connectors): Fix JSON/Orca files using metadata columns by @Jeadie (opens in a new tab) in #14115 (opens in a new tab)
- feat(cayenne): build secondary indexes from
indexes in file and memory mode by @phillipleblanc (opens in a new tab) in #14149 (opens in a new tab)
- fix(cayenne): round-trip decimal, binary, and time stats and drop them on scale change by @lukekim (opens in a new tab) in #14139 (opens in a new tab)
- feat(cayenne): cluster warm and datalake tiers, and write full refreshes as key-range files by @lukekim (opens in a new tab) in #14124 (opens in a new tab)
- fix(cayenne): compile the cold-tier pruning test and backtick a doc literal by @lukekim (opens in a new tab) in #14175 (opens in a new tab)
- fix(cayenne): make the crates own targets lint and compile by @phillipleblanc (opens in a new tab) in #14200 (opens in a new tab)
- test(forks): guard five more fork patches, and drop a row that is not fork state by @krinart (opens in a new tab) in #14015 (opens in a new tab)
- perf(cache): promote encoded SQL results to raw after the second decode by @lukekim (opens in a new tab) in #14199 (opens in a new tab)
- fix(turso): build a dictionary column directly so a dictionary over a list, map or boolean value reads back (fixes #13033) by @grokspice (opens in a new tab) in #14181 (opens in a new tab)
- fix(ci): probe the macOS toolchain before reaching for brew in the release builds by @grokspice (opens in a new tab) in #14203 (opens in a new tab)
- fix(ci): skip Metal kernel precompilation in the macOS release build by @grokspice (opens in a new tab) in #14204 (opens in a new tab)
- fix(github): paginate nested GraphQL connections and pace to GitHub's rate limits by @lukekim (opens in a new tab) in #14179 (opens in a new tab)
- fix(vortex): stop an IN list holding a NULL from panicking the scan by @krinart (opens in a new tab) in #14163 (opens in a new tab)
- bench(cayenne): use std::hint::black_box in the clustering bench by @lukekim (opens in a new tab) in #14129 (opens in a new tab)
- fix(runtime-table): stop rebuilding SessionContext on every cache fetch by @Jeadie (opens in a new tab) in #14141 (opens in a new tab)
- test(chbench): cluster order_line, oorder and customer on the adaptive HTAP arms by @lukekim (opens in a new tab) in #14192 (opens in a new tab)
- fix(runtime): count a first load as still loading in the Dataset load summary (fixes #13974) by @claudespice (opens in a new tab) in #14020 (opens in a new tab)
- fix(duckdb): push regexp_count down again at a rendering that counts as the kernel does (fixes #13870) by @claudespice (opens in a new tab) in #14153 (opens in a new tab)
- build: lint and test the sign-off under the same profile as the merge queue by @lukekim (opens in a new tab) in #14180 (opens in a new tab)
- ci: require the Verus proofs in the merge queue as one check by @lukekim (opens in a new tab) in #14189 (opens in a new tab)
- ci: run the longest macOS jobs on their own runner pool by @lukekim (opens in a new tab) in #14229 (opens in a new tab)
- fix(cayenne): build the DELETE sink inside the execution-time write lock (fixes #13828) by @claudespice (opens in a new tab) in #14218 (opens in a new tab)
- build(deps): bump the github-actions-dependencies group across 1 directory with 7 updates by @dependabot (opens in a new tab) in #14231 (opens in a new tab)
- fix(cluster): decide what a Flight message carries by its IPC header, not its body length (refs #13737) by @claudespice (opens in a new tab) in #14212 (opens in a new tab)
- ci: run Mode A TPC-H on merge queue and trunk/release push only by @lukekim (opens in a new tab) in #14247 (opens in a new tab)
- chore(deps): bump spiceai/duckdb-rs to 76655d2f by @lukekim (opens in a new tab) in #14246 (opens in a new tab)
- ci: stop exporting empty AWS and DuckLake endpoints to the schema test by @phillipleblanc (opens in a new tab) in #14194 (opens in a new tab)
- fix(runtime): reload a localpod dataset when the dataset it reads through is reloaded (fixes #3288) by @claudespice (opens in a new tab) in #14208 (opens in a new tab)
- build(deps): bump the aws-sdk group with 3 updates by @dependabot (opens in a new tab) in #14255 (opens in a new tab)
- fix(ci): resolve Homebrew prefix when brew is the spice flock wrapper by @lukekim (opens in a new tab) in #14210 (opens in a new tab)
- chore(deps): raise the datafusion-table-providers pin to include the NUMERIC result-column fix by @phillipleblanc (opens in a new tab) in #14254 (opens in a new tab)
- ci: align the DuckLake bootstrap with the embedded DuckDB, wait for Databricks startup, and stop dispatching legs that cannot pass by @phillipleblanc (opens in a new tab) in #14250 (opens in a new tab)
- fix(runtime): install the Spice function deny-list on the PostgreSQL catalog connector (refs #13664) by @claudespice (opens in a new tab) in #14225 (opens in a new tab)
- perf(cayenne): share inline-cache view entries by Arc instead of cloning them per scan by @krinart (opens in a new tab) in #14191 (opens in a new tab)
- build(deps): bump aws-actions/configure-aws-credentials by @dependabot (opens in a new tab) in #14256 (opens in a new tab)
- ci: stop dispatching the indexed turso TPC-H SF1 tests by @phillipleblanc (opens in a new tab) in #14252 (opens in a new tab)
- fix(catalog): keep the tables registered under an existing schema by @phillipleblanc (opens in a new tab) in #14193 (opens in a new tab)
- feat(cache): Spice sharded cache as the sole LruCache engine by @lukekim (opens in a new tab) in #14206 (opens in a new tab)
- ci: lint GitHub Actions definitions with actionlint, and fix the 73 findings it surfaced by @grokspice (opens in a new tab) in #14223 (opens in a new tab)
- perf(cache): tighten the Raw SQL results-cache serve path by @lukekim (opens in a new tab) in #14205 (opens in a new tab)
- ci: stop triggering the CUDA build on pull requests by @lukekim (opens in a new tab) in #14267 (opens in a new tab)
- ci: run CodeQL on pull requests and the merge queue by @lukekim (opens in a new tab) in #14269 (opens in a new tab)
- Release
2.3.2 release notes by @krinart (opens in a new tab) in #14271 (opens in a new tab)
- chore: make AGENTS.md the canonical agent instructions by @lukekim (opens in a new tab) in #14237 (opens in a new tab)
- ci: run CodeQL Analyze on spiceai-dev-runners by @lukekim (opens in a new tab) in #14281 (opens in a new tab)
- feat: TypeSafe Jev System One evaluation provider by @lukekim (opens in a new tab) in #14215 (opens in a new tab)
- fix(cayenne): tag file statistics bounds as the column's Arrow type (fixes #14280) by @phillipleblanc (opens in a new tab) in #14283 (opens in a new tab)
- ci: install spiceio when the runner has no gh (refs #14233) by @lukekim (opens in a new tab) in #14288 (opens in a new tab)
- test(forks): 11 repo guards by @krinart (opens in a new tab) in #14261 (opens in a new tab)
- docs: add Spice.ai in Action manuscript and companion labs by @lukekim (opens in a new tab) in #13965 (opens in a new tab)
- test(duckdb): add an integration test for the index CTE materialization by @sgrebnov (opens in a new tab) in #13885 (opens in a new tab)
- fix(cayenne): coalesce inline writes into one batch by @sgrebnov (opens in a new tab) in #14279 (opens in a new tab)
- release: Update SECURITY.md and endgame template after 2.3.2 by @peasee (opens in a new tab) in #14293 (opens in a new tab)
- fix(cayenne): count each Arrow allocation once in the inline-cache gauge by @krinart (opens in a new tab) in #14272 (opens in a new tab)
- feat(s3): SQS event-driven changes for refresh_mode: changes by @lukekim (opens in a new tab) in #14121 (opens in a new tab)
- feat(caching): single-flight coalesce concurrent cache-miss fetches by @Jeadie (opens in a new tab) in #14142 (opens in a new tab)
- fix(caching): make caching_stale_if_error detect transient HTTP failures on real schemas by @krinart (opens in a new tab) in #14161 (opens in a new tab)
- Use Cayenne secondary indexes for dynamic join filters by @phillipleblanc (opens in a new tab) in #14282 (opens in a new tab)
- fix(ci): compare DynamoDB sets without relying on element order by @bjchambers (opens in a new tab) in #14328 (opens in a new tab)
- docs(release): Remove QA analytics step from endgame by @peasee (opens in a new tab) in #14329 (opens in a new tab)
- ci: run CodeQL on the merge queue and trunk, not on pull requests by @lukekim (opens in a new tab) in #14290 (opens in a new tab)
- docs(cayenne): reposition the reference, add query serving, re-audit against trunk by @lukekim (opens in a new tab) in #14338 (opens in a new tab)
- docs(endgame): update versioned docs release steps by @ewgenius (opens in a new tab) in #14277 (opens in a new tab)
- test(forks): guard the ballista per-task file-scan restriction by @krinart (opens in a new tab) in #14292 (opens in a new tab)
- fix(cli): surface the full error chain for spice chat connection failures by @krinart (opens in a new tab) in #14289 (opens in a new tab)
- fix(ci): degrade the incomplete-sign-off handler when the runner has no gh (refs #14234) by @claudespice (opens in a new tab) in #14304 (opens in a new tab)
- fix(runtime-table): serialize a direct write against acceleration snapshot creation (fixes #13548) by @claudespice (opens in a new tab) in #14310 (opens in a new tab)
- fix(duckdb): screen regexp_like and regexp_replace as regexp_count is screened (fixes #14148) by @claudespice (opens in a new tab) in #14321 (opens in a new tab)
- fix(http): honor retry budget without an extra origin request by @phillipleblanc (opens in a new tab) in #14313 (opens in a new tab)
- Fix
SchemaCastScanExec's schema conversion in fn partition_statistics by @Jeadie (opens in a new tab) in #14258 (opens in a new tab)
- fix(cluster): recognise a Flight keepalive by its empty envelope, not by what its header declares (fixes #13737) by @claudespice (opens in a new tab) in #14327 (opens in a new tab)
- perf(http): defer zero-TTL acceleration lookup until origin failure by @phillipleblanc (opens in a new tab) in #14302 (opens in a new tab)
- fix(cayenne): keep a key visible when it is re-inserted over a stale-insert tombstone by @sgrebnov (opens in a new tab) in #14312 (opens in a new tab)
- perf(cayenne): read only key and filter columns in filtered key deletes by @sgrebnov (opens in a new tab) in #14374 (opens in a new tab)
- fix(cayenne): let small protected-snapshot merges run during a long large-tier merge by @sgrebnov (opens in a new tab) in #14296 (opens in a new tab)
- perf(cayenne): serve primary-key lookups on a freshly loaded table in ~1 ms by @lukekim (opens in a new tab) in #14314 (opens in a new tab)
- fix(cayenne): skip min/max statistics for nested columns (fixes #14368) by @sgrebnov (opens in a new tab) in #14392 (opens in a new tab)
- test(caching): cover SchemaCastScanExec statistics projection by name, retype, and SQL filter by @Jeadie (opens in a new tab) in #14146 (opens in a new tab)
- fix(turso): keep a quantified comparison out of Turso SQL (fixes #14041) by @grokspice (opens in a new tab) in #14393 (opens in a new tab)
- fix(udfs): declare the local_embed dev-dependency the embed tests need (fixes #13092) by @claudespice (opens in a new tab) in #14377 (opens in a new tab)
- perf(cayenne): batch metastore manifest rewrites, upsert in place, and run every write on one writer connection by @lukekim (opens in a new tab) in #14369 (opens in a new tab)
- fix(runtime-table): ignore zero-row batches in stale fallback by @phillipleblanc (opens in a new tab) in #14331 (opens in a new tab)
- Prune object-store file listing by
_last_modified predicates by @Jeadie (opens in a new tab) in #14265 (opens in a new tab)
- Reading only partition or metadata columns needlessly scans all file contents by @Jeadie (opens in a new tab) in #14116 (opens in a new tab)
- fix(duckdb): keep a concat over a binary operand out of the federated plan (fixes #13915) by @claudespice (opens in a new tab) in #14333 (opens in a new tab)
- fix(ci): keep the sign-off attribution inside GitHub's 140-character status cap (fixes #14076) by @grokspice (opens in a new tab) in #14390 (opens in a new tab)
- fix(ci): expose a present-but-unlinked cc tool on macOS runners instead of routing it through brew install (fixes #13479) by @grokspice (opens in a new tab) in #14387 (opens in a new tab)
- ci: re-measure integration.yml's job bounds after the archive consolidation (fixes #13429) by @grokspice (opens in a new tab) in #14388 (opens in a new tab)
- fix(ci): start DuckLake's local MinIO from an image that is still published by @grokspice (opens in a new tab) in #14399 (opens in a new tab)
- test(runtime-table): make the metric-scraping refresh tests pass under cargo test by @claudespice (opens in a new tab) in #14381 (opens in a new tab)
- fix(federation): keep a correlated subquery predicate above a join of two sources (refs #8220) by @claudespice (opens in a new tab) in #14372 (opens in a new tab)
- fix(caching): snapshot staleness before the origin fetch for stale_if_error by @Jeadie (opens in a new tab) in #14263 (opens in a new tab)
- perf(snapshots): skip unchanged snapshot metadata with a conditional GET by @sgrebnov (opens in a new tab) in #14409 (opens in a new tab)
- fix(search): prune the rest of a key group from an Elasticsearch chunked index (refs #13717) by @claudespice (opens in a new tab) in #14320 (opens in a new tab)
- fix(bench): derive MySQL's empty-field NULL handling from the column type (refs #13152) by @claudespice (opens in a new tab) in #14345 (opens in a new tab)
- fix(graphql): debit a LIMIT by the rows a page returned, not the declared page size (fixes #14308) by @claudespice (opens in a new tab) in #14353 (opens in a new tab)
- fix(ci): fit retention_oom's retry budget inside its workflow step, and guard the coupling (fixes #13512) by @grokspice (opens in a new tab) in #14389 (opens in a new tab)
- docs: say plainly what Spice is, refresh the README for v2.3, and promote connector statuses by @lukekim (opens in a new tab) in #14410 (opens in a new tab)
- fix(ci): pin, checksum and retry the oha download in the E2E graceful-shutdown jobs by @grokspice (opens in a new tab) in #14418 (opens in a new tab)
- fix(snapshots): resolve snapshot entries relative to the metadata location (#14425) by @sgrebnov (opens in a new tab) in #14426 (opens in a new tab)
- Lower the GitHub connector default concurrency limit to 4 by @lukekim (opens in a new tab) in #14431 (opens in a new tab)
- build(deps): bump nvidia/cuda in the docker-dependencies group by @dependabot (opens in a new tab) in #14439 (opens in a new tab)
- build(deps): bump the aws-sdk group with 3 updates by @dependabot (opens in a new tab) in #14440 (opens in a new tab)
- build(deps): bump the github-actions-dependencies group across 1 directory with 5 updates by @dependabot (opens in a new tab) in #14441 (opens in a new tab)
- test(cayenne): bound the refused-build guard by builds, not by the host's speed by @grokspice (opens in a new tab) in #14424 (opens in a new tab)
- fix(cache): don't report an invalidation cancelled by runtime shutdown as a failure by @grokspice (opens in a new tab) in #14417 (opens in a new tab)
- ci: run remote sign-off on the spiceai-macos pool by @lukekim (opens in a new tab) in #14449 (opens in a new tab)
- ci: run CodeQL Analyze on spiceai-macos by @lukekim (opens in a new tab) in #14442 (opens in a new tab)
- fix(runtime): keep the built-in date_part so both weekday spellings agree (fixes #13920) by @claudespice (opens in a new tab) in #14154 (opens in a new tab)
- fix(cayenne): include the in-memory CDC tier when an overwrite or a retention pass covers the whole table by @lukekim (opens in a new tab) in #14428 (opens in a new tab)
- fix: keep NOT IN null-aware through the join reorder and the Cayenne sort-merge rewrite by @lukekim (opens in a new tab) in #14429 (opens in a new tab)
- fix(cayenne): discard a compaction whose snapshot an overwrite replaced mid-pass by @lukekim (opens in a new tab) in #14432 (opens in a new tab)
- fix(cayenne): stop maintained views, Vortex IN lists and dynamic-filter sharing from returning wrong rows by @lukekim (opens in a new tab) in #14427 (opens in a new tab)
- fix(cayenne): hide spilled rows on CDC upsert fallback by @bjchambers (opens in a new tab) in #14416 (opens in a new tab)
- fix(ci): skip the integration, ADBC, chDB and E2E gate jobs on pull requests instead of passing them (fixes #13841) by @grokspice (opens in a new tab) in #14454 (opens in a new tab)
- fix(cayenne): judge a filtered key delete's captured sources by the index captured with them (refs #13913) by @claudespice (opens in a new tab) in #14455 (opens in a new tab)
- fix(ci): clear the macos-15 image's openssl@1.1 symlink before installing MySQL by @lukekim (opens in a new tab) in #14489 (opens in a new tab)
- ci: produce CodeQL SARIF in the Analyze job on spiceai-macos by @lukekim (opens in a new tab) in #14500 (opens in a new tab)
- fix(cayenne): correctness fixes for the goal-driven adaptive controller, with a closed-loop simulation harness by @lukekim (opens in a new tab) in #14443 (opens in a new tab)
- fix(cdc): keep the newest source commit timestamp on a coalesced change batch by @lukekim (opens in a new tab) in #14463 (opens in a new tab)
- fix(cayenne): draw a sequence for a current-snapshot append so per-key OCC can order it (fixes #13685) by @claudespice (opens in a new tab) in #14360 (opens in a new tab)
- fix(http): name a configured model's load failure instead of reporting it not found (fixes #13303) by @claudespice (opens in a new tab) in #14395 (opens in a new tab)
- fix(duckdb): keep inferred source indexes off change-stream accelerations so upserts commit under concurrent reads (refs #13929) by @claudespice (opens in a new tab) in #14396 (opens in a new tab)
- fix(duckdb): keep a text cast over a binary operand out of the federated plan (fixes #14355) by @claudespice (opens in a new tab) in #14448 (opens in a new tab)
- fix(llms): honor tool_choice required and allowed_tools on mistral.rs-hosted models instead of panicking (fixes #14230) by @claudespice (opens in a new tab) in #14460 (opens in a new tab)
- test(runtime): run the load-error counter test in its own process (fixes #13085) by @claudespice (opens in a new tab) in #14462 (opens in a new tab)
- fix(runtime): stop a replaced dataset configuration's load from registering over the new one (fixes #1458) by @claudespice (opens in a new tab) in #14367 (opens in a new tab)
- fix(install): stop asking for sudo on a first install into a fresh HOME (fixes #14445) by @claudespice (opens in a new tab) in #14495 (opens in a new tab)
- perf(cayenne): serve primary-key point lookups in half the time by @lukekim (opens in a new tab) in #14433 (opens in a new tab)
- fix(deps): bump DataFusion for upstream fixes to wrong results from filter pushdown, simplification and planning by @lukekim (opens in a new tab) in #14430 (opens in a new tab)
- fix(runtime): size every internal DataFusion session from the CPU budget by @bjchambers (opens in a new tab) in #14412 (opens in a new tab)
- fix(runtime): serve nested, zoned and half-float columns from the Iceberg catalog API (fixes #4815) by @claudespice (opens in a new tab) in #14480 (opens in a new tab)
- fix(acceleration): keep cached results when a snapshot refresh finds no newer snapshot by @sgrebnov (opens in a new tab) in #14497 (opens in a new tab)
- fix(runtime): sleep cron tests to the next boundary, not one that already fired (fixes #13759) by @claudespice (opens in a new tab) in #14474 (opens in a new tab)
- fix(ci): derive every lint-rust guard make runs, whatever its separator or recipe layout (fixes #13783) by @claudespice (opens in a new tab) in #14475 (opens in a new tab)
- fix(cayenne): stop the small-file compaction of a position-mode PK table from deadlocking on its own write lock (fixes #14420) by @claudespice (opens in a new tab) in #14481 (opens in a new tab)
- fix(runtime-table): report refresh bytes for the rows each batch holds by @Jeadie (opens in a new tab) in #14469 (opens in a new tab)
- fix(spark,databricks): keep Spice-only functions out of SQL sent to Spark Connect and Databricks SQL Warehouse (refs #13664) by @claudespice (opens in a new tab) in #14498 (opens in a new tab)
- fix(vortex): size a cached footer by what it retains, not its serialized bytes (fixes #12917) by @claudespice (opens in a new tab) in #14502 (opens in a new tab)
- fix(cayenne,telemetry): Register accelerated sink dataset immediately from existing acceleration by @peasee (opens in a new tab) in #13955 (opens in a new tab)
- Update spicepod.yml by @Jeadie (opens in a new tab) in #14533 (opens in a new tab)
- fix(cayenne): keep a rewrite's count inexact when it retains a late protected snapshot (fixes #14383) by @claudespice (opens in a new tab) in #14385 (opens in a new tab)
- fix: Update tpch benchmark snapshots for accelerated/on_zero_results/file[parquet]-cayenne[file]-on_zero_results.yaml by @app/github-actions (opens in a new tab) in #14408 (opens in a new tab)
- build(rust): upgrade toolchain to 1.98.1 by @lukekim (opens in a new tab) in #14560 (opens in a new tab)
- fix(postgres): release a shared slot's hold on a table its publication cannot drop (fixes #13032) by @claudespice (opens in a new tab) in #14527 (opens in a new tab)
- fix(cayenne): size the build side before sort-merging a non-Cayenne outer join by @krinart (opens in a new tab) in #14520 (opens in a new tab)
- Update DF Upgrade template by @krinart (opens in a new tab) in #14526 (opens in a new tab)
- fix(ci): wait for the refresh to invalidate the results cache, not a fixed 3s by @grokspice (opens in a new tab) in #14598 (opens in a new tab)
- fix(deps): move the DataFusion pin past the four unparser fixes, and guard each of them (fixes #13022) by @grokspice (opens in a new tab) in #14570 (opens in a new tab)
- fix(dynamodb, cosmosdb, mongodb): push filters down only where the source evaluates them as SQL does by @lukekim (opens in a new tab) in #14419 (opens in a new tab)
- feat(snapshots): serve a dataset from published snapshots with
from: s3://… and file_format: snapshot by @lukekim (opens in a new tab) in #14529 (opens in a new tab)
- perf(cayenne): keep the per-shard PK index across checkpoint flushes and back off futile bakes; fix q17 and two wrong-results races (fixes #14235) by @lukekim (opens in a new tab) in #14555 (opens in a new tab)
- test(chbench): lower the MySQL adaptive pods' CDC linger to 500 ms by @lukekim (opens in a new tab) in #14615 (opens in a new tab)
- fix(graphql): show the parse-failure bytes in JSON decode previews by @Jeadie (opens in a new tab) in #14530 (opens in a new tab)
- Defer source-first cache fallback planning by @phillipleblanc (opens in a new tab) in #14556 (opens in a new tab)
- perf(cayenne): order whole-table rewrites per scan partition, then merge by @bjchambers (opens in a new tab) in #14488 (opens in a new tab)
- fix(ci): tolerate the parquet-rename race's third DuckDB error in the E2E log scan by @grokspice (opens in a new tab) in #14541 (opens in a new tab)
- fix(graphql): retry an inferred credential refusal instead of failing the refresh by @Jeadie (opens in a new tab) in #14539 (opens in a new tab)
- fix(cayenne): serve a widened table's files from their persisted statistics (refs #13829) by @claudespice (opens in a new tab) in #14316 (opens in a new tab)
- fix(acceleration): checkpoint DuckDB's write-ahead log before a snapshot copies its file (fixes #13912) by @claudespice (opens in a new tab) in #14325 (opens in a new tab)
- fix(ci): let E2E cleanup run when the job failed before creating its working directory by @grokspice (opens in a new tab) in #14553 (opens in a new tab)
- Replace unmaintained
backoff with a workspace crate by @phillipleblanc (opens in a new tab) in #14621 (opens in a new tab)
- test: read Expect stand-ins with the installed shell by @phillipleblanc (opens in a new tab) in #14634 (opens in a new tab)
- fix(models): apply a tool_choice that forces a call to one round of the tool-use loop (fixes #14459) by @claudespice (opens in a new tab) in #14635 (opens in a new tab)
- fix(runtime): don't end a tool-use stream on a stale tool_calls finish (fixes #13309) by @claudespice (opens in a new tab) in #14548 (opens in a new tab)
- fix(smb): name listed locations under the share so directory datasets load (fixes #14060) by @claudespice (opens in a new tab) in #14549 (opens in a new tab)
- fix(models): name a configured model's load failure in ai() and streaming nsql (fixes #14394) by @claudespice (opens in a new tab) in #14632 (opens in a new tab)
- test(chbench): remove the mysql-cayenne[file]-adaptive-split HTAP arm by @sgrebnov (opens in a new tab) in #14620 (opens in a new tab)
- fix(cayenne): record sharded CDC keys in the table-wide PK index by @lukekim (opens in a new tab) in #14603 (opens in a new tab)
- fix(sqlite): keep TRY_CAST and every cast SQLite answers differently out of the federated plan (fixes #14398) by @claudespice (opens in a new tab) in #14496 (opens in a new tab)
- ci: move remaining Ubuntu 22.04 references to 24.04 by @lukekim (opens in a new tab) in #14677 (opens in a new tab)
- fix(snapshots): retry a failed snapshot attempt with backoff by @sgrebnov (opens in a new tab) in #14676 (opens in a new tab)
- fix(snapshots): large snapshots no longer fail bootstrap on slow connection by @sgrebnov (opens in a new tab) in #14571 (opens in a new tab)
- fix(refresh): start a refresh's source scan only when the sink reads it, so the full-text index keeps its rows (fixes #14619) by @claudespice (opens in a new tab) in #14663 (opens in a new tab)
- test(cayenne): compare suite answers cell by cell against SQLite and chDB by @lukekim (opens in a new tab) in #14473 (opens in a new tab)
- Evaluate any chat model via /v1/evaluate by @lukekim (opens in a new tab) in #14568 (opens in a new tab)
- ci: quarantine the management API integration schedule until its dev OAuth client is reactivated (refs #12376) by @grokspice (opens in a new tab) in #14684 (opens in a new tab)
- ci: stop scheduled Testoperator Ballista benchmarks by @phillipleblanc (opens in a new tab) in #14682 (opens in a new tab)
- fix(cayenne): stop snapshotting datasets with a datalake tier, whose restored copies deleted each other's files by @lukekim (opens in a new tab) in #14583 (opens in a new tab)
- fix(cayenne): count each Arrow allocation once for the mem-tier limit and checkpoint write sizing by @krinart (opens in a new tab) in #14675 (opens in a new tab)
- fix(ci): classify a sign-off that reached its step budget as signalled, so an expiry publishes no verdict (fixes #13843) by @grokspice (opens in a new tab) in #14685 (opens in a new tab)
- fix(runtime): retry a dataset whose source is unreachable at startup (fixes #14609) by @bjchambers (opens in a new tab) in #14623 (opens in a new tab)
- fix(cayenne): archive only the snapshot directories a dataset snapshot references (fixes #14605) by @sgrebnov (opens in a new tab) in #14627 (opens in a new tab)
- ci: route trunk-push macOS builds to the standard pool by @phillipleblanc (opens in a new tab) in #14645 (opens in a new tab)
- ci: install strip for the retention OOM regression test by @phillipleblanc (opens in a new tab) in #14701 (opens in a new tab)
- fix(smb): serve every share on a host from the one store registered for it (fixes #14550) by @grokspice (opens in a new tab) in #14689 (opens in a new tab)
- fix(runtime): discard cached plans and results when a dataset is unloaded (refs #14251) by @claudespice (opens in a new tab) in #14365 (opens in a new tab)
- feat(snapshots): reload snapshot-mode datasets from S3 event notifications (SQS) by @lukekim (opens in a new tab) in #14335 (opens in a new tab)
- fix(cayenne): report runs per size tier when protected-snapshot compaction declines (fixes #13622) by @claudespice (opens in a new tab) in #14476 (opens in a new tab)
- fix(cayenne): re-run a post-write compaction pass a concurrent append asked for (fixes #13906) by @claudespice (opens in a new tab) in #14479 (opens in a new tab)
- fix(http): keep the request URL out of HTTP connector errors (fixes #13534) by @claudespice (opens in a new tab) in #14490 (opens in a new tab)
- fix(runtime): load every localpod dataset that reads from one parent at startup (fixes #13087) by @claudespice (opens in a new tab) in #14532 (opens in a new tab)
- fix(build): share one cargo metadata helper across the lint guards, so a broken cargo is never a violation (fixes #13121) by @claudespice (opens in a new tab) in #14534 (opens in a new tab)
- fix(duckdb): push regexp_replace down again for a one-digit group reference, and refresh the Postgres ClickBench q35 plan (refs #13966) by @claudespice (opens in a new tab) in #14552 (opens in a new tab)
- fix(duckdb): keep a cast into binary out of the federated plan (refs #14397) by @claudespice (opens in a new tab) in #14633 (opens in a new tab)
- fix(runtime): keep finished async query jobs finished, and delete expired ones by @lukekim (opens in a new tab) in #14585 (opens in a new tab)
- fix(federation): keep DataFusion's cast built-ins out of every federated plan (fixes #14444) by @claudespice (opens in a new tab) in #14484 (opens in a new tab)
- test(cayenne): cover a swapped join filter through the sort-merge rewrite end to end (refs #14235) by @claudespice (opens in a new tab) in #14551 (opens in a new tab)
- fix(runtime): decide every Spark/built-in function collision by name, and refuse an undecided one (fixes #14361) by @grokspice (opens in a new tab) in #14400 (opens in a new tab)
- fix(ci): run every bin target's unit tests in the sign-off gate, and give spice connect its own --cloud-region refusal (fixes #13426) by @grokspice (opens in a new tab) in #14406 (opens in a new tab)
- test(data_components): compile the federation unparser guards in every scoped test run (fixes #13625) by @grokspice (opens in a new tab) in #14447 (opens in a new tab)
- fix(runtime-component): skip an inferred Cayenne index on a floating-point column instead of failing the load (fixes #14590) by @grokspice (opens in a new tab) in #14599 (opens in a new tab)
- fix(cache): serve stale cached results during frequent table updates (stale_while_revalidate_ttl) by @sgrebnov (opens in a new tab) in #14708 (opens in a new tab)
- Update Turso to 0.8.1 and retry write conflicts a metastore statement raises by @lukekim (opens in a new tab) in #14680 (opens in a new tab)
- fix(snapshots): stop a snapshot dataset's load when a reload replaces it by @lukekim (opens in a new tab) in #14673 (opens in a new tab)
- fix(cayenne): hand non-partition filters to every partition scan (fixes #12959) by @claudespice (opens in a new tab) in #14370 (opens in a new tab)
- fix(postgres-accel): resolve secret references in the sidecar connection parameters (fixes #13296) by @claudespice (opens in a new tab) in #14544 (opens in a new tab)
- fix(cayenne): drain the in-memory CDC tier before a full rewrite scans it (fixes #14450) by @claudespice (opens in a new tab) in #14486 (opens in a new tab)
- feat(caching): warm SQL results cache on first refresh from persisted plan shapes by @lukekim (opens in a new tab) in #14178 (opens in a new tab)
- fix(ci): retry only the container startup in the zero-retry MySQL CDC tests by @grokspice (opens in a new tab) in #14727 (opens in a new tab)
- feat(key-index): immutable secondary index runs over compound Arrow keys by @bjchambers (opens in a new tab) in #14592 (opens in a new tab)
- fix(federation): keep a fractional-to-integer cast out of the plans pushed to DuckDB, PostgreSQL, MySQL and BigQuery (fixes #14482) by @grokspice (opens in a new tab) in #14601 (opens in a new tab)
- fix(testoperator): give accelerated bench configs a 300s ready_wait and name unready datasets on timeout (fixes #13973) by @claudespice (opens in a new tab) in #14728 (opens in a new tab)
- fix(federation): keep arrow_typeof and its plan-introspection siblings local on every backend (fixes #14334) by @grokspice (opens in a new tab) in #14695 (opens in a new tab)
- test(bench): refresh the tpch_q16 explain snapshots for the null-aware NOT IN plan (fixes #13977) by @claudespice (opens in a new tab) in #14731 (opens in a new tab)
- ci: build trunk-push macOS legs on spiceai-macos-large again, keeping one-at-a-time coalescing by @grokspice (opens in a new tab) in #14735 (opens in a new tab)
- ci(verus): derive the verified crates from cargo metadata; pin vstd once by @bjchambers (opens in a new tab) in #14709 (opens in a new tab)
- docs: raise the test and evidence bar: differential first, exact assertions, performance always measured by @lukekim (opens in a new tab) in #14723 (opens in a new tab)
- test(vortex): wait for a dropped segment cache to be freed before asserting it is gone (fixes #13295) by @claudespice (opens in a new tab) in #14470 (opens in a new tab)
- ci(integration): report each integration part's own result in its required check by @grokspice (opens in a new tab) in #14743 (opens in a new tab)
- fix(cayenne): back off futile bakes under a violated query goal too by @lukekim (opens in a new tab) in #14736 (opens in a new tab)
- feat(object_store_occ): add transactional WAL and MVCC snapshots by @lukekim (opens in a new tab) in #14732 (opens in a new tab)
- fix(snapshots): bootstrap readers from late snapshot publications by @phillipleblanc (opens in a new tab) in #14468 (opens in a new tab)
- fix(cayenne): apply retention_sql to a
mode: memory acceleration (fixes #14045) by @claudespice (opens in a new tab) in #14344 (opens in a new tab)
- fix(duckdb, sqlite): keep the first copy of a key a write repeats under on_conflict: drop (fixes #14629) by @claudespice (opens in a new tab) in #14748 (opens in a new tab)
- fix(cache): release a removed dataset's memory when the plan cache discards its plans (fixes #14251) by @claudespice (opens in a new tab) in #14760 (opens in a new tab)
- build(deps): bump the aws-sdk group with 2 updates by @dependabot (opens in a new tab) in #14764 (opens in a new tab)
- fix(llms): explain an Anthropic model's refusal of a sampling control instead of passing the bare 400 through (fixes #13564) by @grokspice (opens in a new tab) in #14700 (opens in a new tab)
- build(deps-dev): bump dompurify by @dependabot (opens in a new tab) in #14613 (opens in a new tab)
- fix(snapshots): allow cayenne_file_path and cayenne_metadata_dir on file_format: snapshot datasets (fixes #14696) by @sgrebnov (opens in a new tab) in #14698 (opens in a new tab)
- test(snapshots): make snapshot integration tests robust under parallel CI runs by @sgrebnov (opens in a new tab) in #14765 (opens in a new tab)
- feat(cayenne): keep the secondary index current across every write by @bjchambers (opens in a new tab) in #14593 (opens in a new tab)
- fix: Update tpch benchmark snapshots for accelerated/file[parquet]-duckdb[memory].yaml by @app/github-actions (opens in a new tab) in #14674 (opens in a new tab)
- Isolate Docker integration fixtures across concurrent processes by @phillipleblanc (opens in a new tab) in #14639 (opens in a new tab)
- ci: run Substrait Mode A TPC-H at SF 1 on spiceai-macos in every merge-queue entry by @lukekim (opens in a new tab) in #14522 (opens in a new tab)
- ci: stop repeating scheduled benchmarks: one source per accelerator, hosted sources weekly, a release commit once by @lukekim (opens in a new tab) in #14681 (opens in a new tab)
- build(deps): bump nvidia/cuda by @dependabot (opens in a new tab) in #14763 (opens in a new tab)
- fix(http): stop a non-2xx response body replacing an accelerated table's rows (fixes #13515) by @claudespice (opens in a new tab) in #13538 (opens in a new tab)
- fix(chat-api): answer a tool-call-only assistant turn instead of panicking (fixes #13207) by @grokspice (opens in a new tab) in #14232 (opens in a new tab)
- fix(sqlite, duckdb): keep a decimal AVG, and on SQLite a decimal SUM, out of the federated plan (fixes #14492) by @claudespice (opens in a new tab) in #14670 (opens in a new tab)
- fix(spiceai, duckdb, sharepoint): name the Spicepod key a missing-parameter error asks for (refs #14446) by @claudespice (opens in a new tab) in #14769 (opens in a new tab)
- Add table-bound ChangeSink ownership and backends by @phillipleblanc (opens in a new tab) in #14704 (opens in a new tab)
- fix(ci): serialize rustup installs on shared macOS runners by @lukekim (opens in a new tab) in #14717 (opens in a new tab)
- fix(cayenne): keep the per-shard PK index when the table-wide index is discarded by @lukekim (opens in a new tab) in #14604 (opens in a new tab)
- Upgrade to DataFusion 55.1 and Arrow 59.3 by @krinart (opens in a new tab) in #14612 (opens in a new tab)
- Update openapi.json by @app/github-actions (opens in a new tab) in #14742 (opens in a new tab)
- build(deps): bump rustls from 0.23.40 to 0.23.45 by @dependabot (opens in a new tab) in #14773 (opens in a new tab)
- Upgrade to iceberg-rust to 0.11.0 and DF 55.2 by @sgrebnov (opens in a new tab) in #14771 (opens in a new tab)
- fix(cayenne): write an append into an empty unkeyed table as one load by @phillipleblanc (opens in a new tab) in #14784 (opens in a new tab)
- fix(mysql_replication): don't re-send a live member's delivered commits after a reconnect by @lukekim (opens in a new tab) in #14751 (opens in a new tab)
- ci(codeql): don't fail the SARIF upload when the merge queue already deleted its ref by @grokspice (opens in a new tab) in #14793 (opens in a new tab)
- fix(acceleration): accept time_format iso8601 when the time_column is already a timestamp by @lukekim (opens in a new tab) in #14777 (opens in a new tab)
- fix(cache): store SQL results that go stale mid-query by @lukekim (opens in a new tab) in #14710 (opens in a new tab)
- fix(cayenne): serve filtered and global maintained aggregates by @lukekim (opens in a new tab) in #14761 (opens in a new tab)
- perf(cayenne): build the checkpoint's tombstone union after releasing the capture locks by @lukekim (opens in a new tab) in #14759 (opens in a new tab)
- ci: keep no artifacts or caches from PR and merge-queue checks, and run gating macOS jobs on spiceai-macos-large by @lukekim (opens in a new tab) in #14804 (opens in a new tab)
- fix(cayenne): keep maintenance from deleting files a snapshot is archiving by @sgrebnov (opens in a new tab) in #14789 (opens in a new tab)
- fix(snapshots): never overwrite shared snapshot metadata, and publish more than once to a file:// location by @lukekim (opens in a new tab) in #14582 (opens in a new tab)
- perf(cdc): build deferred change rows in the reader while the apply runs by @lukekim (opens in a new tab) in #14746 (opens in a new tab)
- fix: Update tpch benchmark snapshots for accelerated/on_zero_results/file[parquet]-cayenne[file]-on_zero_results.yaml by @app/github-actions (opens in a new tab) in #14786 (opens in a new tab)
- test(testoperator): add a cold-start time-to-ready regression test by @phillipleblanc (opens in a new tab) in #14785 (opens in a new tab)
- test(testoperator): make append tests more robust by @sgrebnov (opens in a new tab) in #14817 (opens in a new tab)
- fix(runtime,data_components): wait for change-data-capture sources to record their positions before shutdown closes the accelerations (fixes #14523) by @grokspice (opens in a new tab) in #14702 (opens in a new tab)
- fix(graphql): detect non-JSON responses and treat gateway errors as retryable by @lukekim (opens in a new tab) in #14781 (opens in a new tab)
- fix(runtime): require keys for s3_auth: key, honor gs:// state location params, and leave newer rate-control state alone by @lukekim (opens in a new tab) in #14584 (opens in a new tab)
- build(deps): bump hickory-resolver from 0.26.1 to 0.26.2 by @dependabot (opens in a new tab) in #14774 (opens in a new tab)
- fix(listing): skip zero-byte objects (S3 folder markers) in format-selected listings by @sgrebnov (opens in a new tab) in #14822 (opens in a new tab)
- Avoid unnecessary repartitioning in indexed dynamic-filter joins by @bjchambers (opens in a new tab) in #14799 (opens in a new tab)
- feat(cayenne): keep one row per primary key automatically and deprecate on_conflict by @bjchambers (opens in a new tab) in #14726 (opens in a new tab)
- fix(object-store): stop reading a response body at its first error by @phillipleblanc (opens in a new tab) in #14831 (opens in a new tab)
- fix(ci): use byte-order collation in the benchmark Postgres container (refs #14815) by @sgrebnov (opens in a new tab) in #14836 (opens in a new tab)
- fix(listing): keep a partition predicate as a residual filter on the
_location fast path by @grokspice (opens in a new tab) in #14790 (opens in a new tab)
- fix(ci): search only the unixodbc keg, not all of Homebrew's lib, in the macOS release builds by @grokspice (opens in a new tab) in #14846 (opens in a new tab)
- fix(federation): keep date, timestamp and interval values local on SQLite reached through ADBC or ODBC (fixes #14753) by @claudespice (opens in a new tab) in #14840 (opens in a new tab)
- chore: pin the fork at spiceai/datafusion#249 and guard the DataFusion fixes backported from 54 by @krinart (opens in a new tab) in #14800 (opens in a new tab)
- Revert "fix(sqlite, duckdb): keep a decimal AVG, and on SQLite a decimal SUM, out of the federated plan (fixes #14492) (#14670)" by @krinart (opens in a new tab) in #14825 (opens in a new tab)
- perf(runtime): skip EnsureRequirements while planning a point lookup by @lukekim (opens in a new tab) in #14807 (opens in a new tab)
- fix(testoperator): report CH-benCH queries with no rows on either side as vacuous, not as matches by @lukekim (opens in a new tab) in #14810 (opens in a new tab)
- feat(acceleration): make Cayenne the default acceleration engine by @phillipleblanc (opens in a new tab) in #14837 (opens in a new tab)
- fix(cayenne): keep a join's LIMIT when the oversized-join rewrite makes it a sort-merge join by @lukekim (opens in a new tab) in #14805 (opens in a new tab)
- test(bigquery): exclude subtrees an empty join build side never runs from the corpus job count (fixes #14848) by @sgrebnov (opens in a new tab) in #14849 (opens in a new tab)
- fix(cayenne): fail contradictory write settings once, and order NULL times below every time by @bjchambers (opens in a new tab) in #14847 (opens in a new tab)
- fix(runtime): serve an existing acceleration while its source is unavailable (fixes #14610) by @bjchambers (opens in a new tab) in #14624 (opens in a new tab)
- Prune object-store file listing by metadata columns (#14264) by @Jeadie (opens in a new tab) in #14303 (opens in a new tab)
- fix(vortex): fold partition values into the file-pruning predicate; test null-equal joins under mode:file by @lukekim (opens in a new tab) in #14797 (opens in a new tab)
- feat(rate-control): adaptive, bounded and cluster-coordinated HTTP rate controls by @Jeadie (opens in a new tab) in #14143 (opens in a new tab)
- fix(sql): align date_part('dow') with EXTRACT(dow) Sunday=0 by @lukekim (opens in a new tab) in #14796 (opens in a new tab)
- fix(runtime): carry API-key principal into MCP tools/call by @lukekim (opens in a new tab) in #14828 (opens in a new tab)
- perf(cayenne): hold maintained-aggregate retraction state in a compact shared index by @lukekim (opens in a new tab) in #14762 (opens in a new tab)
- fix(deps): keep a hash join's order once it has a dynamic filter, so
vector_search plans again by @Jeadie (opens in a new tab) in #14857 (opens in a new tab)
- fix(cayenne): fence schema statistics and control maintenance tests by @bjchambers (opens in a new tab) in #14856 (opens in a new tab)
- fix(github): retry nested GraphQL pages in place and fail incomplete nested connections by @sgrebnov (opens in a new tab) in #14862 (opens in a new tab)
- fix(cayenne): load an append dataset that has retention_sql and orders versions by time by @phillipleblanc (opens in a new tab) in #14878 (opens in a new tab)
- fix(cdc): Cayenne replication needs only a primary key, not on_conflict by @phillipleblanc (opens in a new tab) in #14880 (opens in a new tab)
- feat(connector-huggingface): Hugging Face datasets data connector (
hf://datasets/...) by @lukekim (opens in a new tab) in #14877 (opens in a new tab)
- fix(iceberg): Iceberg REST clients read the real table or get an error, never an empty one by @lukekim (opens in a new tab) in #14588 (opens in a new tab)
Full Changelog: https://github.com/spiceai/spiceai/compare/v2.3.2...v2.4.0-rc.1 (opens in a new tab)