v4.5.0 Release Notes

Release date: April 2026

Version: v4.5.0

This SynxDB release expands vectorized and GPORCA parallel execution to help heavy analytical queries run faster and more reliably, with additional fixes that improve stability across optimizer, storage, replication, security, and tooling.

New query execution capabilities: Extends the vectorized execution engine with hash-based window aggregation (WindowHashAgg) and spill-to-disk support for hash joins; enhances GPORCA with parallel index-only scan, parallel UNION and UNION ALL execution, and WindowAgg Top-K pushdown for top-N-per-group queries.

Key bug fixes and improvements: Resolves PAX toast SIGSEGV crashes that occurred when ANALYZE processed tables where NULL rows precede toasted rows, and fixes failures when creating ZomboDB indexes on partitioned tables so that parent tables can be indexed successfully from Elasticsearch. Additional changes further improve correctness and operational behavior in several internal components.

New features

Database

Category

Feature

User documents

Query processing and optimization

Introduces spill-to-disk support for vectorized hash joins. When the estimated hash table size exceeds the configurable memory budget (vector.hashjoin_spill_memory_mb), the build side is automatically partitioned and spilled to disk, preventing out-of-memory failures on large joins.

Vectorization query computing

Query processing and optimization

Adds hash-based window aggregation (WindowHashAgg) to the vectorized execution engine. Instead of sorting, the engine partitions PARTITION BY clauses using hashing, reducing latency for window function queries such as running totals, ranking, and moving averages on large datasets.

Vectorization query computing

Query processing and optimization

Enables GPORCA to push a Top-K filter below the WindowAgg operator for top-N-per-group queries using RANK() <= K, inserting a Partition Top-K node that prunes non-qualifying rows before full window rank computation and reduces memory and CPU usage.

ORCA performance tuning

Query processing and optimization

Enables GPORCA to execute index-only scans in parallel for queries that select only index-covered columns, reading results entirely from the index without accessing table data blocks and reducing I/O compared to a parallel index scan.

Execute queries in parallel

Query processing and optimization

Enables GPORCA to execute UNION and UNION ALL queries in parallel within segments, distributing work across multiple workers to improve throughput for queries that combine multiple result sets.

Execute queries in parallel

Security

Adds a strict password policy option to the PasswordCheck plugin. When passwordcheck.strict_policy is enabled, passwords must meet enhanced complexity requirements including minimum length, uppercase, lowercase, digit, and special character counts.

Check password security

New feature details

Query processing and optimization

  • Spill-to-disk for vectorized hash joins: Vectorized hash joins can now spill the build side to disk when the estimated hash table size exceeds the memory budget set by vector.hashjoin_spill_memory_mb (default: 512 MB). Spilled data is automatically split into partitions and processed in multiple passes, preventing out-of-memory failures when joining large datasets. This makes vectorized execution viable for hash joins that previously required reducing max_parallel_workers_per_gather or disabling vectorization altogether. Setting the parameter to 0 disables spill-to-disk entirely. The parameter only takes effect on PAX or AOCS tables with vectorization enabled; heap tables fall back to non-vectorized execution regardless of this setting.

    See Vectorization query computing.

  • Vectorized window hash aggregation: The vectorized execution engine now supports hash-based window aggregation (WindowHashAgg), which processes PARTITION BY clauses using hash-based partitioning instead of sorting. This eliminates sort overhead for window functions on large datasets, reducing query latency for analytical patterns such as running totals, ranking, and moving averages. When vectorization is enabled with the GPORCA optimizer, the optimizer automatically selects the hash-based execution path for eligible window functions. The feature requires PAX or AOCS tables; heap tables fall back to non-vectorized execution.

    See Vectorization query computing.

  • WindowAgg Top-K pushdown: GPORCA can now push a Top-K filter below the WindowAgg operator for top-N-per-group queries that use RANK() OVER (PARTITION BY ... ORDER BY ...) <= K. GPORCA inserts a Partition Top-K node that retains only rows within the top K ranks per partition—including all tied rows at the rank boundary—and discards the rest before full window rank computation, reducing memory and CPU usage on large datasets. The optimization is disabled by default and is enabled by setting optimizer_force_partition_topk = on. Only RANK() with <= K or < (K+1) filter conditions is supported; ROW_NUMBER() and DENSE_RANK() fall back to standard WindowAgg execution.

    See ORCA performance tuning.

  • Parallel index-only scan: GPORCA can now execute index-only scans in parallel for queries that select only columns covered by an index, reading results entirely from the index without accessing table data blocks. This reduces I/O compared to a parallel index scan, making it effective for queries on wide tables where a covering index eliminates data block reads. The feature requires a populated visibility map (run VACUUM on the table first) and applies to B-tree indexes only; bitmap AM indexes are not supported. Set optimizer_enable_indexonlyscan = off to disable this behavior.

    See Execute queries in parallel.

  • Parallel UNION and UNION ALL: GPORCA can now distribute UNION and UNION ALL work across multiple workers within each segment, improving throughput for queries that combine multiple result sets. The feature is enabled by default through the optimizer_parallel_union parameter. Set optimizer_parallel_union = off to disable intra-segment parallelism for UNION queries. Requires the GPORCA optimizer and enable_parallel = on.

    See Execute queries in parallel.

