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);
                }




2015-02-23 18:27 GMT+01:00 Pavel Stehule <pavel.steh...@gmail.com>:

> Hi
>
> When I tested json_populate_function in test
> http://stackoverflow.com/questions/7711432/how-to-set-value-of-composite-variable-field-using-dynamic-sql/28673097#28673097
> I found a small issue
>
> create type pt as (a int, b int);
>
> postgres=# select json_populate_record('(10,20)'::pt, '{}');
> WARNING:  TupleDesc reference leak: TupleDesc 0x7f10fcf41400 (567018,-1)
> still referenced
>  json_populate_record
> ----------------------
>  (10,20)
> (1 row)
>
> jsonb is ok
>
> postgres=# select jsonb_populate_record('(10,20)'::pt, '{}');
>  jsonb_populate_record
> -----------------------
>  (10,20)
> (1 row)
>
> Regards
>
> Pavel
>
>

Reply via email to