From: Tom Lane Date: Tue, 23 May 2006 17:09:18 +0000 (+0000) Subject: Klugy fix for bug #2447: we can't expand a whole-row reference to NEW X-Git-Tag: REL8_0_9~45 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f966dccb2f702607d18c6ea991e3772f0d0415bd;p=thirdparty%2Fpostgresql.git Klugy fix for bug #2447: we can't expand a whole-row reference to NEW in a rule WHERE expression while inserting it into the original query, because the 8.0 ResolveNew API is wrongly designed. This is fixed in 8.1 but I'm disinclined to risk back-porting the changes. Instead, just stop the coredump and instead issue the same 'cannot handle whole-row reference' message that 7.4 and before generated in this situation. --- diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c index 4bc66db0bc0..a9843f0d823 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 - * $PostgreSQL: pgsql/src/backend/rewrite/rewriteHandler.c,v 1.147 2004/12/31 22:00:45 pgsql Exp $ + * $PostgreSQL: pgsql/src/backend/rewrite/rewriteHandler.c,v 1.147.4.1 2006/05/23 17:09:18 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1046,7 +1046,7 @@ CopyAndAddInvertedQual(Query *parsetree, new_qual = ResolveNew(new_qual, PRS2_NEW_VARNO, 0, - parsetree->rtable, + NIL, /* fix bug #2447 */ parsetree->targetList, event, rt_index); diff --git a/src/backend/rewrite/rewriteManip.c b/src/backend/rewrite/rewriteManip.c index 75e1fb562e9..9542848ac0c 100644 --- a/src/backend/rewrite/rewriteManip.c +++ b/src/backend/rewrite/rewriteManip.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/rewrite/rewriteManip.c,v 1.89.4.1 2006/01/06 20:11:24 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/rewrite/rewriteManip.c,v 1.89.4.2 2006/05/23 17:09:18 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -942,6 +942,24 @@ ResolveNew_mutator(Node *node, ResolveNew_context *context) RowExpr *rowexpr; List *fields; + /* + * Klugy fix for bug #2447: we can't expand a whole-row + * reference to "NEW" in a rule WHERE expression while + * inserting it into the original query, because its varno + * will be PRS2_NEW_VARNO which is not the rtindex of the RTE + * we should use. The 8.0 ResolveNew API is wrongly designed. + * We aren't going to try to back-port the 8.1 API, just avoid + * crashing. (This never worked before 8.0, either.) + * CopyAndAddInvertedQual passes NIL for target_rtable, so + * testing for NIL would be sufficient, but let's put in a + * full check on the rtindex for safety. + */ + if (this_varno < 1 || + this_varno > list_length(context->target_rtable)) + ereport(ERROR, + (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), + errmsg("cannot handle whole-row reference"))); + /* * If generating an expansion for a var of a named rowtype * (ie, this is a plain relation RTE), then we must