On Wed, 1 Jan 2003, Bruce Momjian wrote:
> Tom Lane wrote:
> > Bruce Momjian <[EMAIL PROTECTED]> 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.
*** pgsql/src/backend/utils/adt/ruleutils.c 2003-01-01 15:03:35.000000000 -0800
--- pgsql/src/backend/utils/adt/ruleutils.c.new 2003-01-01 15:02:32.000000000 -0800
***************
*** 688,693 ****
--- 688,704 ----
}
appendStringInfo(&buf, " ON DELETE %s", string);
+ if (!conForm->condeferrable) {
+ appendStringInfo(&buf, " NOT");
+ }
+ appendStringInfo(&buf, " DEFERRABLE");
+ if (conForm->condeferred) {
+ appendStringInfo(&buf, " INITIALLY DEFERRED");
+ }
+ else {
+ appendStringInfo(&buf, " INITIALLY
+IMMEDIATE");
+ }
+
break;
}
---------------------------(end of broadcast)---------------------------
TIP 1: subscribe and unsubscribe commands go to [EMAIL PROTECTED]