Re: Proposal: casts row to array and array to row

Поиск
Список
Период
Сортировка
От Merlin Moncure
Тема Re: Proposal: casts row to array and array to row
Дата
Msg-id CAHyXU0wyjO2jABb0st-Uwro4eOGXw=32XPKC2CSWke9No7ZKCQ@mail.gmail.com
обсуждение исходный текст
Ответ на Re: Proposal: casts row to array and array to row  (Pavel Stehule <pavel.stehule@gmail.com>)
Ответы Re: Proposal: casts row to array and array to row
Список pgsql-hackers
On Tue, Oct 11, 2011 at 8:18 AM, Pavel Stehule <pavel.stehule@gmail.com> wrote:
> 2011/10/11 Merlin Moncure <mmoncure@gmail.com>:
>> On Tue, Oct 11, 2011 at 3:40 AM, Pavel Stehule <pavel.stehule@gmail.com> wrote:
>>> Hello
>>>
>>> A current limits of dynamic work with row types in PL/pgSQL can be
>>> decreased with a possible casts between rows and arrays. Now we have a
>>> lot of tools for arrays, and these tools should be used for rows too.
>>>
>>> postgres=# \d mypoint
>>> Composite type "public.mypoint"
>>>  Column │  Type   │ Modifiers
>>> ────────┼─────────┼───────────
>>>  a      │ integer │
>>>  b      │ integer │
>>>
>>> postgres=# select cast(rmypoint '(10,20) as int[]);
>>>   array
>>> ────────────
>>>  {10,20}
>>> (1 row)
>>>
>>> postgres=# select cast(ARRAY[10,20] AS mypoint);
>>>  mypoint
>>> ─────────
>>>  (10,20)
>>> (1 row)
>>>
>>> What do you think about this idea?
>>
>> Not sure what it buys you over the syntax we already have:
>>
>> select row(foo[1], bar[2]);
>> select array[(bar).a, (bar).b];
>
> You can do it manually for known combinations of rowtype and
> arraytype. But proposed casts do it generally - what has sense mainly
> for plpgsql functions or some sql functions.
>
>>
>> Also, in my coding of composite types, homogeneously typed rows don't
>> really come up that often...
>
> you can use everywhere text type.
>
> When I wrote
http://stackoverflow.com/questions/7711432/how-to-set-value-of-composite-variable-field-using-dynamic-sql/7722575#7722575
> then I had to do lot of string operations. Proposed casts
> significantly do this simply - and it is enought general for general
> usage.

How does your approach compare to hstore?  hstore to me is just
enhanced generic container type which supports the operations you are
trying to do.  It can be trivially (as of 9.0) moved in an out of both
arrays and record types:

postgres=# create type foo_t as (a int, b text, c float);
CREATE TYPE

postgres=# select row(1, 'abc', 1.0)::foo_t  #= '"b"=>"def"';?column?
-----------(1,def,1)
(1 row)

merlin


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

Предыдущее
От: David Fetter
Дата:
Сообщение: Re: Range Types - typo + NULL string constructor
Следующее
От: Alexander Korotkov
Дата:
Сообщение: Re: index-only scans