Re: Bug in pg_get_constraintdef (for deferrable constraints)

Поиск
Список
Период
Сортировка
От Bruce Momjian
Тема Re: Bug in pg_get_constraintdef (for deferrable constraints)
Дата
Msg-id 200301082252.h08MqWX29883@candle.pha.pa.us
обсуждение исходный текст
Ответ на Re: Bug in pg_get_constraintdef (for deferrable constraints)  (Stephan Szabo <sszabo@megazone23.bigpanda.com>)
Список pgsql-hackers
OK, patch applied to HEAD and 7.3.X.  It does suppress options that are
already the default:  (patch attached)

That is:

    test=> CREATE TABLE a1 (x int primary key);
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index 'a1_pkey'
    for table 'a1'
    CREATE TABLE

    test=> CREATE TABLE a2 (y int references a1 (x));
    NOTICE:  CREATE TABLE will create implicit trigger(s) for FOREIGN KEY
    check(s)
    CREATE TABLE

dumps out as:

    ALTER TABLE ONLY a2
        ADD CONSTRAINT "$1" FOREIGN KEY (y) REFERENCES a1(x) ON UPDATE NO
        ACTION ON DELETE NO ACTION;

However, this:

    test=> create table a1 (x int primary key);
    NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index 'a1_pkey'
    for table 'a1'
    CREATE TABLE
    test=> create table a2 (y int references a1 (x) deferrable initially
    deferred);
    NOTICE:  CREATE TABLE will create implicit trigger(s) for FOREIGN KEY
    check(s)
    CREATE TABLE

dumps out as;

    ALTER TABLE ONLY a2
        ADD CONSTRAINT "$1" FOREIGN KEY (y) REFERENCES a1(x) ON UPDATE NO
        ACTION ON DELETE NO ACTION DEFERRABLE INITIALLY DEFERRED;

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

Stephan Szabo wrote:
>
> On Wed, 1 Jan 2003, Bruce Momjian wrote:
>
> > Tom Lane wrote:
> > > Bruce Momjian <pgman@candle.pha.pa.us> writes:
> > > > I see the values being stored on constriant creation, but not being used
> > > > anywhere:
> > >
> > > I believe the values that actually get inspected at runtime are the
> > > tgdeferrable and tginitdeferred fields in pg_trigger.  The columns in
> > > pg_constraint are just copies of these.
> > >
> > > It is not real clear to me whether it should be allowed to alter the
> > > deferrability status of a foreign-key constraint --- is that in the spec?
> >
> > The big problem is that while pg_dump's dump_trigger() looks at
> > tginitdeferred and dumps accordingly, pg_get_constraintdef doesn't look
> > at tginitdeferred, and therefore doesn't record the requirement as part
> > of ALTER TABLE ADD CONSTRAINT.
>
> pg_get_constraintdef should probably be looking at condeferrable
> and condeferred in the pg_constraint row it's looking at.  Maybe something
> like the attached.

Content-Description:

[ Attachment, skipping... ]

--
  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, Pennsylvania 19073
Index: src/backend/utils/adt/ruleutils.c
===================================================================
RCS file: /cvsroot/pgsql-server/src/backend/utils/adt/ruleutils.c,v
retrieving revision 1.129
diff -c -c -r1.129 ruleutils.c
*** src/backend/utils/adt/ruleutils.c    14 Dec 2002 00:17:59 -0000    1.129
--- src/backend/utils/adt/ruleutils.c    8 Jan 2003 22:51:03 -0000
***************
*** 688,693 ****
--- 688,698 ----
                  }
                  appendStringInfo(&buf, " ON DELETE %s", string);

+                 if (conForm->condeferrable)
+                     appendStringInfo(&buf, " DEFERRABLE");
+                 if (conForm->condeferred)
+                     appendStringInfo(&buf, " INITIALLY DEFERRED");
+
                  break;
              }


В списке pgsql-hackers по дате отправления:

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: MOVE LAST: why?
Следующее
От: Tom Lane
Дата:
Сообщение: Re: MOVE LAST: why?