Re: BUG #16462: Update Statement destructive behaviour with joins

From: Bruce Momjian <bruce(at)momjian(dot)us>
To: David Rowley <dgrowleyml(at)gmail(dot)com>
Cc: srivastava(dot)adi24(at)gmail(dot)com, PostgreSQL mailing lists <pgsql-bugs(at)lists(dot)postgresql(dot)org>
Subject: Re: BUG #16462: Update Statement destructive behaviour with joins
Date: 2020-06-02 17:52:02
Message-ID: 20200602175202.GA25612@momjian.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

On Wed, May 27, 2020 at 12:48:19AM +1200, David Rowley wrote:
> On Wed, 27 May 2020 at 00:15, PG Bug reporting form
> <noreply(at)postgresql(dot)org> wrote:
> > Let's say I have a table orange and a temp table temp, and i want to update
> > the records after joining the columns in temp table. I used the following
> > syntax to update the records which ended up updating the entire table
> > "orange".
> >
> > UPDATE orange
> > SET fruit_flag = 'okay'
> > FROM temp as t
> > INNER JOIN portal_users p on t.fruit_id = p.fruit_id
> > WHERE p.id = '123';
> >
> > I know that the correct syntax should be the following but judging from the
> > destructive nature of this query i honestly feel we should throw validation
> > error if the above syntax is not correct.
>
> That's an unfortunate mistake.
>
> Unfortunately, SQL is full of these trip hazards. The join syntax was
> once revised to try to reduce the pain of accidental cartesian joins
> by missed join clauses in the WHERE clause. The JOIN ON syntax was
> born because of that. Maybe we didn't get the UPDATE FROM syntax
> perfect, as it does still allow users to easily miss the join clause,
> but I'm not all that sure what we can realistically do about that, It
> does not seem like a good thing to go raising an error as it might
> block some genuine use case.
>
> Thinking back, there was some discussion around looking for ways to
> block such mistakes in [1]. As I recall it was going to be an
> extension that created triggers to block mistakes like this. However,
> that thread has not moved in over 3 years.
>
> [1] https://www.postgresql.org/message-id/flat/20170202175023.GA30233%40localhost#95ca7fad07b30fd0e2205075f3fc04c5

I have alawys wanted a 'novice' mode which warned/errored on such things.

--
Bruce Momjian <bruce(at)momjian(dot)us> https://momjian.us
EnterpriseDB https://enterprisedb.com

The usefulness of a cup is in its emptiness, Bruce Lee

In response to

Browse pgsql-bugs by date

  From Date Subject
Next Message Alvaro Herrera 2020-06-02 21:30:03 Re: FailedAssertion("!OidIsValid(def->collOid)", File: "view.c", Line: 89)
Previous Message Peter Geoghegan 2020-06-02 17:24:51 Re: Potential G2-item cycles under serializable isolation