mirror of
https://github.com/postgres/postgres.git
synced 2025-05-06 19:59:18 +03:00
Fix two-argument jsonb_object when called with empty arrays
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.
This commit is contained in:
parent
a397f8268a
commit
68d68ff833
@ -1455,7 +1455,7 @@ jsonb_object_two_arg(PG_FUNCTION_ARGS)
|
|||||||
errmsg("wrong number of array subscripts")));
|
errmsg("wrong number of array subscripts")));
|
||||||
|
|
||||||
if (nkdims == 0)
|
if (nkdims == 0)
|
||||||
PG_RETURN_DATUM(CStringGetTextDatum("{}"));
|
goto close_object;
|
||||||
|
|
||||||
deconstruct_array(key_array,
|
deconstruct_array(key_array,
|
||||||
TEXTOID, -1, false, 'i',
|
TEXTOID, -1, false, 'i',
|
||||||
@ -1509,13 +1509,14 @@ jsonb_object_two_arg(PG_FUNCTION_ARGS)
|
|||||||
(void) pushJsonbValue(&result.parseState, WJB_VALUE, &v);
|
(void) pushJsonbValue(&result.parseState, WJB_VALUE, &v);
|
||||||
}
|
}
|
||||||
|
|
||||||
result.res = pushJsonbValue(&result.parseState, WJB_END_OBJECT, NULL);
|
|
||||||
|
|
||||||
pfree(key_datums);
|
pfree(key_datums);
|
||||||
pfree(key_nulls);
|
pfree(key_nulls);
|
||||||
pfree(val_datums);
|
pfree(val_datums);
|
||||||
pfree(val_nulls);
|
pfree(val_nulls);
|
||||||
|
|
||||||
|
close_object:
|
||||||
|
result.res = pushJsonbValue(&result.parseState, WJB_END_OBJECT, NULL);
|
||||||
|
|
||||||
PG_RETURN_POINTER(JsonbValueToJsonb(result.res));
|
PG_RETURN_POINTER(JsonbValueToJsonb(result.res));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1510,6 +1510,20 @@ INSERT INTO foo VALUES (999999, NULL, 'bar');
|
|||||||
SELECT json_object_agg(name, type) FROM foo;
|
SELECT json_object_agg(name, type) FROM foo;
|
||||||
ERROR: field name must not be null
|
ERROR: field name must not be null
|
||||||
-- json_object
|
-- 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
|
-- one dimension
|
||||||
SELECT json_object('{a,1,b,2,3,NULL,"d e f","a b c"}');
|
SELECT json_object('{a,1,b,2,3,NULL,"d e f","a b c"}');
|
||||||
json_object
|
json_object
|
||||||
|
@ -1410,6 +1410,20 @@ INSERT INTO foo VALUES (999999, NULL, 'bar');
|
|||||||
SELECT jsonb_object_agg(name, type) FROM foo;
|
SELECT jsonb_object_agg(name, type) FROM foo;
|
||||||
ERROR: field name must not be null
|
ERROR: field name must not be null
|
||||||
-- jsonb_object
|
-- 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
|
-- one dimension
|
||||||
SELECT jsonb_object('{a,1,b,2,3,NULL,"d e f","a b c"}');
|
SELECT jsonb_object('{a,1,b,2,3,NULL,"d e f","a b c"}');
|
||||||
jsonb_object
|
jsonb_object
|
||||||
|
@ -462,6 +462,12 @@ SELECT json_object_agg(name, type) FROM foo;
|
|||||||
|
|
||||||
-- json_object
|
-- json_object
|
||||||
|
|
||||||
|
-- empty object, one dimension
|
||||||
|
SELECT json_object('{}');
|
||||||
|
|
||||||
|
-- empty object, two dimensions
|
||||||
|
SELECT json_object('{}', '{}');
|
||||||
|
|
||||||
-- one dimension
|
-- one dimension
|
||||||
SELECT json_object('{a,1,b,2,3,NULL,"d e f","a b c"}');
|
SELECT json_object('{a,1,b,2,3,NULL,"d e f","a b c"}');
|
||||||
|
|
||||||
|
@ -352,6 +352,12 @@ SELECT jsonb_object_agg(name, type) FROM foo;
|
|||||||
|
|
||||||
-- jsonb_object
|
-- jsonb_object
|
||||||
|
|
||||||
|
-- empty object, one dimension
|
||||||
|
SELECT jsonb_object('{}');
|
||||||
|
|
||||||
|
-- empty object, two dimensions
|
||||||
|
SELECT jsonb_object('{}', '{}');
|
||||||
|
|
||||||
-- one dimension
|
-- one dimension
|
||||||
SELECT jsonb_object('{a,1,b,2,3,NULL,"d e f","a b c"}');
|
SELECT jsonb_object('{a,1,b,2,3,NULL,"d e f","a b c"}');
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user