]> granicus.if.org Git - postgresql/commitdiff
Fix two-argument jsonb_object when called with empty arrays
authorAndrew Dunstan <andrew@dunslane.net>
Sun, 21 Feb 2016 15:30:49 +0000 (10:30 -0500)
committerAndrew Dunstan <andrew@dunslane.net>
Sun, 21 Feb 2016 15:30:49 +0000 (10:30 -0500)
Some over-eager copy-and-pasting on my part resulted in a nonsense
result being returned in this case. I have adopted the same pattern for
handling this case as is used in the one argument form of the function,
i.e. we just skip over the code that adds values to the object.

Diagnosis and patch from Michael Paquier, although not quite his
solution.

Fixes bug #13936.

Backpatch to 9.5 where jsonb_object was introduced.

src/backend/utils/adt/jsonb.c
src/test/regress/expected/json.out
src/test/regress/expected/jsonb.out
src/test/regress/sql/json.sql
src/test/regress/sql/jsonb.sql

index 9151a13e3ce8cdac5e7b9fa3288864d4acc67bb1..256ef80ecec116212220124ca2e3d8cdd086cdc7 100644 (file)
@@ -1455,7 +1455,7 @@ jsonb_object_two_arg(PG_FUNCTION_ARGS)
                                 errmsg("wrong number of array subscripts")));
 
        if (nkdims == 0)
-               PG_RETURN_DATUM(CStringGetTextDatum("{}"));
+               goto close_object;
 
        deconstruct_array(key_array,
                                          TEXTOID, -1, false, 'i',
@@ -1509,13 +1509,14 @@ jsonb_object_two_arg(PG_FUNCTION_ARGS)
                (void) pushJsonbValue(&result.parseState, WJB_VALUE, &v);
        }
 
-       result.res = pushJsonbValue(&result.parseState, WJB_END_OBJECT, NULL);
-
        pfree(key_datums);
        pfree(key_nulls);
        pfree(val_datums);
        pfree(val_nulls);
 
+close_object:
+       result.res = pushJsonbValue(&result.parseState, WJB_END_OBJECT, NULL);
+
        PG_RETURN_POINTER(JsonbValueToJsonb(result.res));
 }
 
index 0ced17e13064207bfe3462eef3b2e3edf3febc52..502f9838897344fc916c9d02cf554ea330a431db 100644 (file)
@@ -1510,6 +1510,20 @@ INSERT INTO foo VALUES (999999, NULL, 'bar');
 SELECT json_object_agg(name, type) FROM foo;
 ERROR:  field name must not be null
 -- json_object
+-- empty object, one dimension
+SELECT json_object('{}');
+ json_object 
+-------------
+ {}
+(1 row)
+
+-- empty object, two dimensions
+SELECT json_object('{}', '{}');
+ json_object 
+-------------
+ {}
+(1 row)
+
 -- one dimension
 SELECT json_object('{a,1,b,2,3,NULL,"d e f","a b c"}');
                       json_object                      
index 72fe808734c7262301e6f499b6eca5e286832883..4789e4e57b9e2a87908c28eb663ffc4d4dc3b419 100644 (file)
@@ -1410,6 +1410,20 @@ INSERT INTO foo VALUES (999999, NULL, 'bar');
 SELECT jsonb_object_agg(name, type) FROM foo;
 ERROR:  field name must not be null
 -- jsonb_object
+-- empty object, one dimension
+SELECT jsonb_object('{}');
+ jsonb_object 
+--------------
+ {}
+(1 row)
+
+-- empty object, two dimensions
+SELECT jsonb_object('{}', '{}');
+ jsonb_object 
+--------------
+ {}
+(1 row)
+
 -- one dimension
 SELECT jsonb_object('{a,1,b,2,3,NULL,"d e f","a b c"}');
                    jsonb_object                    
index 0d2c139b4d104a03c99d6f754b51a3d2ef74f1ce..39f1b70f4da10bb8ff47941d4f720e71d23f6f7f 100644 (file)
@@ -462,6 +462,12 @@ SELECT json_object_agg(name, type) FROM foo;
 
 -- json_object
 
+-- empty object, one dimension
+SELECT json_object('{}');
+
+-- empty object, two dimensions
+SELECT json_object('{}', '{}');
+
 -- one dimension
 SELECT json_object('{a,1,b,2,3,NULL,"d e f","a b c"}');
 
index b724f0ab1f70c45f0f34c55be3f06da06e07defd..4b24477609505c06061d4bbcfcbab3cb673986d4 100644 (file)
@@ -352,6 +352,12 @@ SELECT jsonb_object_agg(name, type) FROM foo;
 
 -- jsonb_object
 
+-- empty object, one dimension
+SELECT jsonb_object('{}');
+
+-- empty object, two dimensions
+SELECT jsonb_object('{}', '{}');
+
 -- one dimension
 SELECT jsonb_object('{a,1,b,2,3,NULL,"d e f","a b c"}');