Re: UPDATE using sub selects

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Gaetano Mendola <mendola(at)bigfoot(dot)com>
Cc: "pgsql-hackers(at)postgresql(dot)org" <pgsql-hackers(at)postgresql(dot)org>, NikhilS <nikkhils(at)gmail(dot)com>
Subject: Re: UPDATE using sub selects
Date: 2007-03-16 02:36:38
Message-ID: 29844.1174012598@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

Gaetano Mendola <mendola(at)bigfoot(dot)com> writes:
> NikhilS wrote:
>> I have tried some update-subselect variations and they seem to work. For
>> example the case in the src/test/regress/sql/update.sql, which used to
>> fail till now, seems to work:
>>
>> UPDATE update_test SET (a,b) = (select a,b FROM update_test where c =
>> 'foo')
>> WHERE a = 10;

> What's the expected result if the tuple from subselect is more than 1?

Error, per SQL99 section 7.14:

1) If the cardinality of a <row subquery> is greater than 1 (one),
then an exception condition is raised: cardinality violation.

> I expect no update at all in case of void result set, is this the case ?

No, you get nulls; it's a subquery not a join. Per SQL99 7.1:

c) If the <row value constructor> is a <row subquery>, then:

i) Let R be the result of the <row subquery> and let D be the
degree of R.

ii) If the cardinality of R is 0 (zero), then the result of the
<row value constructor> is D null values.

iii) If the cardinality of R is 1 (one), then the result of the
<row value constructor> is R.

regards, tom lane

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Robert Treat 2007-03-16 03:03:13 Re: tsearch_core for inclusion
Previous Message Jan Wieck 2007-03-16 02:14:53 As proposed the complete changes to pg_trigger and pg_rewrite