diff --git a/src/current/_data/releases.yml b/src/current/_data/releases.yml
index c48aad5a241..87889b14e6a 100644
--- a/src/current/_data/releases.yml
+++ b/src/current/_data/releases.yml
@@ -10011,3 +10011,31 @@
docker_arm_limited_access: false
source: true
previous_release: v25.4.0
+
+
+- release_name: v26.1.0-alpha.2
+ major_version: v26.1
+ release_date: '2025-12-11'
+ release_type: Testing
+ go_version: go1.25.3
+ sha: 7991c17b6f2957e381666bf13d6405c8037f46c1
+ has_sql_only: true
+ has_sha256sum: true
+ mac:
+ mac_arm: true
+ mac_arm_experimental: true
+ mac_arm_limited_access: false
+ windows: true
+ linux:
+ linux_arm: true
+ linux_arm_experimental: false
+ linux_arm_limited_access: false
+ linux_intel_fips: true
+ linux_arm_fips: false
+ docker:
+ docker_image: cockroachdb/cockroach-unstable
+ docker_arm: true
+ docker_arm_experimental: false
+ docker_arm_limited_access: false
+ source: true
+ previous_release: v26.1.0-alpha.1
diff --git a/src/current/_data/versions.csv b/src/current/_data/versions.csv
index ae340872cdd..37300512475 100644
--- a/src/current/_data/versions.csv
+++ b/src/current/_data/versions.csv
@@ -20,4 +20,4 @@ v25.1,2025-02-18,2025-08-18,N/A,N/A,N/A,N/A,N/A,N/A,v24.3,release-25.1,2029-02-1
v25.2,2025-05-09,2026-05-12,2026-11-12,N/A,N/A,N/A,N/A,N/A,v25.1,release-25.2,2029-05-09
v25.3,2025-08-04,2026-02-04,N/A,N/A,N/A,N/A,N/A,N/A,v25.2,release-25.3,2029-08-04
v25.4,2025-11-03,2026-11-03,2027-05-03,N/A,N/A,N/A,N/A,N/A,v25.3,release-25.4,2029-11-03
-v26.1,N/A,N/A,N/A,N/A,N/A,N/A,N/A,N/A,v25.4,release-25.4,N/A
+v26.1,N/A,N/A,N/A,N/A,N/A,N/A,N/A,N/A,v25.4,release-26.1,N/A
diff --git a/src/current/_includes/releases/v26.1/v26.1.0-alpha.2.md b/src/current/_includes/releases/v26.1/v26.1.0-alpha.2.md
new file mode 100644
index 00000000000..e71ae3e67b3
--- /dev/null
+++ b/src/current/_includes/releases/v26.1/v26.1.0-alpha.2.md
@@ -0,0 +1,118 @@
+## v26.1.0-alpha.2
+
+Release Date: December 11, 2025
+
+{% include releases/new-release-downloads-docker-image.md release=include.release %}
+
+
SQL language changes
+
+- Added a new session variable, `use_swap_mutations`, which controls whether the new update swap and delete swap operators are enabled for use by `UPDATE` and `DELETE` statements. [#145019][#145019]
+- Fixed a bug where the results of `ALTER SEQUENCE`'s increment and `SELECT nextval()` operations were not as expected. The value of a sequence after an `ALTER SEQUENCE` statement has executed on it is now consistent with a sequence created with those values. [#154489][#154489]
+- SQL statements executed in stored procedures and user-defined functions now record SQL statistics, including latencies and execution metrics. These statistics appear on the **SQL Activity** and **Insights** pages of the DB Console. Limitation: SQL statements within a stored procedure or user-defined function are not collected for active statement diagnostics requests. Statement diagnostics remain available for top-level statement executions. [#156905][#156905]
+- The `ALTER COLUMN ...` sequence identity
+ commands are run by the declarative schema changer. [#157030][#157030]
+- The `cumulative time spent waiting in admission control` is now displayed in `EXPLAIN ANALYZE` output when it is non-zero. This helps identify delays caused by admission control during query execution. [#158055][#158055]
+- Restarting a sequence with an updated increment has the expected initial value. [#158065][#158065]
+- The `cumulative time spent waiting in admission control` reported in `EXPLAIN ANALYZE` now includes the time spent in quorum replication flow control. This update enhances the precision of wait time analysis, offering a more accurate depiction of query execution time by considering additional wait durations within the quorum replication processes. [#158076][#158076]
+- Added a new "hint injection" ability that allows operators to dynamically inject inline hints into statements, without modifying the text of those statements. Hints can be injected using the built-in function `crdb_internal.inject_hint` with the target statement fingerprint to rewrite. For example, to add an index hint to the statement `SELECT * FROM my_table WHERE col = 3`, use:
+
+ ~~~
+ SELECT crdb_internal.inject_hint(
+ 'SELECT * FROM my_table WHERE col = _',
+ 'SELECT * FROM my_table@my_table_col_idx WHERE col = _'
+ );
+ ~~~
+
+ Whenever a statement is executed matching statement fingerprint `SELECT * FROM my_table WHERE col = _`, it will first be rewritten to include the injected index hint. [#158096][#158096]
+- `ALTER TABLE ... SET SCHEMA` is supported by the declarative schema changer. [#158141][#158141]
+- `kv cpu time` is now displayed in `EXPLAIN ANALYZE`, providing insights into the CPU resources used by KV operations during query execution. [#158499][#158499]
+- CockroachDB now negotiates the pgwire protocol version with PostgreSQL 18+ clients that request protocol version 3.2. Previously, connections from these clients would fail with an "unknown protocol version" error. The server now sends a `NegotiateProtocolVersion` message to indicate it supports version 3.0, allowing the connection to proceed normally. [#158636][#158636]
+
+Operational changes
+
+- All queries to system and crdb_internal by
+ default will begin failing, notifying users that they must override the
+ access gate if they wish to use those namespaces.
+
+The `allow_unsafe_internals` setting now defaults to `false`, restricting access to the `system` and `crdb_internal` namespaces. Queries to these namespaces will now fail unless access is manually enabled. Usage is also audited. [#158085][#158085]
+- Jobs that are paused due to a specific reason, including jobs which pause themselves when encountering errors such as running out of disk space, now record that reason in their displayed status field of `SHOW JOBS`. [#158350][#158350]
+- The following metrics are now marked as essential to support end-user troubleshooting of authentication latency issues:
+- `auth.jwt.conn.latency`
+- `auth.cert.conn.latency`
+- `auth.password.conn.latency`
+- `auth.ldap.conn.latency`
+- `auth.gss.conn.latency`
+- `auth.scram.conn.latency`
+- `auth.ldap.conn.latency.internal` [#158424][#158424]
+
+DB Console changes
+
+- The log of messages and events recorded by a job is now shown to non-admin users on the DB Console Jobs page. [#152853][#152853]
+- The DB Console now accurately displays **vCPU** counts on the **Overview** page instead of operating system CPU counts. This update uses cgroups to provide a correct vCPU measurement, reflecting reserved compute resources in Kubernetes and other virtualized environments. [#158219][#158219]
+- Jobs which are paused for a specific reason now show that reason, and are highlighted in the UI. [#158364][#158364]
+- The `kvCPUTimeNanos` is now recorded in `crdb_internal.statement_statistics` and `crdb_internal.transaction_statistics`. In the DB Console, a **KV CPU Time** column is now displayed in the **SQL Activity** > **Statements** and **Transactions** pages, allowing you to monitor and analyze the CPU time consumed by KV operations during query execution. [#158398][#158398]
+- The `admissionWaitTime` is now recorded in `crdb_internal.statement_statistics` and `crdb_internal.transaction_statistics`. In the DB Console, an **Admission Wait Time** column is now displayed in the **SQL Activity** > **Statements** and **Transactions** pages. [#158500][#158500]
+
+Bug fixes
+
+- Fixed a bug that could cause an internal error in some cases for PL/pgSQL routines that perform database reads within an exception block. [#156902][#156902]
+- Fixed a bug where a SQL statement with side effects (e.g., `INSERT`) inside a PL/pgSQL routine could be dropped if it used an `INTO` clause and none of the target variables were referenced. This bug had been present since v23.2. [#156966][#156966]
+- Fixed a bug where renaming a column that participated in multiple hash-sharded indexes would fail. [#158045][#158045]
+- Fixed a bug where `ORDER BY` clauses in user-defined set-returning SQL functions with `OUT` parameters were ignored when the function was called directly in a `SELECT` list (e.g., `SELECT f()`). The ordering is now properly preserved and enforced. [#158162][#158162]
+- The pgwire server now exits promptly on context cancellation. [#158269][#158269]
+- Fixed a bounded memory leak that could occur during table statistics collection on tables that contain both very wide (10 KiB or more) and small (under 400B) `BYTES`-like values within the same row, along with virtual computed columns. This bug had been present since stats collection on virtual computed columns was introduced in v24.1. [#158370][#158370]
+- Temporary schema cleanup no longer retries after poisoned transaction errors, reducing log noise. [#158396][#158396]
+- When changing the time interval on the **Metrics** page, the DB Console previously sent duplicate requests for metrics data. This has been fixed, and the UI now issues a single, efficient request when updating the time interval. [#158595][#158595]
+
+
+
+- Added new `update swap` and `delete swap` operators that allow some `UPDATE` and `DELETE` statements to execute in 1 roundtrip instead of 2 roundtrips. These operators can be used when:
+
+ - All columns in the primary index are constrained to a single exact value
+ by the `WHERE` clause;
+ - Only a single row is modified;
+ - There are no foreign-key checks or cascades;
+ - There are no uniqueness checks;
+ - There are no check constraints;
+ - There are no vector indexes modified;
+ - There are no passthrough columns to `RETURNING`;
+ - There are no triggers;
+ - The table only uses a single column family;
+ - There are no mutation columns or mutation indexes (i.e., the table is
+ not undergoing an `ALTER`);
+ - There are no columns using composite encoding (e.g., `DECIMAL`, `FLOAT`,
+ `JSON`, etc.). [#145019][#145019]
+- The optimizer now collapses repeated `%` wildcard characters in `LIKE` patterns. This may improve performance of queries using such patterns. [#158025][#158025]
+- More of the CPU usage of LDR jobs is subject to background job admission control limits. [#158361][#158361]
+
+
+[#158424]: https://github.com/cockroachdb/cockroach/pull/158424
+[#156966]: https://github.com/cockroachdb/cockroach/pull/156966
+[#158269]: https://github.com/cockroachdb/cockroach/pull/158269
+[#145019]: https://github.com/cockroachdb/cockroach/pull/145019
+[#158350]: https://github.com/cockroachdb/cockroach/pull/158350
+[#157030]: https://github.com/cockroachdb/cockroach/pull/157030
+[#158396]: https://github.com/cockroachdb/cockroach/pull/158396
+[#158085]: https://github.com/cockroachdb/cockroach/pull/158085
+[#152853]: https://github.com/cockroachdb/cockroach/pull/152853
+[#158219]: https://github.com/cockroachdb/cockroach/pull/158219
+[#158500]: https://github.com/cockroachdb/cockroach/pull/158500
+[#156902]: https://github.com/cockroachdb/cockroach/pull/156902
+[#154489]: https://github.com/cockroachdb/cockroach/pull/154489
+[#158636]: https://github.com/cockroachdb/cockroach/pull/158636
+[#158398]: https://github.com/cockroachdb/cockroach/pull/158398
+[#158595]: https://github.com/cockroachdb/cockroach/pull/158595
+[#155216]: https://github.com/cockroachdb/cockroach/pull/155216
+[#158364]: https://github.com/cockroachdb/cockroach/pull/158364
+[#158045]: https://github.com/cockroachdb/cockroach/pull/158045
+[#158162]: https://github.com/cockroachdb/cockroach/pull/158162
+[#158076]: https://github.com/cockroachdb/cockroach/pull/158076
+[#158025]: https://github.com/cockroachdb/cockroach/pull/158025
+[#156905]: https://github.com/cockroachdb/cockroach/pull/156905
+[#158055]: https://github.com/cockroachdb/cockroach/pull/158055
+[#158141]: https://github.com/cockroachdb/cockroach/pull/158141
+[#158499]: https://github.com/cockroachdb/cockroach/pull/158499
+[#158370]: https://github.com/cockroachdb/cockroach/pull/158370
+[#158361]: https://github.com/cockroachdb/cockroach/pull/158361
+[#158065]: https://github.com/cockroachdb/cockroach/pull/158065
+[#158096]: https://github.com/cockroachdb/cockroach/pull/158096