Re: Backpatch FK changes to 7.3 and 7.2? - Mailing list pgsql-hackers

From Bruce Momjian
Subject Re: Backpatch FK changes to 7.3 and 7.2?
Date
Msg-id 200304150258.h3F2wEr06540@candle.pha.pa.us
Whole thread Raw
In response to Re: Backpatch FK changes to 7.3 and 7.2?  (Jan Wieck <JanWieck@Yahoo.com>)
List pgsql-hackers
Seems like a small reasonable patch to me, and several folks want it.

---------------------------------------------------------------------------

Jan Wieck wrote:
> Stephan Szabo wrote:
> > 
> > On Tue, 8 Apr 2003, Tatsuo Ishii wrote:
> > 
> > > > > The changes I committed to address most of the FK deadlock problems
> > > > > reported can easily be applied to the 7.3 and 7.2 source trees as well.
> > > > >
> > > > > Except for a slight change in the text of the error message that gets
> > > > > thrown "if one tries to delete a referenced PK for which a FK with ON
> > > > > DELETE SET DEFAULT exists" (it's a rare case, believe me), this patch
> > > > > would qualify for backpatching. The unnecessary FOR UPDATE lock of
> > > > > referenced rows could be counted as a bug.
> > > > >
> > > > > Opinions?
> > > >
> > > > Since I seem to suffer from these horrible deadlock problems all the
> > > > time, I'd like it to be backported to 7.3...
> > >
> > > Me too!
> > 
> > As a note, this'll solve some of the deadlocks on fk update (generally the
> > key values aren't touched) but not insert related ones (two rows inserted
> > to the same primary key causing one to wait and possible deadlocks)
> > 
> > In any case, why don't we get a patch against 7.3, and make an
> > announcement and let people who are interested use it and test it.  With
> > in-field testing it'd probably be safe enough. :)
> 
> Here it is.
> 
> 
> Jan
> 
> -- 
> #======================================================================#
> # It's easier to get forgiveness for being wrong than for being right. #
> # Let's break this rule - forgive me.                                  #
> #================================================== JanWieck@Yahoo.com #

> *** ri_triggers.c.orig    Fri Apr  4 10:41:45 2003
> --- ri_triggers.c    Sun Apr  6 12:36:54 2003
> ***************
> *** 391,403 ****
>       }
>   
>       /*
> !      * Note: We cannot avoid the check on UPDATE, even if old and new key
> !      * are the same. Otherwise, someone could DELETE the PK that consists
> !      * of the DEFAULT values, and if there are any references, a ON DELETE
> !      * SET DEFAULT action would update the references to exactly these
> !      * values but we wouldn't see that weired case (this is the only place
> !      * to see it).
>        */
>       if (SPI_connect() != SPI_OK_CONNECT)
>           elog(WARNING, "SPI_connect() failed in RI_FKey_check()");
>   
> --- 391,409 ----
>       }
>   
>       /*
> !      * No need to check anything if old and new references are the
> !      * same on UPDATE.
>        */
> +     if (TRIGGER_FIRED_BY_UPDATE(trigdata->tg_event))
> +     {
> +         if (ri_KeysEqual(fk_rel, old_row, new_row, &qkey,
> +                          RI_KEYPAIR_FK_IDX))
> +         {
> +             heap_close(pk_rel, RowShareLock);
> +             return PointerGetDatum(NULL);
> +         }
> +     }
> + 
>       if (SPI_connect() != SPI_OK_CONNECT)
>           elog(WARNING, "SPI_connect() failed in RI_FKey_check()");
>   
> ***************
> *** 2787,2792 ****
> --- 2793,2808 ----
>   
>               heap_close(fk_rel, RowExclusiveLock);
>   
> +             /*
> +              * In the case we delete the row who's key is equal to the
> +              * default values AND a referencing row in the foreign key
> +              * table exists, we would just have updated it to the same
> +              * values. We need to do another lookup now and in case a
> +              * reference exists, abort the operation. That is already
> +              * implemented in the NO ACTION trigger.
> +              */
> +             RI_FKey_noaction_del(fcinfo);
> + 
>               return PointerGetDatum(NULL);
>   
>               /*
> ***************
> *** 3077,3082 ****
> --- 3093,3108 ----
>                   elog(WARNING, "SPI_finish() failed in RI_FKey_setdefault_upd()");
>   
>               heap_close(fk_rel, RowExclusiveLock);
> + 
> +             /*
> +              * In the case we updated the row who's key was equal to the
> +              * default values AND a referencing row in the foreign key
> +              * table exists, we would just have updated it to the same
> +              * values. We need to do another lookup now and in case a
> +              * reference exists, abort the operation. That is already
> +              * implemented in the NO ACTION trigger.
> +              */
> +             RI_FKey_noaction_upd(fcinfo);
>   
>               return PointerGetDatum(NULL);
>   

> 
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster

--  Bruce Momjian                        |  http://candle.pha.pa.us pgman@candle.pha.pa.us               |  (610)
359-1001+  If your life is a hard drive,     |  13 Roberts Road +  Christ can be your backup.        |  Newtown Square,
Pennsylvania19073
 



pgsql-hackers by date:

Previous
From: Mike Mascari
Date:
Subject: Re: Are we losing momentum?
Next
From: Christopher Browne
Date:
Subject: Re: Are we losing momentum?