]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Klugy fix for bug #2447: we can't expand a whole-row reference to NEW
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 23 May 2006 17:09:18 +0000 (17:09 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 23 May 2006 17:09:18 +0000 (17:09 +0000)
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.

src/backend/rewrite/rewriteHandler.c
src/backend/rewrite/rewriteManip.c

index 4bc66db0bc03cd03e80622d071b152ec76847d3d..a9843f0d823db6956935ac2ed16714a2069e4ae7 100644 (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);
index 75e1fb562e9e2494fc83df44539410a9d535f72c..9542848ac0cdec8153a325408b892ab482a45951 100644 (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