Re: Making jsonb_agg() faster
jian he <jian.universality@gmail.com>
From: jian he <jian.universality@gmail.com>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: pgsql-hackers@lists.postgresql.org
Date: 2025-08-14T09:41:33Z
Lists: pgsql-hackers
Commits
Same data as JSON:
GET /api/v1/messages/:b64id/commits
the thread's linked commits as JSON, with link sources.
API reference →
-
Fix jsonb_object_agg crash after eliminating null-valued pairs.
- ef5f559b95e2 19 (unreleased) landed
-
Micro-optimize datatype conversions in datum_to_jsonb_internal.
- 005a2907dc30 19 (unreleased) landed
-
Remove fundamentally-redundant processing in jsonb_agg() et al.
- b61aa76e4585 19 (unreleased) landed
-
Revise APIs for pushJsonbValue() and associated routines.
- 0986e95161ce 19 (unreleased) landed
-
Add a macro for the declared typlen of type timetz.
- 3628af42107d 19 (unreleased) landed
On Thu, Aug 14, 2025 at 4:59 PM jian he <jian.universality@gmail.com> wrote:
>
> > 0001 is a somewhat invasive refactoring of the API for
> > pushJsonbValue and friends.
in pushJsonbValue:
/*
* pushJsonbValueScalar handles all cases not involving pushing a
* container object as an ELEM or VALUE.
*/
if (!jbval || (seq != WJB_ELEM && seq != WJB_VALUE))
{
pushJsonbValueScalar(pstate, seq, jbval);
return;
}
/* If it's not a jbvBinary value, again it goes to pushJsonbValueScalar */
if (jbval->type != jbvBinary)
{
pushJsonbValueScalar(pstate, seq, jbval);
return;
}
we can combine above these two into
if (!jbval || (seq != WJB_ELEM && seq != WJB_VALUE) ||
IsAJsonbScalar(jbval))
{
pushJsonbValueScalar(pstate, seq, jbval);
return;
}
and put it in the earlier position of pushJsonbValue.