diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c index 6649e7b7feb..3020a628443 100644 --- a/src/backend/utils/adt/jsonfuncs.c +++ b/src/backend/utils/adt/jsonfuncs.c @@ -4548,9 +4548,11 @@ jsonb_set_lax(PG_FUNCTION_ARGS) newval = DirectFunctionCall1(jsonb_in, CStringGetDatum("null")); - fcinfo->args[2].value = newval; - fcinfo->args[2].isnull = false; - return jsonb_set(fcinfo); + return DirectFunctionCall4(jsonb_set, + PG_GETARG_DATUM(0), + PG_GETARG_DATUM(1), + newval, + PG_GETARG_DATUM(3)); } else if (strcmp(handle_val, "delete_key") == 0) { diff --git a/src/test/regress/expected/jsonb.out b/src/test/regress/expected/jsonb.out index 42c0d69c6e9..15b18f06c95 100644 --- a/src/test/regress/expected/jsonb.out +++ b/src/test/regress/expected/jsonb.out @@ -4674,6 +4674,34 @@ select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, null_value_treatment => 'use_ {"a": 1, "b": null} (1 row) +-- multi-row cases with a constant NULL new_value +select jsonb_set_lax(j, '{a}', null, true, t) +from (values ('{"a":1}'::jsonb, 'use_json_null'), + ('{"a":1}'::jsonb, 'delete_key')) v(j, t); + jsonb_set_lax +--------------- + {"a": null} + {} +(2 rows) + +select jsonb_set_lax(j, '{a}', null, true, t) +from (values ('{"a":1}'::jsonb, 'use_json_null'), + ('{"a":1}'::jsonb, 'return_target')) v(j, t); + jsonb_set_lax +--------------- + {"a": null} + {"a": 1} +(2 rows) + +select jsonb_set_lax(j, '{a}', null) +from (values ('{"a":1}'::jsonb), ('{"a":2}'::jsonb), ('{"a":3}'::jsonb)) v(j); + jsonb_set_lax +--------------- + {"a": null} + {"a": null} + {"a": null} +(3 rows) + \pset null '' -- jsonb_insert select jsonb_insert('{"a": [0,1,2]}', '{a, 1}', '"new_value"'); diff --git a/src/test/regress/sql/jsonb.sql b/src/test/regress/sql/jsonb.sql index e47f0796457..9b56c33b1ec 100644 --- a/src/test/regress/sql/jsonb.sql +++ b/src/test/regress/sql/jsonb.sql @@ -1212,6 +1212,16 @@ select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, null_value_treatment => 'retu select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, null_value_treatment => 'delete_key') as delete_key; select jsonb_set_lax('{"a":1,"b":2}', '{b}', null, null_value_treatment => 'use_json_null') as use_json_null; +-- multi-row cases with a constant NULL new_value +select jsonb_set_lax(j, '{a}', null, true, t) +from (values ('{"a":1}'::jsonb, 'use_json_null'), + ('{"a":1}'::jsonb, 'delete_key')) v(j, t); +select jsonb_set_lax(j, '{a}', null, true, t) +from (values ('{"a":1}'::jsonb, 'use_json_null'), + ('{"a":1}'::jsonb, 'return_target')) v(j, t); +select jsonb_set_lax(j, '{a}', null) +from (values ('{"a":1}'::jsonb), ('{"a":2}'::jsonb), ('{"a":3}'::jsonb)) v(j); + \pset null '' -- jsonb_insert