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.
This commit is contained in:
Tom Lane 2006-05-23 17:09:18 +00:00
parent f39fc4769e
commit f966dccb2f
2 changed files with 21 additions and 3 deletions

View File

@ -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);

View File

@ -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