|
| 1 | +--- |
| 2 | +date: 2026-03-12 |
| 3 | +title: 'Spice v1.11.4 (Mar 12, 2026)' |
| 4 | +type: blog |
| 5 | +authors: [sgrebnov] |
| 6 | +tags: [release, s3, data-connector, acceleration] |
| 7 | + |
| 8 | +--- |
| 9 | +Announcing the release of Spice v1.11.4! ⚡ |
| 10 | + |
| 11 | +Spice v1.11.4 is a patch release improving **S3** metadata column query robustness and enabling **`on_zero_results: use_source`** for accelerated views. |
| 12 | + |
| 13 | +## What's New in v1.11.4 |
| 14 | + |
| 15 | +### Accelerated Views: `on_zero_results: use_source` Support |
| 16 | + |
| 17 | +Accelerated [views](https://spiceai.org/docs/components/views) now support the [`on_zero_results: use_source`](https://spiceai.org/docs/features/data-acceleration/data-refresh#behavior-on-zero-results) configuration ([#9699](https://github.com/spiceai/spiceai/pull/9699)). Previously, accelerated views only supported `on_zero_results: return_empty`, which returned an empty result set when the accelerated data contained no matching rows. With this change, views can fall back to querying the source data when the accelerated query returns zero results, matching the behavior already available for accelerated datasets. |
| 18 | + |
| 19 | +**Example configuration:** |
| 20 | + |
| 21 | +```yaml |
| 22 | +views: |
| 23 | + - name: sales_summary |
| 24 | + sql: | |
| 25 | + SELECT region, SUM(amount) as total |
| 26 | + FROM sales |
| 27 | + GROUP BY region |
| 28 | + acceleration: |
| 29 | + enabled: true |
| 30 | + on_zero_results: use_source |
| 31 | +``` |
| 32 | +
|
| 33 | +#### How the Fallback Works |
| 34 | +
|
| 35 | +When an accelerated view is configured with `on_zero_results: use_source`, the following happens at query time: |
| 36 | + |
| 37 | +1. **The accelerated store is queried first.** The query runs against the view's accelerated data (e.g., Spice Cayenne, Arrow, DuckDB, or SQLite). |
| 38 | + |
| 39 | +2. **If the accelerated query returns zero rows**, the runtime falls back to re-executing the view's SQL query against the datasets it references. |
| 40 | + |
| 41 | +3. **Referenced datasets are queried according to their own configuration.** The view's SQL is re-executed against each referenced dataset as it is configured. This means: |
| 42 | + |
| 43 | + - If a referenced dataset is **accelerated**, the query hits that dataset's accelerated store — not the raw data source. |
| 44 | + - If a referenced dataset is **accelerated with `on_zero_results: use_source`** and its accelerated store also returns zero rows, it will independently fall back to its own federated data source (e.g., Postgres, S3, etc.). |
| 45 | + - If a referenced dataset is **federated** (not accelerated), the query goes directly to the data source. |
| 46 | + |
| 47 | +This means the fallback can chain through multiple layers: first the view's acceleration, then each referenced dataset's acceleration, and finally the original data source — each layer independently applying its own `on_zero_results` behavior. |
| 48 | + |
| 49 | +**Example: Multi-layer fallback** |
| 50 | + |
| 51 | +```yaml |
| 52 | +datasets: |
| 53 | + - from: postgres:orders |
| 54 | + name: orders |
| 55 | + acceleration: |
| 56 | + enabled: true |
| 57 | + refresh_sql: "SELECT * FROM orders WHERE created_at > now() - interval '7 days'" |
| 58 | + on_zero_results: use_source # Falls back to Postgres if accelerated data has no matches |
| 59 | +
|
| 60 | +views: |
| 61 | + - name: recent_orders_summary |
| 62 | + sql: | |
| 63 | + SELECT status, COUNT(*) as order_count |
| 64 | + FROM orders |
| 65 | + GROUP BY status |
| 66 | + acceleration: |
| 67 | + enabled: true |
| 68 | + on_zero_results: use_source # Falls back to re-running the SQL against referenced datasets |
| 69 | +``` |
| 70 | + |
| 71 | +In this example, a query like `SELECT * FROM recent_orders_summary WHERE status = 'cancelled'` follows this path: |
| 72 | + |
| 73 | +1. Queries `recent_orders_summary` in the view's accelerated store (DuckDB/SQLite). |
| 74 | +2. If zero rows are returned, re-executes `SELECT status, COUNT(*) ... FROM orders GROUP BY status` against the `orders` dataset. |
| 75 | +3. Since `orders` is accelerated, the query hits the `orders` accelerated store. |
| 76 | +4. If `orders` also returns zero rows (e.g., the `refresh_sql` excluded cancelled orders), it falls back to querying Postgres directly. |
| 77 | + |
| 78 | +```mermaid |
| 79 | +flowchart TD |
| 80 | + Q["Query: SELECT * FROM recent_orders_summary<br>WHERE status = 'cancelled'"] |
| 81 | + Q --> VA["View Accelerated Store<br>(Spice Cayenne/Arrow/DuckDB/SQLite)"] |
| 82 | + VA -->|rows > 0| R1["Return Results"] |
| 83 | + VA -->|zero rows| VS["Fallback: Re-execute View SQL<br>against referenced datasets"] |
| 84 | + VS --> DA["orders — Accelerated Store<br>(DuckDB/SQLite)"] |
| 85 | + DA -->|rows > 0| R2["Return Results"] |
| 86 | + DA -->|zero rows +<br>on_zero_results: use_source| FS["Fallback: Query Federated Source<br>(Postgres)"] |
| 87 | + FS --> R3["Return Results"] |
| 88 | +
|
| 89 | + style Q fill:#4a90d9,color:#fff |
| 90 | + style R1 fill:#2ecc71,color:#fff |
| 91 | + style R2 fill:#2ecc71,color:#fff |
| 92 | + style R3 fill:#2ecc71,color:#fff |
| 93 | + style VA fill:#f39c12,color:#fff |
| 94 | + style DA fill:#f39c12,color:#fff |
| 95 | + style FS fill:#e74c3c,color:#fff |
| 96 | + style VS fill:#9b59b6,color:#fff |
| 97 | +``` |
| 98 | + |
| 99 | +### S3 Data Connector: More Robust Metadata Column Handling |
| 100 | + |
| 101 | +Improved the robustness of [metadata column](https://spiceai.org/docs/components/data-connectors/#metadata-columns) (`location`, `last_modified`, `size`) handling for [S3](https://spiceai.org/docs/components/data-connectors/s3) datasets. Building on the v1.11.3 release, this update addresses an additional edge case where the query optimizer's projection swap could cause an `index out of bounds` panic when metadata columns are referenced in projections with filters or scalar functions. |
| 102 | + |
| 103 | +## Contributors |
| 104 | + |
| 105 | +- [@sgrebnov](https://github.com/sgrebnov) |
| 106 | +- [@krinart](https://github.com/krinart) |
| 107 | + |
| 108 | +## Breaking Changes |
| 109 | + |
| 110 | +No breaking changes. |
| 111 | + |
| 112 | +## Cookbook Updates |
| 113 | + |
| 114 | +No new cookbook recipes. |
| 115 | + |
| 116 | +The [Spice Cookbook](https://spiceai.org/cookbook) includes 86 recipes to help you get started with Spice quickly and easily. |
| 117 | + |
| 118 | +## Upgrading |
| 119 | + |
| 120 | +To upgrade to v1.11.4, use one of the following methods: |
| 121 | + |
| 122 | +**CLI**: |
| 123 | + |
| 124 | +```console |
| 125 | +spice upgrade |
| 126 | +``` |
| 127 | + |
| 128 | +**Homebrew**: |
| 129 | + |
| 130 | +```console |
| 131 | +brew upgrade spiceai/spiceai/spice |
| 132 | +``` |
| 133 | + |
| 134 | +**Docker**: |
| 135 | + |
| 136 | +Pull the `spiceai/spiceai:1.11.4` image: |
| 137 | + |
| 138 | +```console |
| 139 | +docker pull spiceai/spiceai:1.11.4 |
| 140 | +``` |
| 141 | + |
| 142 | +For available tags, see [DockerHub](https://hub.docker.com/r/spiceai/spiceai/tags). |
| 143 | + |
| 144 | +**Helm**: |
| 145 | + |
| 146 | +```console |
| 147 | +helm repo update |
| 148 | +helm upgrade spiceai spiceai/spiceai --version 1.11.4 |
| 149 | +``` |
| 150 | + |
| 151 | +**AWS Marketplace**: |
| 152 | + |
| 153 | +Spice is available in the [AWS Marketplace](https://aws.amazon.com/marketplace/pp/prodview-jmf6jskjvnq7i). |
| 154 | + |
| 155 | +## What's Changed |
| 156 | + |
| 157 | +### Changelog |
| 158 | + |
| 159 | +- fix(s3): Make metadata column handling more robust by [@sgrebnov](https://github.com/sgrebnov) in [#9714](https://github.com/spiceai/spiceai/pull/9714) |
| 160 | +- feat(views): Enable `on_zero_results: use_source` for accelerated views by [@krinart](https://github.com/krinart) in [#9699](https://github.com/spiceai/spiceai/pull/9699) |
| 161 | + |
| 162 | +**Full Changelog**: [https://github.com/spiceai/spiceai/compare/v1.11.3...v1.11.4](https://github.com/spiceai/spiceai/compare/v1.11.3...v1.11.4) |
0 commit comments