Security

  • Strict password policy for PasswordCheck: The PasswordCheck plugin now supports an optional strict password policy controlled by the passwordcheck.strict_policy parameter (default: off). When enabled, passwords must meet hardcoded complexity requirements, including at least 9 characters long, at least 2 uppercase letters, at least 2 lowercase letters, at least 2 digits, and at least 2 special characters. The passwordcheck module must be loaded via shared_preload_libraries before this parameter can take effect. Enable it with gpconfig -c passwordcheck.strict_policy -v on followed by gpstop -u.

    See Check password security.

Product change information

GUC configuration parameters

Newly added GUCs

The following configuration parameters are added:

  • vector.hashjoin_spill_memory_mb: default 512 (MB). Controls the memory budget for vectorized hash join spill-to-disk. See Vectorization query computing.

  • vector.winagg_spill_work_mem: default 0 (kB). Controls the memory budget for WindowHashAgg spill-to-disk; 0 means use work_mem. See Vectorization query computing.

  • optimizer_force_partition_topk: default off. Enables WindowAgg Top-K pushdown for top-N-per-group queries in GPORCA. See ORCA performance tuning.

  • optimizer_parallel_union: default on. Enables parallel UNION and UNION ALL execution in GPORCA. See Execute queries in parallel.

  • passwordcheck.strict_policy: default off. Enables a strict password policy for the PasswordCheck plugin, requiring passwords to meet enhanced complexity rules. See Check password security.

Changed GUCs

  • optimizer_enable_indexonlyscan: Now also controls parallel index-only scan plans when enable_parallel = on. See Execute queries in parallel.

Bug fixes and improvements

Query optimizer and executor

  • Fixed ORCA assigning zero local cost to window functions without an ORDER BY clause by using max(ulSortCols, 1) in the cost formula, preventing the optimizer from underestimating window function evaluation overhead.

  • Fixed SPI_commit to trap errors and start a clean transaction before re-throwing, preventing Python interpreter crashes when plpython procedures encounter commit or rollback failures (Python 3.11 compatibility).

  • Removed a fast path in TransactionIdIsInProgress that incorrectly returned false for transactions committed in CLOG but not yet removed from the process array, fixing potential phantom update anomalies and t_xmin visibility errors.

  • Fixed dump/reload failures caused by dropped composite type columns referenced through functions in FROM by emitting ?dropped?column? in ruleutils output instead of raising an error.

  • Fixed postgres_fdw async data fetch to correctly detect PQsendQuery() failures (which return 0, not a negative value), preventing silently ignored FETCH query failures in async mode.

  • Removed an unnecessary loop in a single-iteration code path identified by SonarQube static analysis.

  • Added qsort_interruptible() that calls CHECK_FOR_INTERRUPTS periodically during sort operations applied to statistics collection, allowing previously un-cancelable multi-second sorts to be interrupted.

