When being used as a window function, these aggregates must run the finalization step repeatedly on their accumulated state. During that, discarding null-valued pairs isn't okay if we want to reject duplicate keys, since per SQL spec a null-valued pair still participates in duplicate key checking. Hence, when both those options are selected (jsonb_object_agg_unique_strict) run uniqueifyJsonbObject on a copy of the pairs array, keeping the original data structure unmodified. We don't want to do that when unique_keys isn't specified, because repeat de-duplication can be very expensive when there are many duplicates, but fortunately we don't have to. uniqueifyJsonbObject did not renumber the pairs it kept, so a pair added later could lose to an older one with the same key. Renumber them to ensure that we preserve last-one-wins behavior across multiple finalizations. Also improve related comments. While adding test cases to cover these mistakes, I chose to sync up all the json[b]_object_agg tests in json.sql and jsonb.sql. This exposed that json_object_agg() fails to de-duplicate keys in its output, which seems like a pre-existing bug; but for this commit let's just memorialize its behavior. Author: shihao zhong <zhong950419@gmail.com> Reviewed-by: Tom Lane <tgl@sss.pgh.pa.us> Discussion: https://postgr.es/m/CAGRkXqTCfSu=aEUCvKDTGroEWOcyz3MCv4Xi8x1PZ1T1rEmG=Q@mail.gmail.com Backpatch-through: 19
PostgreSQL Database Management System
This directory contains the source code distribution of the PostgreSQL database management system.
PostgreSQL is an advanced object-relational database management system that supports an extended subset of the SQL standard, including transactions, foreign keys, subqueries, triggers, user-defined types and functions. This distribution also contains C language bindings.
Copyright and license information can be found in the file COPYRIGHT.
General documentation about this version of PostgreSQL can be found at https://www.postgresql.org/docs/19/. In particular, information about building PostgreSQL from the source code can be found at https://www.postgresql.org/docs/19/installation.html.
The latest version of this software, and related software, may be obtained at https://www.postgresql.org/download/. For more information look at our web site located at https://www.postgresql.org/.