Make edge-case behavior of jsonb_populate_record match json_populate_record

json_populate_record throws an error if asked to convert a JSON scalar
or array into a composite type.  jsonb_populate_record was returning
a record full of NULL fields instead.  It seems better to make it
throw an error for this case as well.

Nikita Glukhov

Discussion: https://postgr.es/m/fbd1d566-bba0-a3de-d6d0-d3b1d7c24ff2@postgrespro.ru
This commit is contained in:
Tom Lane 2017-05-29 19:29:42 -04:00
parent e45c5be99d
commit 68cff231e3
2 changed files with 19 additions and 16 deletions

View File

@ -2682,9 +2682,24 @@ JsValueToJsObject(JsValue *jsv, JsObject *jso)
if (jbv->type == jbvBinary &&
JsonContainerIsObject(jbv->val.binary.data))
{
jso->val.jsonb_cont = jbv->val.binary.data;
}
else
jso->val.jsonb_cont = NULL;
{
bool is_scalar;
is_scalar = IsAJsonbScalar(jbv) ||
(jbv->type == jbvBinary &&
JsonContainerIsScalar(jbv->val.binary.data));
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
is_scalar
? errmsg("cannot call %s on a scalar",
"populate_composite")
: errmsg("cannot call %s on an array",
"populate_composite")));
}
}
}

View File

@ -2276,17 +2276,9 @@ SELECT jsa FROM jsonb_populate_record(NULL::jsbrec, '{"jsa": ["aaa", null, [1, 2
(1 row)
SELECT rec FROM jsonb_populate_record(NULL::jsbrec, '{"rec": 123}') q;
rec
------
(,,)
(1 row)
ERROR: cannot call populate_composite on a scalar
SELECT rec FROM jsonb_populate_record(NULL::jsbrec, '{"rec": [1, 2]}') q;
rec
------
(,,)
(1 row)
ERROR: cannot call populate_composite on an array
SELECT rec FROM jsonb_populate_record(NULL::jsbrec, '{"rec": {"a": "abc", "c": "01.02.2003", "x": 43.2}}') q;
rec
-----------------------------------
@ -2303,11 +2295,7 @@ SELECT reca FROM jsonb_populate_record(NULL::jsbrec, '{"reca": 123}') q;
ERROR: expected json array
HINT: see the value of key "reca"
SELECT reca FROM jsonb_populate_record(NULL::jsbrec, '{"reca": [1, 2]}') q;
reca
-----------------
{"(,,)","(,,)"}
(1 row)
ERROR: cannot call populate_composite on a scalar
SELECT reca FROM jsonb_populate_record(NULL::jsbrec, '{"reca": [{"a": "abc", "b": 456}, null, {"c": "01.02.2003", "x": 43.2}]}') q;
reca
--------------------------------------------------------