Re: Cannot assign ROWTYPE, RECORD variables in PL/pgSQL

Поиск
Список
Период
Сортировка
От elein
Тема Re: Cannot assign ROWTYPE, RECORD variables in PL/pgSQL
Дата
Msg-id 200211080211.gA82BQDq214174@pimout3-ext.prodigy.net
обсуждение исходный текст
Ответ на Re: Cannot assign ROWTYPE, RECORD variables in PL/pgSQL  (Neil Conway <neilc@samurai.com>)
Список pgsql-bugs
Deep copy with User defined data types sometimes get a little=20
wild, possibly with alignment and memory context.  For example=20
a UDT which is a char followed by an int might be tricky to recognize
that alignment might be needed.  It might even be better to  have=20
the UDT writer write their own deep copy function if their type=20
is not compatible with a straight memcpy.

One of the other reasons this was a real PITB at informix was that=20
columns could also contain row (composite) types.  We do not=20
have that feature (yet?), but if deep copy is done in a type=20
blind way which is open to adding recursion we would not shut=20
the door on the possibility.  Tables have rows which have columns
containing rows which have columns containing udts and rows....

However, I suspect that postgresql row handling is a lot cleaner than
the informix row handling (with or without rows as columns) and it=20
has been a while since I looked at the problem so maybe it is a=20
non-issue.  But I'm raising it just in case...

elein


On Thursday 07 November 2002 13:56, Neil Conway wrote:
> Josh Berkus <josh@agliodbs.com> writes:
> > create or replace function rowtype_test ()
> > returns text as '
> > declare this_row candidates%rowtype;
> >     that_row candidates%rowtype;
> > begin
> > select * into this_row
> > from candidates;
> >
> > that_row :=3D this_row;
> >
> > return that_row.first_name;
> >
> > end;'
> > language 'plpgsql';
> > =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
> >
> > ... it will error out at the assignment "that_row :=3D this_row".
>
> So we'd want a deep copy, right?
>
> > The only way to populate that_row with a copy of this_row is by
> > re-querying the source table.
>
> Well, you can also iterate through the fields of this_row and assign
> them to that_row manually -- of course, that's not much better.
>
> > While a relatively easy workaround, this behaviour is annoying and
> > inconsistent.  It would be nice to fix in 7.3.1 or 7.4.
>
> Unless anyone sees a problem with this, I'll work on this. I
> definately think it's inappropriate for 7.3.1 though.
>
> Cheers,
>
> Neil

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

Предыдущее
От: "Josh Berkus"
Дата:
Сообщение: Re: Cannot assign ROWTYPE, RECORD variables in PL/pgSQL
Следующее
От: Fabien Fischer
Дата:
Сообщение: I can't start postgres anymore