Storage and access methods

  • Fixed two PAX bugs that caused external toast pointers to reach detoast_attr() un-detoasted, resulting in SIGSEGV: a GetDatum index mismatch when NULL rows precede toasted rows, and an off-by-one error in AddToastIndex.

  • Fixed three PAX snapshot bugs: SNAPSHOT_ANY was incorrectly passed to catalog lookups during index scans, and gp_select_invisible was not honored in IndexUniqueCheck or sequential scans.

  • Added GUC_GPDB_NEED_SYNC to pax.enable_sparse_filter and pax.enable_row_filter so coordinator SET commands are dispatched to segment instances; previously, setting these parameters on the coordinator had no effect.

  • Fixed incorrect use of GetBufferDescriptor instead of GetLocalBufferDescriptor for local buffers, preventing out-of-bounds reads when temp_buffers exceeds shared_buffers.

  • Fixed stale diskquota.table_size entries persisting after cluster restart by invalidating them during diskquota worker startup in addition to pg_class validation.

  • Fixed a memory leak in diskquota refresh_rejectmap where SearchSysCacheCopy1 tuple copies were not freed after use.

  • Fixed diskquota shared memory allocation by removing DDL message memory from segment processes (needed only on the coordinator) and skipping launcher shared memory initialization on segments.

  • Added support for ZomboDB indexes on partitioned tables, resolving Elastic errors when creating indexes on parent tables.

Processes and concurrency

  • Fixed a race condition in DTX recovery by registering all mirrors in a single transaction, preventing an assert failure in cdbcomponent_getComponentInfo when recovery reads gp_segment_configuration in a partial state.

  • Fixed a string length calculation in gpvars_check_gp_resource_group_cgroup_parent that allowed invalid cgroup parent names containing spaces to pass validation.

  • Fixed stale partition map entries, data inconsistency from schema changes, and missing replica identity checks on partition tables during logical replication.

  • Added WAIT_USE_SELF_PIPE as a fallback for epoll on illumos to avoid signalfd() hangs and kernel panics, making self-pipes the default on illumos while preserving signalfd() on Linux.

  • Fixed a memory leak on logical replication subscribers where attribute mapping memory was not freed when rebuilding the relation mapping.

Security

  • Fixed missing privilege checks in pg_stats_ext and pg_stats_ext_exprs views (CVE-2024-4317) to restrict data to table owners or roles with inherited owner privileges, including expression statistics and row-level security policies.

  • Fixed pg_signal_backend to block signaling of superuser-owned background workers, autovacuum workers, and logical replication launcher processes (CVE-2023-5870).

  • Fixed dump/reload of indexes referencing operator classes, collations, or exclusion operators in non-standard schemas by using the original user ID for ACL checks during CREATE INDEX.

Tools and utilities

  • Fixed the GPG verify step in the release script to use absolute artifact paths, resolving “No such file or directory” errors when running with --repo from a different working directory.

  • Fixed DEB packaging by setting architecture to any, correcting the DESTDIR path for cloudberry-env.sh, and using DEB_HOST_MULTIARCH instead of a hardcoded x86_64 path.

  • Fixed the ecpglib patch for MPP compatibility and applied upstream fixes for newlocale() call-once-per-process behavior and ppc Darwin builds.

  • Added a pre-upgrade check to pg_upgrade to detect user-defined operators and aggregates relying on built-in functions changed from anyarray to anycompatiblearray, preventing mid-upgrade failures.

  • Fixed premature IDLE state transitions in libpq pipeline mode that caused “message type 0x33 arrived while idle” warnings and lost NULL result values.

  • Fixed pgcrypto regression test failures on FIPS-enabled Rocky Linux 8 by updating error message regex patterns and masking ephemeral line numbers.

  • Added allow_in_place_tablespaces to the GUC sync list and applied rebase compatibility fixes for upstream in-place tablespace support.

  • Fixed adjust_conf to use TestLib::slurp_file directly after a refactor removed the inline PostgreSQL::Test::Utils package from TestLib.pm.

  • Fixed Perl test package aliasing to use full symbol table aliasing instead of per-symbol lists, preventing segfaults on Perl v5.10.1 and earlier.

  • Added error handling for mktemp, git fetch, and mkdir failures in code-review.sh, fixed diff truncation to use byte count, and added auth token validation before MR context gathering.