Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: postgresql-cfbot/postgresql
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: cf/5930~1
Choose a base ref
...
head repository: postgresql-cfbot/postgresql
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: cf/5930
Choose a head ref
  • 4 commits
  • 8 files changed
  • 2 contributors

Commits on Aug 9, 2025

  1. Revise APIs for pushJsonbValue() and associated routines.

    Instead of passing "JsonbParseState **" to pushJsonbValue(),
    pass a pointer to a JsonbInState, which will contain the
    parseState stack pointer as well as other useful fields.
    Also, instead of returning a JsonbValue pointer that is often
    meaningless/ignored, return the top-level JsonbValue pointer
    in the "result" field of the JsonbInState.
    
    This involves a lot of (mostly mechanical) edits, but I think
    the results are notationally cleaner and easier to understand.
    Certainly the business with sometimes capturing the result of
    pushJsonbValue() and sometimes not was bug-prone and incapable of
    mechanical verification.  In the new arrangement, JsonbInState.result
    remains null until we've completed a valid sequence of pushes, so
    that an incorrect sequence will result in a null-pointer dereference,
    not mistaken use of a partial result.
    
    However, this isn't simply an exercise in prettier notation.
    The real reason for doing it is to provide a mechanism whereby
    pushJsonbValue() can be told to construct the JsonbValue tree
    in a context that is not CurrentMemoryContext.  That happens
    when a non-null "outcontext" is specified in the JsonbInState.
    No callers exercise that option in this patch, but the next
    patch in the series will make use of it.
    
    I tried to improve the comments in this area too.
    tglsfdc authored and Commitfest Bot committed Aug 9, 2025
    Configuration menu
    Copy the full SHA
    3beadb1 View commit details
    Browse the repository at this point in the history
  2. Remove fundamentally-redundant processing in jsonb_agg() et al.

    The various variants of jsonb_agg() operate as follows,
    for each aggregate input value:
    
    1. Build a JsonbValue tree representation of the input value.
    2. Flatten the JsonbValue tree into a Jsonb in on-disk format.
    3. Iterate through the Jsonb, building a JsonbValue that is part
    of the aggregate's state stored in aggcontext, but is otherwise
    identical to what phase 1 built.
    
    This is very slightly less silly than it sounds, because phase 1
    involves calling non-JSONB code such as datatype output functions,
    which are likely to leak memory, and we don't want to leak into the
    aggcontext.  Nonetheless, phases 2 and 3 are accomplishing exactly
    nothing that is useful if we can make phase 1 put the JsonbValue
    tree where we need it.  We could probably do that with a bunch of
    MemoryContextSwitchTo's, but what seems more robust is to give
    pushJsonbValue the responsibility of building the JsonbValue tree
    in a specified non-current memory context.  The previous patch
    created the infrastructure for that, and this patch simply makes
    the aggregate functions use it and then rips out phases 2 and 3.
    
    For me, this makes jsonb_agg() with a text column as input run
    about 2X faster than before.  It's not yet on par with json_agg(),
    but this removes a whole lot of the difference.
    tglsfdc authored and Commitfest Bot committed Aug 9, 2025
    Configuration menu
    Copy the full SHA
    0a4f666 View commit details
    Browse the repository at this point in the history
  3. Micro-optimize datatype conversions in datum_to_jsonb_internal.

    The general case for converting to a JSONB numeric value is to run the
    source datatype's output function and then numeric_in, but we can do
    substantially better than that for integer and numeric source values.
    This patch improves the speed of jsonb_agg by 30% for integer input,
    and nearly 2X for numeric input.
    
    Sadly, the obvious idea of using float4_numeric and float8_numeric
    to speed up those cases doesn't work: they are actually slower than
    the generic coerce-via-I/O method, and not by a small amount.
    They might round off differently than this code has historically done,
    too.  Leave that alone pending possible changes in those functions.
    
    We can also do better than the existing code for text/varchar/bpchar
    source data; this optimization is similar to one that already exists
    in the json_agg() code.  That saves 20% or so for such inputs.
    
    Also make a couple of other minor improvements, such as not giving
    JSONTYPE_CAST its own special case outside the switch when it could
    perfectly well be handled inside, and not using dubious string hacking
    to detect infinity and NaN results.
    tglsfdc authored and Commitfest Bot committed Aug 9, 2025
    Configuration menu
    Copy the full SHA
    4b87e82 View commit details
    Browse the repository at this point in the history
  4. [CF 5930] v1 - Making jsonb_agg() faster

    This branch was automatically generated by a robot using patches from an
    email thread registered at:
    
    https://commitfest.postgresql.org/patch/5930
    
    The branch will be overwritten each time a new patch version is posted to
    the thread, and also periodically to check for bitrot caused by changes
    on the master branch.
    
    Patch(es): https://www.postgresql.org/message-id/[email protected]
    Author(s): Tom Lane
    Commitfest Bot committed Aug 9, 2025
    Configuration menu
    Copy the full SHA
    c784af2 View commit details
    Browse the repository at this point in the history
Loading