typedef struct JsonbAggState
  {
 -   JsonbInState      *res;
 -   JsonbTypeCategory  key_category;
 -   Oid                key_output_func;
 -   JsonbTypeCategory  val_category;
 -   Oid                val_output_func;
 +   JsonbInState *res;
 +   JsonbTypeCategory key_category;
 +   Oid         key_output_func;
 +   JsonbTypeCategory val_category;
 +   Oid         val_output_func;
  } JsonbAggState;
  
  static inline Datum jsonb_from_cstring(char *json, int len);
   
     check_stack_depth();
  
 +   /* Convert val to a JsonbValue in jb (in most cases) */
     if (is_null)
     {
         Assert(!key_scalar);
                  break;
         }
     }
 -   if (tcategory >= JSONBTYPE_JSON && tcategory <= JSONBTYPE_JSONCAST &&
 -       !scalar_jsonb)
 +
 +   /* Now insert jb into result, unless we did it recursively */
 +   if (!is_null && !scalar_jsonb &&
 +       tcategory >= JSONBTYPE_JSON && tcategory <= JSONBTYPE_JSONCAST)
     {
         /* work has been done recursively */
         return;
   
     if (PG_ARGISNULL(0))
     {
 -
 -       Oid         arg_type = get_fn_expr_argtype(fcinfo->flinfo, 1);
 +       Oid         arg_type = get_fn_expr_argtype(fcinfo->flinfo, 1);
  
         if (arg_type == InvalidOid)
             ereport(ERROR,
   
     if (PG_ARGISNULL(0))
     {
 -       Oid         arg_type;
 +       Oid         arg_type;
  
         oldcontext = MemoryContextSwitchTo(aggcontext);
         state = palloc(sizeof(JsonbAggState));
      /*
      * We need to do a shallow clone of the argument's res field in case the
      * final function is called more than once, so we avoid changing the
 -    * it. A shallow clone is sufficient as we aren't going to change any of
 -    * the values, just add the final object end marker.
 +    * aggregate state value.  A shallow clone is sufficient as we aren't
 +    * going to change any of the values, just add the final object end
 +    * marker.
      */
  
     result.parseState = clone_parse_state(arg->res->parseState);
          ERROR:  key value must be scalar, not array, composite or json
  SELECT jsonb_build_object('{1,2,3}'::int[], 3);
  ERROR:  key value must be scalar, not array, composite or json
 +-- handling of NULL values
 +SELECT jsonb_object_agg(1, NULL::jsonb);
 + jsonb_object_agg 
 +------------------
 + {"1": null}
 +(1 row)
 +
 +SELECT jsonb_object_agg(NULL, '{"a":1}');
 +ERROR:  field name must not be null
  CREATE TEMP TABLE foo (serial_num int, name text, type text);
  INSERT INTO foo VALUES (847001,'t15','GE1043');
  INSERT INTO foo VALUES (847002,'t16','GE1043');
          
  SELECT jsonb_build_object('{1,2,3}'::int[], 3);
  
 +-- handling of NULL values
 +SELECT jsonb_object_agg(1, NULL::jsonb);
 +SELECT jsonb_object_agg(NULL, '{"a":1}');
 +
  CREATE TEMP TABLE foo (serial_num int, name text, type text);
  INSERT INTO foo VALUES (847001,'t15','GE1043');
  INSERT INTO foo VALUES (847002,'t16','GE1043');