Performance Improvements π
- High-cardinality
GROUP BYqueries on the Aggregate Scan run faster: grouped results are turned into rows in one pass instead of re-searching the bucket tree for every row.
Stability Improvements πͺ
-
pdb.verify_index(..., heapallindexed => true)andpdb.verify_all_indexes()lock each table before its index, including partition leaves, avoiding deadlocks with concurrentREINDEXorVACUUM FULL. -
A
GROUP BYon a float column now returns the aggregates of aNaNgroup instead of NULL, for queries withoutFILTERaggregates. -
NOT (field = ANY('{}'))andfield <> ALL('{}')with an empty array no longer drop every row when combined with a search. -
Comparing a NULL value against an indexed array column, such as
NULL::text = ANY(tags), no longer raisespushdown expression should not evaluate to NULL.
Breaking Changes π¨
Standalone index access permissions
Standalone index reads now check permissions on the backing table. Content-reading APIs, includingparadedb.aggregate(), require table-level SELECT and reject calls when row-level
security applies to the effective caller.
Callers who need a filtered result under RLS can be given a SECURITY DEFINER function,
owned by the table owner, that applies the policyβs filter in an ordinary @@@ query.
Wrapping paradedb.aggregate() itself does not filter rows.
Metadata APIs, including paradedb.schema(), index_fields(), the layer-size
functions, index_created_at(), index_created_by(), merge_info() (and its
is_merging() alias), vacuum_info(), fsm_info(), fsm_size(),
paradedb.index_info(), pdb.index_segments(), and the statistics returned by
pdb.indexes()
also accept callers with the privileges of pg_stat_scan_tables, inherited by pg_monitor.
These trusted monitoring roles can inspect whole-index metadata and document counts without
table SELECT, including counts across rows hidden by RLS. Other callers still need schema
USAGE, table-level SELECT, and no active RLS; inventory omits indexes they cannot inspect.
The monitoring privilege does not authorize document reads, verification, or maintenance.
Only the metadata APIs listed above accept monitoring privileges. Other diagnostics,
including vector_config(), and content reads and verification retain the stricter read policy.
merge_lock_garbage_collect() requires MAINTAIN on the backing table on PostgreSQL 17
and later, including privileges inherited from pg_maintain. Table owners qualify
implicitly. PostgreSQL 15 and 16 require ownership of the backing table.