aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2017-05-29 19:29:42 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2017-05-29 19:29:42 -0400
commit68cff231e3a3d0ca9988cf1fde5a3be53235b3bb (patch)
tree75e35bf8b3e66fc9290dd370e3e6190970c8a873 /src
parente45c5be99d08d7bb6708d7bb1dd0f5d99798c6aa (diff)
downloadpostgresql-68cff231e3a3d0ca9988cf1fde5a3be53235b3bb.tar.gz
postgresql-68cff231e3a3d0ca9988cf1fde5a3be53235b3bb.zip
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
Diffstat (limited to 'src')
-rw-r--r--src/backend/utils/adt/jsonfuncs.c17
-rw-r--r--src/test/regress/expected/jsonb.out18
2 files changed, 19 insertions, 16 deletions
diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c
index bfd6cd9cbc5..d7ece68c18d 100644
--- a/src/backend/utils/adt/jsonfuncs.c
+++ b/src/backend/utils/adt/jsonfuncs.c
@@ -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")));
+ }
}
}
diff --git a/src/test/regress/expected/jsonb.out b/src/test/regress/expected/jsonb.out
index f199eb4f709..79547035bde 100644
--- a/src/test/regress/expected/jsonb.out
+++ b/src/test/regress/expected/jsonb.out
@@ -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
--------------------------------------------------------