]> granicus.if.org Git - postgresql/commitdiff
Make edge-case behavior of jsonb_populate_record match json_populate_record
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 29 May 2017 23:29:42 +0000 (19:29 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 29 May 2017 23:29:42 +0000 (19:29 -0400)
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

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

index bfd6cd9cbc5474e86b83754a776028e810db361a..d7ece68c18d2c038fc20c6b1add7424312836e7e 100644 (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")));
+               }
        }
 }
 
index f199eb4f70957e78474f5e5873b15e57ce4f5be6..79547035bde98361004924d31b2456f22ff6b70a 100644 (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                          
 --------------------------------------------------------