Re: json function question

Поиск
Список
Период
Сортировка
От David G. Johnston
Тема Re: json function question
Дата
Msg-id CAKFQuwYEzHF+ZEB954ir_xrBRG6F1AC+UBw0H4J_joKkchzUNQ@mail.gmail.com
обсуждение исходный текст
Ответ на Re: json function question  (Tom Lane <tgl@sss.pgh.pa.us>)
Ответы Re: json function question  (Dan S <strd911@gmail.com>)
Список pgsql-general
On Tue, Feb 23, 2016 at 12:54 PM, Tom Lane <tgl@sss.pgh.pa.us> wrote:
Dan S <strd911@gmail.com> writes:
> I have this table, data and query:

> create table test
> (
>     id int,
>     txt text,
>     txt_arr text[],
>     f float
> );

> insert into test
> values
> (1,'jkl','{abc,def,fgh}',3.14159),(2,'hij','{abc,def,fgh}',3.14159),(2,null,null,null),(3,'def',null,0);

> select j, json_populate_record(null::test, j)
> from
> (
>     select to_json(t) as j from test t
> ) r;

> ERROR:  malformed array literal: "["abc","def","fgh"]"
> DETAIL:  "[" must introduce explicitly-specified array dimensions.

> Is it a bug or how am I supposed to use the populate function ?

AFAICS, json_populate_record has no intelligence about nested container
situations.  It'll basically just push the JSON text representation of any
field of the top-level object at the input converter for the corresponding
composite-type column.  That doesn't work if you're trying to convert a
JSON array to a Postgres array, and it wouldn't work for sub-object to
composite column either, because of syntax discrepancies.

Ideally this would work for arbitrarily-deeply-nested array+record
structures, but it looks like a less than trivial amount of work to make
that happen.

> If I try an equivalent example with hstore it works well.

hstore hasn't got any concept of substructure in its field values, so
it's hard to see how you'd create an "equivalent" situation.

​Equivalent in the "ability to round-trip" sense.  Since hstore doesn't have nested containers internal serialization of a record to hstore is forced to "stringify" the array which can then be fed back in as-is.  But the [row_]to_json​
 
​logic converts the PostgreSQL arrays to JSON arrays and then we fail to handle them on the return portion of the trip.

Arrays are likely to be a much for common scenario but I agree that dealing with arbitrary depths and objects would make the feature complete.

And yes, back-patching should only occur (and ideally behavior changing) for situations that today raise errors - as the example does.

​David J.

В списке pgsql-general по дате отправления:

Предыдущее
От: Bala Venkat
Дата:
Сообщение: Perfomance issue. statement in the log file..
Следующее
От: Roxanne Reid-Bennett
Дата:
Сообщение: Re: Perfomance issue. statement in the log file..