diff options
Diffstat (limited to 'src/backend/rewrite/rewriteHandler.c')
-rw-r--r-- | src/backend/rewrite/rewriteHandler.c | 52 |
1 files changed, 34 insertions, 18 deletions
diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c index 3011e54fd71..3b3d209d468 100644 --- a/src/backend/rewrite/rewriteHandler.c +++ b/src/backend/rewrite/rewriteHandler.c @@ -7,7 +7,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.96 2001/07/06 13:40:47 wieck Exp $ + * $Header: /cvsroot/pgsql/src/backend/rewrite/rewriteHandler.c,v 1.97 2001/07/09 23:50:32 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -831,7 +831,7 @@ deepRewriteQuery(Query *parsetree) numQueryRewriteInvoked - 1); } - instead = FALSE; + instead = false; result = RewriteQuery(parsetree, &instead, &qual_products); foreach(n, result) @@ -845,25 +845,41 @@ deepRewriteQuery(Query *parsetree) } /* - * qual_products are the original query with the negated rule - * qualification of an instead rule + * For INSERTs, the original query is done first; for UPDATE/DELETE, it is + * done last. This is needed because update and delete rule actions might + * not do anything if they are invoked after the update or delete is + * performed. The command counter increment between the query execution + * makes the deleted (and maybe the updated) tuples disappear so the scans + * for them in the rule actions cannot find them. */ - if (qual_products != NIL) - rewritten = nconc(rewritten, qual_products); - - /* - * The original query is appended last (if no "instead" rule) because - * update and delete rule actions might not do anything if they are - * invoked after the update or delete is performed. The command - * counter increment between the query execution makes the deleted - * (and maybe the updated) tuples disappear so the scans for them in - * the rule actions cannot find them. - */ - if (!instead) - if (parsetree->commandType == CMD_INSERT) + if (parsetree->commandType == CMD_INSERT) + { + /* + * qual_products are the original query with the negated rule + * qualification of an INSTEAD rule + */ + if (qual_products != NIL) + rewritten = nconc(qual_products, rewritten); + /* + * Add the unmodified original query, if no INSTEAD rule was seen. + */ + if (!instead) rewritten = lcons(parsetree, rewritten); - else + } + else + { + /* + * qual_products are the original query with the negated rule + * qualification of an INSTEAD rule + */ + if (qual_products != NIL) + rewritten = nconc(rewritten, qual_products); + /* + * Add the unmodified original query, if no INSTEAD rule was seen. + */ + if (!instead) rewritten = lappend(rewritten, parsetree); + } return rewritten; } |