by the way - this feature is undocumented - I though so only value used as type holder is not used.
Should be documented better, - if I understand - it is base stone for implementation #= hstore operator
some nice example
postgres=# select json_populate_record('(10,20)'::pt, '{"a":30}');
json_populate_record
----------------------
(30,20)
(1 row)
a mentioned bug is corner case - bugfix is simple
diff --git a/src/backend/utils/adt/jsonfuncs.c b/src/backend/utils/adt/jsonfuncs.c
new file mode 100644
index a8cdeaa..6e83f78
*** a/src/backend/utils/adt/jsonfuncs.c
--- b/src/backend/utils/adt/jsonfuncs.c
*************** populate_record_worker(FunctionCallInfo
*** 2114,2119 ****
--- 2114,2122 ----
*/
if (hash_get_num_entries(json_hash) == 0 && rec)
{
+ if (have_record_arg)
+ ReleaseTupleDesc(tupdesc);
+
hash_destroy(json_hash);
PG_RETURN_POINTER(rec);
}