Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
42 changes: 42 additions & 0 deletions doc/user/content/releases/_index.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,48 @@ Starting with the v26.1.0 release, Materialize releases on a weekly schedule for
both Cloud and Self-Managed. See [Release schedule](/releases/schedule) for details.
{{</ note >}}

## v26.47.0
*Released to Materialize Cloud: 2026-10-22* <br>
*Released to Materialize Self-Managed: 2026-10-23* <br>

### TRY_CAST {#v26.47-try-cast}
`TRY_CAST(<expr> AS <type>)` evaluates an expression once and attempts to cast it to the target type, producing `NULL` instead of an error when the value cannot be converted, and a failure anywhere inside a nested value yields `NULL` for the whole cast. Bad values in an ingest pipeline can therefore be turned into `NULL` in place rather than failing the statement. Casts between a few Materialize-internal types, such as `regclass` and `mz_aclitem`, are not supported.

### Safely drop upstream `NOT NULL` constraints in your Postgres sources {#v26.47-exclude-not-null-constraints}
Materialize now allows you to `EXCLUDE ALL NOT NULL CONSTRAINTS` when creating a table from a Postgres source. Every column is ingested as nullable, so you can drop `NOT NULL` constraints upstream without causing your table to error. `PRIMARY KEY` and `UNIQUE` constraints are still recorded, and primary key columns remain `NOT NULL`.

```mzsql
CREATE TABLE orders
FROM SOURCE pg_source (REFERENCE public.orders)
WITH (EXCLUDE ALL NOT NULL CONSTRAINTS);
```

For more details, see [`CREATE TABLE ... FROM SOURCE`](/sql/create-table/postgres/) for PostgreSQL and the guide on [handling upstream constraint drops](/ingest-data/postgres/source-versioning/#handle-upstream-constraint-drop).

### Improvements {#v26.47-improvements}
- **Zero-downtime upgrades wait less before promoting**: A rollout no longer imposes a full stability wait on a replica created during that rollout — the wait is capped at how old the replica was when it hydrated on the incoming generation — and no longer waits on collections or replicas that the deployment being replaced has not hydrated either.
- **Lower connection balancer memory per connection**: An idle TLS connection through the connection balancer now holds 44.0 KB of heap instead of 68.3 KB (20.5 KB instead of 44.7 KB without TLS), because the buffers and authentication state needed only during startup are released once the connection is proxied, so a self-managed deployment running the 256 MiB default is no longer killed for running out of memory at roughly 3,800 of its 5,000 permitted connections.
- **Metadata for JDBC-based tools**: `pg_class.relpages`, `pg_am.amcanorder`, `pg_type.typlen`, and `pg_attribute.attlen` are now populated, so pgjdbc clients that call `DatabaseMetaData.getIndexInfo` — including the AWS Glue Data Catalog crawler — no longer abort on a missing column, and tools that read identifier length limits from `typlen`, such as Trino's PostgreSQL connector, see `63` instead of `-1` and can push joins down.
- **Temporal bucketing in every deployment**: Views and indexes over temporal filters are now maintained with temporal bucketing in the emulator and in self-managed deployments, which previously ran without it, lowering the cost of maintaining windowed temporal workloads there.
- **Incremental compaction on by default**: Persisted data is now compacted incrementally by default in self-managed deployments and the emulator, as Materialize Cloud has done in every environment since 2026-10-13, and no migration is needed because batches written by older versions are still compacted the previous way.
- **`min` and `max` over arrays and lists**: `min` and `max` now accept arrays and lists, lists gain the `<>`, `<`, `<=`, `>`, and `>=` operators they were missing, and arrays holding the same elements in differently shaped dimensions now order the way PostgreSQL's `array_cmp` orders them, which also changes `<`, `ORDER BY`, `greatest`, and `least` for those arrays.
- **Refresh strategy columns report their source expressions**: In `mz_internal.mz_materialized_view_refresh_strategies`, the `aligned_to` and `at` columns are renamed to `aligned_to_expression` and `at_expression` and now return `text` holding the expression as it appears in the materialized view's `create_sql`, rather than a resolved `timestamp with time zone`.

### Bug Fixes {#v26.47-bug-fixes}
- Fixed the liveness probe restarting `environmentd` mid-boot once client connections had filled the accept queue on its external SQL port, which could turn a slow startup into a restart loop; the Materialize Kubernetes operator now points the readiness and liveness probes at `environmentd`'s internal SQL port, which client traffic does not use. Deployments using password, SASL, or OIDC authentication have no separate internal SQL port and continue to be probed on the external one.
- Fixed `GRANT`, `REVOKE`, `ALTER ... OWNER`, and `ALTER CONNECTION` on a connection crashing the coordinator when a sink that depends on that connection had been repointed with `ALTER SINK ... SET FROM`; where the connection remained compatible the sink was instead rerun from its pre-`ALTER` definition, which fences off a Kafka sink.
- Fixed `environmentd` crashing while planning a query that passes a non-constant first argument to `regexp_extract`, such as a column of the relation it is joined against; planning now returns the usual `regexp_extract requires a string literal as its first argument` error.
- Fixed Iceberg sinks over a relation with a nested column, such as an array, stalling with `Iceberg table '...' schema does not match expected schema` when resuming against a table the catalog created, which happens after a Materialize restart; Materialize no longer requires the catalog's field IDs to match its own, and assigns field IDs to nested types in the breadth-first order most catalogs use.
- Fixed a zero-downtime upgrade never reporting itself ready to promote when the catch-up check ignored every collection a replica hosts, which happens deterministically when resuming an environment that has been stopped for longer than the two-hour cutoff; one staging environment sat in `Applying` for about 6.5 hours.
- Fixed freshness stalling after an automatic hydration burst was retired, by keeping the burst replicas until a steady replica has caught up within the configured lag allowance and has stayed ready for the whole linger period, rather than retiring them as soon as it finished initial hydration.
- Fixed up to 40 ms of added latency per parameterized query for clients that write each protocol message in a separate send, such as node-postgres before 8.14.1; in a local A/B test the median dropped from 44.0 ms to 5.7 ms.
- Fixed `mz_uptime()` producing a slightly different value for each occurrence in a plan, which made queries combining it with `INTERSECT` or `INTERSECT ALL` fail with an internal error or return wrong results; it now returns the uptime as of the start of the transaction, at millisecond resolution.
- Fixed a crash when a query that emits timestamp notices ran concurrently with a `DROP INDEX` on an index it reads.
- Fixed SQL Server source ingestion failing to decode an update to a table with a `NOT NULL` large object column when the update did not change that column.
- Fixed the committed offset reported for a PostgreSQL source jumping backwards across a restart after a new table was added to the source, which produced a run of unexpected error logs.
- Fixed `mz_cluster_replica_metrics_history` recording `NULL` CPU and memory for the second and later processes of a multi-process cluster replica, whose per-minute metrics fetch timed out on a pooled connection that had been idle.
- Fixed the connection balancer dropping a query a client sent in the same write as its password, which was read into the startup buffer and never forwarded.

## v26.45.1
*Released to Materialize Cloud: 2026-10-08* <br>
*Released to Materialize Self-Managed: 2026-10-09* <br>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,11 @@ columns:
- column: Release date
- column: Notes
rows:
- Materialize Operator: v26.47
orchestratord version: v26.47
environmentd version: v26.47
Release date: "2026-10-23"
Notes: "See [v26.47 release notes](/releases/#v26470)"
- Materialize Operator: v26.45.1
orchestratord version: v26.45.1
environmentd version: v26.45.1
Expand Down
Loading