- 
                Notifications
    You must be signed in to change notification settings 
- Fork 2
  Permalink
    
      
      
  
  
    
  
    
  
      
    
  
      
  
    
    
  
  
    
      Choose a base ref
      
     
    
      
        
      
      
        
          
          
        
        
          
            
              
              
              
  
    
    {{ refName }}
    default
  
           
        
        
          
            
              
              
           
        
       
     
  
  
  
    
  
    
  
    
  
      
    
  
      
  
    
    
  
  
    
      Choose a head ref
      
     
    
      
        
      
      
        
          
          
        
        
          
            
              
              
              
  
    
    {{ refName }}
    default
  
           
        
        
          
            
              
              
           
        
       
     
  
  
          
    
        
              
  
  
        
        
  
    
  
      
        
    
              
      
  
    
  
      
  
   
  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
Could not load branches
            
              
      Nothing to show
            
                
      Loading
              
            Could not load tags
            
            
              Nothing to show
            
              
  
    
    {{ refName }}
    default
  
            
                
      Loading
              
            
      
      
        ...
      
head repository: postgresql-cfbot/postgresql
        Failed to load repositories. Confirm that selected head ref is valid, then try again.
      
      
        
      Loading
      
  compare: cf/5930
Could not load branches
            
              
      Nothing to show
            
                
      Loading
              
            Could not load tags
            
            
              Nothing to show
            
              
  
    
    {{ refName }}
    default
  
            
                
      Loading
              
            - 4 commits
- 8 files changed
- 2 contributors
Commits on Oct 29, 2025
- 
  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. Discussion: https://postgr.es/m/[email protected] Configuration menu - View commit details
- 
    
    
    Copy full SHA for 29b8401 
- Browse repository at this point
 Copy the full SHA 29b8401View commit details 
- 
  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. Discussion: https://postgr.es/m/[email protected] Configuration menu - View commit details
- 
    
    
    Copy full SHA for 0462de0 
- Browse repository at this point
 Copy the full SHA 0462de0View commit details 
- 
  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. Discussion: https://postgr.es/m/[email protected] Configuration menu - View commit details
- 
    
    
    Copy full SHA for 6b981d4 
- Browse repository at this point
 Copy the full SHA 6b981d4View commit details 
- 
  [CF 5930] v2 - 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 committedOct 29, 2025 Configuration menu - View commit details
- 
    
    
    Copy full SHA for ff13af0 
- Browse repository at this point
 Copy the full SHA ff13af0View commit details 
        
      Loading
      
      This comparison is taking too long to generate.
Unfortunately it looks like we can’t render this comparison for you right now. It might be too big, or there might be something weird with your repository.
            You can try running this command locally to see the comparison on your machine: 
            git diff cf/5930~1...cf/5930