mirror of https://github.com/postgres/postgres
parent
e1992ebaf2
commit
51175d1d00
@ -1,512 +0,0 @@ |
||||
From pgsql-hackers-owner+M15878=candle.pha.pa.us=pgman@postgresql.org Mon Nov 26 18:35:28 2001 |
||||
Return-path: <pgsql-hackers-owner+M15878=candle.pha.pa.us=pgman@postgresql.org> |
||||
Received: from rs.postgresql.org (server1.pgsql.org [64.39.15.238] (may be forged)) |
||||
by candle.pha.pa.us (8.11.6/8.10.1) with ESMTP id fAQNZRf08314 |
||||
for <pgman@candle.pha.pa.us>; Mon, 26 Nov 2001 18:35:28 -0500 (EST) |
||||
Received: from postgresql.org (postgresql.org [64.49.215.8]) |
||||
by rs.postgresql.org (8.11.6/8.11.6) with ESMTP id fAQNXtR48254 |
||||
for <pgman@candle.pha.pa.us>; Mon, 26 Nov 2001 17:34:22 -0600 (CST) |
||||
(envelope-from pgsql-hackers-owner+M15878=candle.pha.pa.us=pgman@postgresql.org) |
||||
Received: from sss.pgh.pa.us ([192.204.191.242]) |
||||
by postgresql.org (8.11.3/8.11.4) with ESMTP id fAQNSam38109 |
||||
for <pgsql-hackers@postgresql.org>; Mon, 26 Nov 2001 18:28:36 -0500 (EST) |
||||
(envelope-from tgl@sss.pgh.pa.us) |
||||
Received: from sss2.sss.pgh.pa.us (tgl@localhost [127.0.0.1]) |
||||
by sss.pgh.pa.us (8.11.4/8.11.4) with ESMTP id fAQNSIk16033; |
||||
Mon, 26 Nov 2001 18:28:18 -0500 (EST) |
||||
To: Bruce Momjian <pgman@candle.pha.pa.us> |
||||
cc: Philip Warner <pjw@rhyme.com.au>, pgsql-hackers@postgresql.org |
||||
Subject: Re: [HACKERS] Minor buglet in update...from (I think) |
||||
In-Reply-To: <200111262022.fAQKMtj16709@candle.pha.pa.us> |
||||
References: <200111262022.fAQKMtj16709@candle.pha.pa.us> |
||||
Comments: In-reply-to Bruce Momjian <pgman@candle.pha.pa.us> |
||||
message dated "Mon, 26 Nov 2001 15:22:55 -0500" |
||||
Date: Mon, 26 Nov 2001 18:28:17 -0500 |
||||
Message-ID: <16030.1006817297@sss.pgh.pa.us> |
||||
From: Tom Lane <tgl@sss.pgh.pa.us> |
||||
Precedence: bulk |
||||
Sender: pgsql-hackers-owner@postgresql.org |
||||
Status: ORr |
||||
|
||||
Bruce Momjian <pgman@candle.pha.pa.us> writes: |
||||
> Can anyone explain this failure? It still exists in CVS. |
||||
|
||||
>> update t1 set f2=count(*) from t2 where t1.f1=2 and t2.f1=t1.f1 ; |
||||
>> ERROR: ExecutePlan: (junk) `ctid' is NULL! |
||||
|
||||
As I recall, discussion about fixing that problem trailed off because |
||||
no one could explain what an aggregate means in UPDATE. My thought |
||||
is we should probably forbid the construct entirely (SQL does). |
||||
See previous discussion around 7/7/00. |
||||
|
||||
regards, tom lane |
||||
|
||||
---------------------------(end of broadcast)--------------------------- |
||||
TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org |
||||
|
||||
From tgl@sss.pgh.pa.us Mon Nov 26 19:28:31 2001 |
||||
Return-path: <tgl@sss.pgh.pa.us> |
||||
Received: from sss.pgh.pa.us (root@[192.204.191.242]) |
||||
by candle.pha.pa.us (8.11.6/8.10.1) with ESMTP id fAR0SVf13056 |
||||
for <pgman@candle.pha.pa.us>; Mon, 26 Nov 2001 19:28:31 -0500 (EST) |
||||
Received: from sss2.sss.pgh.pa.us (tgl@localhost [127.0.0.1]) |
||||
by sss.pgh.pa.us (8.11.4/8.11.4) with ESMTP id fAR0SVk16312; |
||||
Mon, 26 Nov 2001 19:28:31 -0500 (EST) |
||||
To: Bruce Momjian <pgman@candle.pha.pa.us> |
||||
cc: Philip Warner <pjw@rhyme.com.au>, pgsql-hackers@postgresql.org |
||||
Subject: Re: [HACKERS] Minor buglet in update...from (I think) |
||||
In-Reply-To: <200111270023.fAR0NHJ12366@candle.pha.pa.us> |
||||
References: <200111270023.fAR0NHJ12366@candle.pha.pa.us> |
||||
Comments: In-reply-to Bruce Momjian <pgman@candle.pha.pa.us> |
||||
message dated "Mon, 26 Nov 2001 19:23:17 -0500" |
||||
Date: Mon, 26 Nov 2001 19:28:31 -0500 |
||||
Message-ID: <16309.1006820911@sss.pgh.pa.us> |
||||
From: Tom Lane <tgl@sss.pgh.pa.us> |
||||
Status: ORr |
||||
|
||||
Bruce Momjian <pgman@candle.pha.pa.us> writes: |
||||
> Oh, so it is the aggregate. What threw me off is that both parts of the |
||||
> WHERE clause are required to cause the failure, |
||||
|
||||
Not necessarily; I think it's got more to do with a null aggregate |
||||
result: |
||||
|
||||
regression=# create table t1 (f1 datetime); |
||||
CREATE |
||||
regression=# create table t2 (f2 datetime); |
||||
CREATE |
||||
regression=# update t2 set f2 = min(f1) from t1; |
||||
ERROR: ExecutePlan: (junk) `ctid' is NULL! |
||||
regression=# insert into t1 values ('now'); |
||||
INSERT 400577 1 |
||||
regression=# update t2 set f2 = min(f1) from t1; |
||||
ERROR: ExecutePlan: (junk) `ctid' is NULL! |
||||
regression=# insert into t2 values ('now'); |
||||
INSERT 400578 1 |
||||
regression=# update t2 set f2 = min(f1) from t1; |
||||
UPDATE 1 |
||||
regression=# |
||||
|
||||
However the ERROR is only one symptom. The real problem is that the |
||||
calculation that's being done is useless/nonsensical. |
||||
|
||||
> I don't see a problem with aggregates in UPDATE, |
||||
|
||||
Think harder ... what is the aggregate being taken over, and how do you |
||||
associate the aggregate's single result row with any particular row in |
||||
the UPDATE's target table? |
||||
|
||||
regards, tom lane |
||||
|
||||
From pgsql-hackers-owner+M15883=candle.pha.pa.us=pgman@postgresql.org Mon Nov 26 19:40:39 2001 |
||||
Return-path: <pgsql-hackers-owner+M15883=candle.pha.pa.us=pgman@postgresql.org> |
||||
Received: from rs.postgresql.org (server1.pgsql.org [64.39.15.238] (may be forged)) |
||||
by candle.pha.pa.us (8.11.6/8.10.1) with ESMTP id fAR0ecf14089 |
||||
for <pgman@candle.pha.pa.us>; Mon, 26 Nov 2001 19:40:38 -0500 (EST) |
||||
Received: from postgresql.org (postgresql.org [64.49.215.8]) |
||||
by rs.postgresql.org (8.11.6/8.11.6) with ESMTP id fAR0YFR49958 |
||||
for <pgman@candle.pha.pa.us>; Mon, 26 Nov 2001 18:37:54 -0600 (CST) |
||||
(envelope-from pgsql-hackers-owner+M15883=candle.pha.pa.us=pgman@postgresql.org) |
||||
Received: from sss.pgh.pa.us ([192.204.191.242]) |
||||
by postgresql.org (8.11.3/8.11.4) with ESMTP id fAR0Sjm40352 |
||||
for <pgsql-hackers@postgresql.org>; Mon, 26 Nov 2001 19:28:45 -0500 (EST) |
||||
(envelope-from tgl@sss.pgh.pa.us) |
||||
Received: from sss2.sss.pgh.pa.us (tgl@localhost [127.0.0.1]) |
||||
by sss.pgh.pa.us (8.11.4/8.11.4) with ESMTP id fAR0SVk16312; |
||||
Mon, 26 Nov 2001 19:28:31 -0500 (EST) |
||||
To: Bruce Momjian <pgman@candle.pha.pa.us> |
||||
cc: Philip Warner <pjw@rhyme.com.au>, pgsql-hackers@postgresql.org |
||||
Subject: Re: [HACKERS] Minor buglet in update...from (I think) |
||||
In-Reply-To: <200111270023.fAR0NHJ12366@candle.pha.pa.us> |
||||
References: <200111270023.fAR0NHJ12366@candle.pha.pa.us> |
||||
Comments: In-reply-to Bruce Momjian <pgman@candle.pha.pa.us> |
||||
message dated "Mon, 26 Nov 2001 19:23:17 -0500" |
||||
Date: Mon, 26 Nov 2001 19:28:31 -0500 |
||||
Message-ID: <16309.1006820911@sss.pgh.pa.us> |
||||
From: Tom Lane <tgl@sss.pgh.pa.us> |
||||
Precedence: bulk |
||||
Sender: pgsql-hackers-owner@postgresql.org |
||||
Status: OR |
||||
|
||||
Bruce Momjian <pgman@candle.pha.pa.us> writes: |
||||
> Oh, so it is the aggregate. What threw me off is that both parts of the |
||||
> WHERE clause are required to cause the failure, |
||||
|
||||
Not necessarily; I think it's got more to do with a null aggregate |
||||
result: |
||||
|
||||
regression=# create table t1 (f1 datetime); |
||||
CREATE |
||||
regression=# create table t2 (f2 datetime); |
||||
CREATE |
||||
regression=# update t2 set f2 = min(f1) from t1; |
||||
ERROR: ExecutePlan: (junk) `ctid' is NULL! |
||||
regression=# insert into t1 values ('now'); |
||||
INSERT 400577 1 |
||||
regression=# update t2 set f2 = min(f1) from t1; |
||||
ERROR: ExecutePlan: (junk) `ctid' is NULL! |
||||
regression=# insert into t2 values ('now'); |
||||
INSERT 400578 1 |
||||
regression=# update t2 set f2 = min(f1) from t1; |
||||
UPDATE 1 |
||||
regression=# |
||||
|
||||
However the ERROR is only one symptom. The real problem is that the |
||||
calculation that's being done is useless/nonsensical. |
||||
|
||||
> I don't see a problem with aggregates in UPDATE, |
||||
|
||||
Think harder ... what is the aggregate being taken over, and how do you |
||||
associate the aggregate's single result row with any particular row in |
||||
the UPDATE's target table? |
||||
|
||||
regards, tom lane |
||||
|
||||
---------------------------(end of broadcast)--------------------------- |
||||
TIP 3: if posting/reading through Usenet, please send an appropriate |
||||
subscribe-nomail command to majordomo@postgresql.org so that your |
||||
message can get through to the mailing list cleanly |
||||
|
||||
From pgsql-hackers-owner+M15884=candle.pha.pa.us=pgman@postgresql.org Mon Nov 26 19:49:23 2001 |
||||
Return-path: <pgsql-hackers-owner+M15884=candle.pha.pa.us=pgman@postgresql.org> |
||||
Received: from rs.postgresql.org (server1.pgsql.org [64.39.15.238] (may be forged)) |
||||
by candle.pha.pa.us (8.11.6/8.10.1) with ESMTP id fAR0nNf14894 |
||||
for <pgman@candle.pha.pa.us>; Mon, 26 Nov 2001 19:49:23 -0500 (EST) |
||||
Received: from postgresql.org (postgresql.org [64.49.215.8]) |
||||
by rs.postgresql.org (8.11.6/8.11.6) with ESMTP id fAR0ijR50260 |
||||
for <pgman@candle.pha.pa.us>; Mon, 26 Nov 2001 18:47:51 -0600 (CST) |
||||
(envelope-from pgsql-hackers-owner+M15884=candle.pha.pa.us=pgman@postgresql.org) |
||||
Received: from candle.pha.pa.us (candle.navpoint.com [162.33.245.46]) |
||||
by postgresql.org (8.11.3/8.11.4) with ESMTP id fAR0dCm40733 |
||||
for <pgsql-hackers@postgresql.org>; Mon, 26 Nov 2001 19:39:12 -0500 (EST) |
||||
(envelope-from pgman@candle.pha.pa.us) |
||||
Received: (from pgman@localhost) |
||||
by candle.pha.pa.us (8.11.6/8.10.1) id fAR0d6d13929; |
||||
Mon, 26 Nov 2001 19:39:06 -0500 (EST) |
||||
From: Bruce Momjian <pgman@candle.pha.pa.us> |
||||
Message-ID: <200111270039.fAR0d6d13929@candle.pha.pa.us> |
||||
Subject: Re: [HACKERS] Minor buglet in update...from (I think) |
||||
In-Reply-To: <16309.1006820911@sss.pgh.pa.us> "from Tom Lane at Nov 26, 2001 |
||||
07:28:31 pm" |
||||
To: Tom Lane <tgl@sss.pgh.pa.us> |
||||
Date: Mon, 26 Nov 2001 19:39:06 -0500 (EST) |
||||
cc: Philip Warner <pjw@rhyme.com.au>, pgsql-hackers@postgresql.org |
||||
X-Mailer: ELM [version 2.4ME+ PL90 (25)] |
||||
MIME-Version: 1.0 |
||||
Content-Transfer-Encoding: 7bit |
||||
Content-Type: text/plain; charset=US-ASCII |
||||
Precedence: bulk |
||||
Sender: pgsql-hackers-owner@postgresql.org |
||||
Status: OR |
||||
|
||||
> Bruce Momjian <pgman@candle.pha.pa.us> writes: |
||||
> > Oh, so it is the aggregate. What threw me off is that both parts of the |
||||
> > WHERE clause are required to cause the failure, |
||||
> |
||||
> Not necessarily; I think it's got more to do with a null aggregate |
||||
> result: |
||||
> |
||||
> regression=# create table t1 (f1 datetime); |
||||
> CREATE |
||||
> regression=# create table t2 (f2 datetime); |
||||
> CREATE |
||||
> regression=# update t2 set f2 = min(f1) from t1; |
||||
> ERROR: ExecutePlan: (junk) `ctid' is NULL! |
||||
> regression=# insert into t1 values ('now'); |
||||
> INSERT 400577 1 |
||||
> regression=# update t2 set f2 = min(f1) from t1; |
||||
> ERROR: ExecutePlan: (junk) `ctid' is NULL! |
||||
> regression=# insert into t2 values ('now'); |
||||
> INSERT 400578 1 |
||||
> regression=# update t2 set f2 = min(f1) from t1; |
||||
> UPDATE 1 |
||||
> regression=# |
||||
> |
||||
> However the ERROR is only one symptom. The real problem is that the |
||||
> calculation that's being done is useless/nonsensical. |
||||
> |
||||
> > I don't see a problem with aggregates in UPDATE, |
||||
> |
||||
> Think harder ... what is the aggregate being taken over, and how do you |
||||
> associate the aggregate's single result row with any particular row in |
||||
> the UPDATE's target table? |
||||
|
||||
I thought the aggregate would be generated on all rows in the table in |
||||
the pre-transaction version of the table, so in this example: |
||||
|
||||
regression=# update t2 set f2 = min(f1) from t1; |
||||
|
||||
It places the minimum value of t1.f1 in all t2.f2 rows. Is there |
||||
another way to look at it? |
||||
|
||||
-- |
||||
Bruce Momjian | http://candle.pha.pa.us |
||||
pgman@candle.pha.pa.us | (610) 853-3000 |
||||
+ If your life is a hard drive, | 830 Blythe Avenue |
||||
+ Christ can be your backup. | Drexel Hill, Pennsylvania 19026 |
||||
|
||||
---------------------------(end of broadcast)--------------------------- |
||||
TIP 3: if posting/reading through Usenet, please send an appropriate |
||||
subscribe-nomail command to majordomo@postgresql.org so that your |
||||
message can get through to the mailing list cleanly |
||||
|
||||
From tgl@sss.pgh.pa.us Mon Nov 26 19:51:12 2001 |
||||
Return-path: <tgl@sss.pgh.pa.us> |
||||
Received: from sss.pgh.pa.us (root@[192.204.191.242]) |
||||
by candle.pha.pa.us (8.11.6/8.10.1) with ESMTP id fAR0pCf14964 |
||||
for <pgman@candle.pha.pa.us>; Mon, 26 Nov 2001 19:51:12 -0500 (EST) |
||||
Received: from sss2.sss.pgh.pa.us (tgl@localhost [127.0.0.1]) |
||||
by sss.pgh.pa.us (8.11.4/8.11.4) with ESMTP id fAR0pDk16384; |
||||
Mon, 26 Nov 2001 19:51:13 -0500 (EST) |
||||
To: Bruce Momjian <pgman@candle.pha.pa.us> |
||||
cc: Philip Warner <pjw@rhyme.com.au>, pgsql-hackers@postgresql.org |
||||
Subject: Re: [HACKERS] Minor buglet in update...from (I think) |
||||
In-Reply-To: <200111270039.fAR0d6d13929@candle.pha.pa.us> |
||||
References: <200111270039.fAR0d6d13929@candle.pha.pa.us> |
||||
Comments: In-reply-to Bruce Momjian <pgman@candle.pha.pa.us> |
||||
message dated "Mon, 26 Nov 2001 19:39:06 -0500" |
||||
Date: Mon, 26 Nov 2001 19:51:13 -0500 |
||||
Message-ID: <16381.1006822273@sss.pgh.pa.us> |
||||
From: Tom Lane <tgl@sss.pgh.pa.us> |
||||
Status: ORr |
||||
|
||||
Bruce Momjian <pgman@candle.pha.pa.us> writes: |
||||
> I thought the aggregate would be generated on all rows in the table in |
||||
> the pre-transaction version of the table, so in this example: |
||||
> regression=# update t2 set f2 = min(f1) from t1; |
||||
> It places the minimum value of t1.f1 in all t2.f2 rows. |
||||
|
||||
This actually is not the most interesting example, because the aggregate |
||||
doesn't depend at all on t2. Try this instead: |
||||
|
||||
regression=# create table t1(f1 int); |
||||
CREATE |
||||
regression=# create table t2(f1 int); |
||||
CREATE |
||||
regression=# insert into t1 values(-1); |
||||
INSERT 400599 1 |
||||
regression=# insert into t1 values(-2); |
||||
INSERT 400600 1 |
||||
regression=# insert into t1 values(-3); |
||||
INSERT 400601 1 |
||||
regression=# insert into t2 values(-1); |
||||
INSERT 400602 1 |
||||
regression=# insert into t2 values(-2); |
||||
INSERT 400603 1 |
||||
regression=# insert into t2 values(-3); |
||||
INSERT 400604 1 |
||||
regression=# update t2 set f1 = count(*) from t1; |
||||
UPDATE 1 |
||||
regression=# select * from t2; |
||||
f1 |
||||
---- |
||||
-2 |
||||
-3 |
||||
9 |
||||
(3 rows) |
||||
|
||||
regression=# |
||||
|
||||
This is certainly broken, but what's the correct behavior? |
||||
Or how about this, which doesn't even use an aggregate: |
||||
|
||||
regression=# update t2 set f1 = t1.f1 from t1; |
||||
UPDATE 3 |
||||
regression=# select * from t2; |
||||
f1 |
||||
---- |
||||
-1 |
||||
-1 |
||||
-1 |
||||
(3 rows) |
||||
|
||||
regression=# |
||||
|
||||
That's surprising too, perhaps, but what would you have expected |
||||
and why? |
||||
|
||||
There's a reason why SQL99 forbids joins and aggregates in UPDATE ... |
||||
they're not always well-defined. |
||||
|
||||
I had a proposal (GROUP BY ctid) in the older thread for fixing the |
||||
aggregate misbehavior, but it doesn't solve the more general problem |
||||
of a join that produces multiple matches for the same target row. |
||||
Seems like that probably ought to draw an error. |
||||
|
||||
regards, tom lane |
||||
|
||||
From pgsql-hackers-owner+M15885=candle.pha.pa.us=pgman@postgresql.org Mon Nov 26 20:10:34 2001 |
||||
Return-path: <pgsql-hackers-owner+M15885=candle.pha.pa.us=pgman@postgresql.org> |
||||
Received: from rs.postgresql.org (server1.pgsql.org [64.39.15.238] (may be forged)) |
||||
by candle.pha.pa.us (8.11.6/8.10.1) with ESMTP id fAR1AXf16581 |
||||
for <pgman@candle.pha.pa.us>; Mon, 26 Nov 2001 20:10:33 -0500 (EST) |
||||
Received: from postgresql.org (postgresql.org [64.49.215.8]) |
||||
by rs.postgresql.org (8.11.6/8.11.6) with ESMTP id fAR12nR50907 |
||||
for <pgman@candle.pha.pa.us>; Mon, 26 Nov 2001 19:06:09 -0600 (CST) |
||||
(envelope-from pgsql-hackers-owner+M15885=candle.pha.pa.us=pgman@postgresql.org) |
||||
Received: from candle.pha.pa.us (candle.navpoint.com [162.33.245.46]) |
||||
by postgresql.org (8.11.3/8.11.4) with ESMTP id fAR0wHm41320 |
||||
for <pgsql-hackers@postgresql.org>; Mon, 26 Nov 2001 19:58:17 -0500 (EST) |
||||
(envelope-from pgman@candle.pha.pa.us) |
||||
Received: (from pgman@localhost) |
||||
by candle.pha.pa.us (8.11.6/8.10.1) id fAR0w6c15346; |
||||
Mon, 26 Nov 2001 19:58:06 -0500 (EST) |
||||
From: Bruce Momjian <pgman@candle.pha.pa.us> |
||||
Message-ID: <200111270058.fAR0w6c15346@candle.pha.pa.us> |
||||
Subject: Re: [HACKERS] Minor buglet in update...from (I think) |
||||
In-Reply-To: <16381.1006822273@sss.pgh.pa.us> "from Tom Lane at Nov 26, 2001 |
||||
07:51:13 pm" |
||||
To: Tom Lane <tgl@sss.pgh.pa.us> |
||||
Date: Mon, 26 Nov 2001 19:58:06 -0500 (EST) |
||||
cc: Philip Warner <pjw@rhyme.com.au>, pgsql-hackers@postgresql.org |
||||
X-Mailer: ELM [version 2.4ME+ PL90 (25)] |
||||
MIME-Version: 1.0 |
||||
Content-Transfer-Encoding: 7bit |
||||
Content-Type: text/plain; charset=US-ASCII |
||||
Precedence: bulk |
||||
Sender: pgsql-hackers-owner@postgresql.org |
||||
Status: OR |
||||
|
||||
> Bruce Momjian <pgman@candle.pha.pa.us> writes: |
||||
> > I thought the aggregate would be generated on all rows in the table in |
||||
> > the pre-transaction version of the table, so in this example: |
||||
> > regression=# update t2 set f2 = min(f1) from t1; |
||||
> > It places the minimum value of t1.f1 in all t2.f2 rows. |
||||
> |
||||
> This actually is not the most interesting example, because the aggregate |
||||
> doesn't depend at all on t2. Try this instead: |
||||
> |
||||
> regression=# create table t1(f1 int); |
||||
> CREATE |
||||
> regression=# create table t2(f1 int); |
||||
> CREATE |
||||
> regression=# insert into t1 values(-1); |
||||
> INSERT 400599 1 |
||||
> regression=# insert into t1 values(-2); |
||||
> INSERT 400600 1 |
||||
> regression=# insert into t1 values(-3); |
||||
> INSERT 400601 1 |
||||
> regression=# insert into t2 values(-1); |
||||
> INSERT 400602 1 |
||||
> regression=# insert into t2 values(-2); |
||||
> INSERT 400603 1 |
||||
> regression=# insert into t2 values(-3); |
||||
> INSERT 400604 1 |
||||
> regression=# update t2 set f1 = count(*) from t1; |
||||
> UPDATE 1 |
||||
> regression=# select * from t2; |
||||
> f1 |
||||
> ---- |
||||
> -2 |
||||
> -3 |
||||
> 9 |
||||
> (3 rows) |
||||
> |
||||
> regression=# |
||||
> |
||||
> This is certainly broken, but what's the correct behavior? |
||||
|
||||
Shouldn't it be 9 because there is no join of t1 and t2? |
||||
I can also see 3 as a valid answer. |
||||
|
||||
> Or how about this, which doesn't even use an aggregate: |
||||
> |
||||
> regression=# update t2 set f1 = t1.f1 from t1; |
||||
> UPDATE 3 |
||||
> regression=# select * from t2; |
||||
> f1 |
||||
> ---- |
||||
> -1 |
||||
> -1 |
||||
> -1 |
||||
> (3 rows) |
||||
> |
||||
> regression=# |
||||
> |
||||
> That's surprising too, perhaps, but what would you have expected |
||||
> and why? |
||||
|
||||
So it grabs the first match. Seems reasonable because t1 returns more |
||||
than one row. |
||||
|
||||
> |
||||
> There's a reason why SQL99 forbids joins and aggregates in UPDATE ... |
||||
> they're not always well-defined. |
||||
|
||||
Yes, I see that now. |
||||
|
||||
> I had a proposal (GROUP BY ctid) in the older thread for fixing the |
||||
> aggregate misbehavior, but it doesn't solve the more general problem |
||||
> of a join that produces multiple matches for the same target row. |
||||
> Seems like that probably ought to draw an error. |
||||
|
||||
Or a NOTICE stating a random row was chosen. |
||||
|
||||
-- |
||||
Bruce Momjian | http://candle.pha.pa.us |
||||
pgman@candle.pha.pa.us | (610) 853-3000 |
||||
+ If your life is a hard drive, | 830 Blythe Avenue |
||||
+ Christ can be your backup. | Drexel Hill, Pennsylvania 19026 |
||||
|
||||
---------------------------(end of broadcast)--------------------------- |
||||
TIP 1: subscribe and unsubscribe commands go to majordomo@postgresql.org |
||||
|
||||
From pgsql-hackers-owner+M4046@hub.org Fri Jun 30 08:55:30 2000 |
||||
Received: from hub.org (root@hub.org [216.126.84.1]) |
||||
by candle.pha.pa.us (8.9.0/8.9.0) with ESMTP id HAA17845 |
||||
for <pgman@candle.pha.pa.us>; Fri, 30 Jun 2000 07:55:30 -0400 (EDT) |
||||
Received: from hub.org (majordom@localhost [127.0.0.1]) |
||||
by hub.org (8.10.1/8.10.1) with SMTP id e5UBuOu21797; |
||||
Fri, 30 Jun 2000 07:56:24 -0400 (EDT) |
||||
Received: from acheron.rime.com.au (root@albatr.lnk.telstra.net [139.130.54.222]) |
||||
by hub.org (8.10.1/8.10.1) with ESMTP id e5UBtgu21623 |
||||
for <pgsql-hackers@postgresql.org>; Fri, 30 Jun 2000 07:55:44 -0400 (EDT) |
||||
Received: from oberon (Oberon.rime.com.au [203.8.195.100]) |
||||
by acheron.rime.com.au (8.9.3/8.9.3) with SMTP id VAA27179 |
||||
for <pgsql-hackers@postgresql.org>; Fri, 30 Jun 2000 21:50:24 +1000 |
||||
Message-ID: <3.0.5.32.20000630215746.03221df0@mail.rhyme.com.au> |
||||
X-Sender: pjw@mail.rhyme.com.au |
||||
X-Mailer: QUALCOMM Windows Eudora Pro Version 3.0.5 (32) |
||||
Date: Fri, 30 Jun 2000 21:57:46 +1000 |
||||
To: pgsql-hackers@postgresql.org |
||||
From: Philip Warner <pjw@rhyme.com.au> |
||||
Subject: [HACKERS] Minor buglet in update...from (I think) |
||||
MIME-Version: 1.0 |
||||
Content-Type: text/plain; charset="us-ascii" |
||||
X-Mailing-List: pgsql-hackers@postgresql.org |
||||
Precedence: bulk |
||||
Sender: pgsql-hackers-owner@hub.org |
||||
Status: ORr |
||||
|
||||
|
||||
A minor nasty error I got when trying to improve the query used to disable |
||||
triggers: |
||||
|
||||
create table t1(f1 int4, f2 int4); |
||||
create table t2(f1 int4, f2 int4); |
||||
|
||||
insert into t1 values(1, 0); |
||||
insert into t1 values(2, 0); |
||||
|
||||
insert into t2 values(1, 0); |
||||
|
||||
update t1 set f2=count(*) from t2 where t1.f1=1 and t2.f1=t1.f1 ; |
||||
UPDATE 1 |
||||
|
||||
update t1 set f2=count(*) from t2 where t1.f1=2 and t2.f1=t1.f1 ; |
||||
ERROR: ExecutePlan: (junk) `ctid' is NULL! |
||||
|
||||
I would have expected no update to occur since no rows match. |
||||
|
||||
|
||||
---------------------------------------------------------------- |
||||
Philip Warner | __---_____ |
||||
Albatross Consulting Pty. Ltd. |----/ - \ |
||||
(A.C.N. 008 659 498) | /(@) ______---_ |
||||
Tel: (+61) 0500 83 82 81 | _________ \ |
||||
Fax: (+61) 0500 83 82 82 | ___________ | |
||||
Http://www.rhyme.com.au | / \| |
||||
| --________-- |
||||
PGP key available upon request, | / |
||||
and from pgp5.ai.mit.edu:11371 |/ |
||||
|
Loading…
Reference in new issue