Re: comparing NEW and OLD (any good this way?)

From: Sam Mason <sam(at)samason(dot)me(dot)uk>
To: pgsql-general(at)postgresql(dot)org
Subject: Re: comparing NEW and OLD (any good this way?)
Date: 2009-08-13 15:22:11
Message-ID: 20090813152211.GB5407@samason.me.uk
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

On Wed, Aug 12, 2009 at 10:57:54PM +0200, Daniel Verite wrote:
> It seems to me that there is something special with rows: in tables, the
> values of columns may be null or not, but at the level of the row, there is
> no information that would say: this row itself as an object is null.

Hum, there seem to be lots of different things happening here--lets try
and untangle them a bit. I would say that the following returns a null
value of type row (actually a pair of integers):

SELECT b
FROM (SELECT 1) a
LEFT JOIN (SELECT 1,2) b(b1,b2) ON FALSE;

It currently gets serialized as '\N' in the output of psql for me, but
I'd have no problem if it appeared as '(,)'. Both of these seem like
valid representations of a null row to me.

In other discussions about similar issues I've said that the expression:

ROW(NULL,NULL) IS DISTINCT FROM NULL

should evaluate to FALSE. I still think this is correct and generally
useful behavior.

> Anyway, let's try to assign null to a row variable (with 8.4.0):
>
> CREATE TABLE our_table(i int);
>
> CREATE FUNCTION test() returns void as $$
> declare
> r our_table;
> begin
> r:=null;
> end;
> $$ LANGUAGE plpgsql;
>
> SELECT test() yields:
> ERROR: cannot assign non-composite value to a row variable
> CONTEXT: PL/pgSQL function "test" line 4 at assignment

This just looks like PG missing a feature. plpgsql has much less user
and developer time spent on it, so I'd expect to find more strangeness
in darker corners like this.

> As a follow-up to the comparison between rows and arrays, note that if we'd
> make r an int[], there would be no error.

OK, maybe people just do this more often and hence there's been a reason
to make it work.

> However, I agree that if we consider that a row is a composite type, then
> there is a problem because we sure can insert NULL into a column that is of a
> composite type. So the "row cannot be null" line of reasoning holds only so
> far as you don't stuff rows into columns :)

When you say "columns", do you mean the value associated with a
particular attribute in a particular row of a particular table? Surely
this is a normal value and just because it happens to be stored in a
table it shouldn't be any different from any other value anywhere else
in PG.

--
Sam http://samason.me.uk/

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Scara Maccai 2009-08-13 15:25:43 Re: totally different plan when using partitions
Previous Message Durumdara 2009-08-13 15:20:22 Can I get Field informations from system tables?