diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2003-09-28 02:11:23 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2003-09-28 02:11:23 +0000 |
commit | a15207f8d69cd7650e1a6fd962f7e3e8c543ce78 (patch) | |
tree | c9ef8cc09638f149858f54cdff4facfc8e5b75ca /src/backend/utils/adt/ri_triggers.c | |
parent | 3900f8368d1f9eb440dff9e603cbc6049702a9b2 (diff) | |
download | postgresql-a15207f8d69cd7650e1a6fd962f7e3e8c543ce78.tar.gz postgresql-a15207f8d69cd7650e1a6fd962f7e3e8c543ce78.zip |
Now that we have UPDATE tab SET col = DEFAULT, get rid of horrid hack
in the RI triggers for ON DELETE/UPDATE SET DEFAULT. The code depended
way too much on knowledge of plan structure, and yet still would fail
if the generated query got rewritten by rules.
Diffstat (limited to 'src/backend/utils/adt/ri_triggers.c')
-rw-r--r-- | src/backend/utils/adt/ri_triggers.c | 70 |
1 files changed, 5 insertions, 65 deletions
diff --git a/src/backend/utils/adt/ri_triggers.c b/src/backend/utils/adt/ri_triggers.c index 6250995e1b8..fc91a88cd04 100644 --- a/src/backend/utils/adt/ri_triggers.c +++ b/src/backend/utils/adt/ri_triggers.c @@ -17,7 +17,7 @@ * * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group * - * $Header: /cvsroot/pgsql/src/backend/utils/adt/ri_triggers.c,v 1.58 2003/09/25 18:58:35 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/ri_triggers.c,v 1.59 2003/09/28 02:11:23 tgl Exp $ * * ---------- */ @@ -2144,13 +2144,11 @@ RI_FKey_setdefault_del(PG_FUNCTION_ARGS) const char *querysep; const char *qualsep; Oid queryoids[RI_MAX_NUMKEYS]; - Plan *spi_plan; int i; - List *l; /* ---------- * The query string built is - * UPDATE ONLY <fktable> SET fkatt1 = NULL [, ...] + * UPDATE ONLY <fktable> SET fkatt1 = DEFAULT [, ...] * WHERE fkatt1 = $1 [AND ...] * The type id's for the $ parameters are those of the * corresponding PK attributes. Thus, ri_PlanCheck could @@ -2167,7 +2165,7 @@ RI_FKey_setdefault_del(PG_FUNCTION_ARGS) { quoteOneName(attname, tgargs[RI_FIRST_ATTNAME_ARGNO + i * 2 + RI_KEYPAIR_FK_IDX]); - snprintf(querystr + strlen(querystr), sizeof(querystr) - strlen(querystr), "%s %s = NULL", + snprintf(querystr + strlen(querystr), sizeof(querystr) - strlen(querystr), "%s %s = DEFAULT", querysep, attname); snprintf(qualstr + strlen(qualstr), sizeof(qualstr) - strlen(qualstr), " %s %s = $%d", qualsep, attname, i + 1); @@ -2181,34 +2179,6 @@ RI_FKey_setdefault_del(PG_FUNCTION_ARGS) /* Prepare the plan, don't save it */ qplan = ri_PlanCheck(querystr, qkey.nkeypairs, queryoids, &qkey, fk_rel, pk_rel, false); - - /* - * Scan the plan's targetlist and replace the NULLs by - * appropriate column defaults, if any (if not, they stay - * NULL). - * - * XXX This is really ugly; it'd be better to use "UPDATE - * SET foo = DEFAULT", if we had it. - */ - spi_plan = (Plan *) lfirst(((_SPI_plan *) qplan)->ptlist); - foreach(l, spi_plan->targetlist) - { - TargetEntry *tle = (TargetEntry *) lfirst(l); - Node *dfl; - - /* Ignore any junk columns or Var=Var columns */ - if (tle->resdom->resjunk) - continue; - if (IsA(tle->expr, Var)) - continue; - - dfl = build_column_default(fk_rel, tle->resdom->resno); - if (dfl) - { - fix_opfuncids(dfl); - tle->expr = (Expr *) dfl; - } - } } /* @@ -2368,13 +2338,11 @@ RI_FKey_setdefault_upd(PG_FUNCTION_ARGS) const char *querysep; const char *qualsep; Oid queryoids[RI_MAX_NUMKEYS]; - Plan *spi_plan; int i; - List *l; /* ---------- * The query string built is - * UPDATE ONLY <fktable> SET fkatt1 = NULL [, ...] + * UPDATE ONLY <fktable> SET fkatt1 = DEFAULT [, ...] * WHERE fkatt1 = $1 [AND ...] * The type id's for the $ parameters are those of the * corresponding PK attributes. Thus, ri_PlanCheck could @@ -2400,7 +2368,7 @@ RI_FKey_setdefault_upd(PG_FUNCTION_ARGS) !ri_OneKeyEqual(pk_rel, i, old_row, new_row, &qkey, RI_KEYPAIR_PK_IDX)) { - snprintf(querystr + strlen(querystr), sizeof(querystr) - strlen(querystr), "%s %s = NULL", + snprintf(querystr + strlen(querystr), sizeof(querystr) - strlen(querystr), "%s %s = DEFAULT", querysep, attname); querysep = ","; } @@ -2415,34 +2383,6 @@ RI_FKey_setdefault_upd(PG_FUNCTION_ARGS) /* Prepare the plan, don't save it */ qplan = ri_PlanCheck(querystr, qkey.nkeypairs, queryoids, &qkey, fk_rel, pk_rel, false); - - /* - * Scan the plan's targetlist and replace the NULLs by - * appropriate column defaults, if any (if not, they stay - * NULL). - * - * XXX This is really ugly; it'd be better to use "UPDATE - * SET foo = DEFAULT", if we had it. - */ - spi_plan = (Plan *) lfirst(((_SPI_plan *) qplan)->ptlist); - foreach(l, spi_plan->targetlist) - { - TargetEntry *tle = (TargetEntry *) lfirst(l); - Node *dfl; - - /* Ignore any junk columns or Var=Var columns */ - if (tle->resdom->resjunk) - continue; - if (IsA(tle->expr, Var)) - continue; - - dfl = build_column_default(fk_rel, tle->resdom->resno); - if (dfl) - { - fix_opfuncids(dfl); - tle->expr = (Expr *) dfl; - } - } } /* |