[26.1.1] - 2026-03-24
Features
- Unified socket configuration: introduce new `instance.iproto`, `instance.http`,
and `instance.pgproto` config sections that consolidate listen/advertise/TLS settings
per protocol. Old top-level parameters (`instance.iproto_listen`,
`instance.iproto_advertise`, `instance.http_listen`, `instance.pg`) are deprecated
but remain functional. HTTP server is now enabled by default on port 5327.
HTTP and pgproto peer addresses are stored in `_pico_peer_address` system table
with corresponding connection types (`http`, `pgproto`, `plugin:<name>.<service>`).
- Rework SQL execution protocol for DML queries to reduce data transfer.
- Support JSON_EXTRACT_PATH function.
- Introduce non-blocking SQL execution to prevent fiber starvation.
- New column `sync_incarnation` is added to `_pico_instance` system table.
- New ALTER SYSTEM parameter `governor_check_replication_error` (default: true)
enables the checking if replication is broken on any instance, in which case
the instance will be automatically made Offline.
- New ALTER SYSTEM parameter `sql_log` (default: false)
enables logging of all SQL statements to log file.
- Add CREATE TABLE syntax "PRIMARY KEY (bucket_id, ...)":
- When this syntax is used, there is no separate 'bucket_id' index;
- Instead, 'bucket_id' is included as the first part of the primary key index.
- New columns `target_state_reason` & `target_state_change_time` in `_pico_instance` system table
- Added env option PICODATA_UNSAFE_FORCE_RECOVERY.
- Possible values: true, false.
- This option is passed to Tarantool as `force_recovery` option.
- If force_recovery equals true, Tarantool tries to continue
if there is an error while reading a snapshot file (at server instance start)
or a write-ahead log file (at server instance start or when applying
an update at a replica.
- Introduce `read_preference` option for routing DQL queries to replicas in specific scenarios.
- Introduce `pico_stmt_invalidation` option for getting errors when binding invalid statements.
- Introduce `pico_query_metadata` option for getting distribution key metadata.
- Introduce `sql_preemption_opcode_max` to control the VDBE opcode interval
between execution time checks when `sql_preemption` is enabled.
- New ALTER SYSTEM parameter `sql_runtime_concurrency_max` (default: `1`)
limits the number of simultaneously executing SQL requests per instance.
- Support cluster update to next major version (26.1.0).
- Support compatibility between the next major Picodata version and older plugin versions.
- Add support for `EXPLAIN (RAW)` for queries that fail at local sql execution stage.
- Add unlogged tables to SQL:
- Unlogged tables' updates are not writeen into the WAL, so they are not persisted on restarts of
an instance and are not replicated. On leader change, all unlogged tables are truncated to
prevent inconsistencies. Creating unlogged tables is possible with the `CREATE UNLOGGED TABLE ...`
syntax. Unlogged tables are implemented as Tarantool data-temporary spaces, so it is not possible to
store them using the vinyl engine.
- \[breaking\] Instead of always being a tier with name `default`, default tier is now the first tier mentioned in the config.
- Add support for `compression_level` Vinyl option for secondary indices created with `CREATE INDEX`.
- Add support for Vinyl index options (`bloom_fpr`, `page_size`, `range_size`, `run_count_per_level`,
`run_size_ratio`, `compression_level`) in `CREATE TABLE ... WITH (...)` syntax for configuring
implicit primary key and bucket_id indices.
- Add suppoort for anonymous blocks. An anonymous block is a sequence of statements that execute
queries transactionally. Blocks are single-bucket, meaning that all the queries within the
block must be executed on the same bucket (or have distribution any).
- Add optimization for Limit + Distinct and Limit + OrderBy.
When certain conditions are met, the Limit node is added to the local stage of SQL query plan.
Supported statements are:
- QUERY: execute the given query;
- RETURN QUERY: execute the given query and return its result.
- Add detailed health status endpoint (`/api/v1/health/status`) with instance, Raft, bucket, and cluster information.
- Add support for Kubernetes startup, liveness and readiness probes.
- Support `bucket_count=0` for tiers. A tier with `bucket_count=0` has no sharded data
(only global system tables) and is intended for "arbiter" tiers used in Raft consensus.
Vshard bootstrap and configuration are skipped for such tiers, and replicaset expel
proceeds without waiting for bucket transfer. Creating sharded tables on a zero-bucket
tier is rejected with a clear error.
- Add support for `EXPLAIN (RAW)` for block queries.
- Speed up instance restart by actively trying to identify the raft leader instead of waiting for it to send a heartbeat to us.
- Refactor the plan id calculation for more accurate and faster caching.
- ACL/ALTER SYSTEM/ALTER INDEX RENAME operations now support WAIT APPLIED GLOBALLY / WAIT APPLIED LOCALLY syntax and
default to globally, matching DDL behavior.
- Add bucket estimation for INSERT queries in explain.
- Support reading from global tables in anonymous blocks; writing is not supported yet.
- Upgrade Tarantool from 2.11.5 to 2.11.8.
- Add migration context validation API into plugin SDK.
- Introduce a local SQL execution path for eligible queries that bypasses
`iproto` on the current instance; usage is exposed via the
`pico_sql_local_query_total` and `pico_sql_local_query_duration` metrics.
- Remove unnecessary `Motion(Full)` for queries that are guaranteed to be routed to a single node due to the sharding key filter.
CLI
- Completely re-architected `picodata demo` subcommand:
- Fixed improper signal handling (SIGINT, SIGTERM) and process termination.
- Added graceful shutdown and guaranteed cleanup of child processes.
- Introduced cluster orchestration model for simplified lifecycle management.
- Added configurable command-line parameters and cluster information display.
- Add machine-readable output formats to `picodata admin`
- Add long version output (-VV) with more info
WebUI
- Webui now displays the value of `cluster_version` instead of current
instance's version. That way you can easily tell if the cluster has been
upgraded successfully or not yet.
- the display of the target state in the instance card has been removed
- the ability to group by replicas has been removed
- added a visual indication of the problem status for the offline instance counter
- virtualization has been applied to the tiers and instance list
- the cluster information is displayed in the header
- the filter has been redesigned, now it is constantly displayed in front of the list of shooting ranges or instances. Added the ability to filter by text and by tags, such as dash name, replica set name, instance name, version, status.
Fixes
- Fixed that governor would hang indefinitely if an Offline replicaset had
target_master_name != current_master_name.
- Fixed that instance would hang indefinitely when trying to join the cluster if
the cluster becomes too big.
NOTE: The fix requires modifying the proc_raft_join RPC response format
which technically breaks compatibility with previous versions of picodata.
However picodata explicitly doesn't support heterogeneous joins (when version
of joining instances mismatches version of cluster), so this shouldn't be a
problem for anybody. NOTE also that this doesn't affect restarting instances
which already joined the cluster.
- Fixed a crash when SQL request arrives before instance is properly initialized
- Fixed that instances would be made Offline immediately after a raft entry is
applied if there weren't any entries applied for a long time before that
- Fixed that instances would randomly fail with ER_READONLY during bootstrap
- Fixed ER_BOOTSTRAP_CONNECTION_NOT_TO_ALL failure during instance join stage.
- Fixed that governor would send redundant proc_sharding RPCs which would make
it impossible to deploy huge clusters. Now RPCs from governor are split into
batches of configurable size (default 200, ALTER SYSTEM parameter `governor_rpc_batch_size`).
- Improve upgrade flow for creating Lua stored functions (exported to SQL).
- Node construction is now deferred until actually needed, avoiding unnecessary
work for cached queries on any instance execution
- Fixed a memory leak in SQL API of plugin SDK
- `picodata status` no longer panics when `stdout`, `stderr`,
or both are redirected to a broken pipe.
- Fixed that the whole replicaset would be broken if one instance get's a
replication conflict. (See also https://git.picodata.io/core/picodata/-/issues/2231).
- Fixed that governor would sometimes be blocked in read_only on a DDL operation
mode not being able to apply any subsequent raft operations.
- Introduce unnamed_join alias for motions with joins under them to distinguish columns with identical names
- Governor RPC batching is also implemented for proc_apply_schema_change.
- Governor RPC batching is also implemented for proc_apply_backup.
- Datetime literals should support `yyyy-mm-dd` format, e.g. `select '2026-01-17'::datetime`.
- Fix type inference for the `a BETWEEN b AND c` expression; now types of `a`, `b` and `c` should be
properly unified, meanining that `select '2026-01-13' between '2026-01-01'::datetime and '2026-01-20'`
will work as expected.
- Fixed that upgrading between patch versions wouldn't run upgrade scripts.
- Fixed assertion failure in CAS right after raft leader change followed by
persisted raft log tail truncation.
- Fixed instance.vinyl.* options to be applied to primary and bucket_id indices.
- Fixed a crash in proc_runtime_info when the last applied raft entry contained
a unicode string where a 100th byte position was not on a character boundary.
- Fixed that sentinel_loop was broken during upgrade from versions before 25.5.3.
- Fixed ignoring `NULLS FIRST` and `NULLS LAST` in unnamed window queries with ordering.
- Fixed metadata loss in queries with LIMIT clause in picodata admin.
- Fixed invalid volatile flag for rust-implemented builtin functions.
- Fixed governor's `ConfigureReplication` step was broken during upgrade from before 25.5.3
- Fixed that instances from tiers with can_vote=false attempting to promote to raft leader.
- Fixed that `--pg-advertise` CLI argument was erroneously disallowed to be used
simultaneously with `--iproto-advertise`.
- Fixed a race condition between DDL (i.e., TRUNCATE) and DQL when the preemption option is enabled.
- Fixed concurrent access to storage temporary tables by synchronizing their lifecycle
and execution with a per-plan lock.
- Fixed a number of vinyl issues by backporting upstream patches
- Fixed an issue where upgrade operations were inserted incorrectly
when applying system catalog changes for several catalog versions.
- Fixed `picodata plugin configure` panic on attempt to update non-existent plugin or a non-existing
service of an existing plugin.
- Fixed `proposal dropped` errors sometimes being returned from DDL commands for example when raft is unknown.
- Fixed an RPC to avoid skipping metrics collection code path on early return in procedure implementation.
- Make sure that single-tiered clusters upgraded from 25.3.x always have a default tier.
- Fixed that instances would fail with ER_READONLY while joining a replicaset
whose master was still bootstrapping. Governor no longer triggers mastership
failover for a master that is in the initial Offline(0) join state and has
not yet had a chance to become Online.
- Fixed local SQL iterators to survive fiber yields during table truncation.
- Fixed a caching bug affecting `UNION` queries with global and sharded tables in a cluster of several replicasets.
- Fixed a caching bug that caused some different queries to tables with `bucket_id` in the primary key to have the same plan id.
- Fixed SUM/AVG type resolution for Double
- Fixed incorrect filter pushdown into compound queries containing window functions.
Observability
- All duration-based metrics now report in fractional seconds instead of
milliseconds for consistency with Prometheus and more precision.
- RPC request durations now use a monotonic high-precision clock instead
of the event-loop clock to improve timing accuracy.
- Added SQL temp-table lock metrics:
`pico_sql_temp_table_leases_total` and
`pico_sql_temp_table_lock_waits_total`.
Breaking changes
- Remove `tros` and `tarolog` dependencies from `picodata-plugin`. These
libraries can still be used as direct dependencies when needed.
- Hashing behavior changed for `DOUBLE` type fields in primary keys
and distribution keys. Previously, values were always re-encoded as MP_DOUBLE
(9 bytes) before hashing. Now, integer-representable doubles (e.g., `1.0`)
are converted to integer encoding before hashing, making them hash identically
to their integer equivalents (e.g., `1`). This is correct behavior that allows
lookups like `SELECT * FROM t WHERE double_col = 1` to find rows inserted with
`double_col = 1.0`. However, existing data sharded on `DOUBLE` keys containing
integer values may have different bucket assignments after upgrade.