Rearrange code in ExecInitBitmapHeapScan so that we don't initialize the
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 2 Dec 2005 01:29:55 +0000 (01:29 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 2 Dec 2005 01:29:55 +0000 (01:29 +0000)
child plan nodes until we have acquired lock on the relation to scan.
The relative order of initialization of plan nodes isn't real important in
other cases, but it's critical here because one is supposed to lock a
relation before its indexes, not vice versa.  The original coding was at
least vulnerable to deadlock against DROP INDEX, and perhaps worse things.

src/backend/executor/nodeBitmapHeapscan.c

index 16b0453023f5e9c286ce2fe4f4c24ea7fca4e0de..37bd42d9d733b9effeda4616bc52d622848317dc 100644 (file)
@@ -21,7 +21,7 @@
  *
  *
  * IDENTIFICATION
- *   $PostgreSQL: pgsql/src/backend/executor/nodeBitmapHeapscan.c,v 1.6 2005/11/26 03:03:07 tgl Exp $
+ *   $PostgreSQL: pgsql/src/backend/executor/nodeBitmapHeapscan.c,v 1.7 2005/12/02 01:29:55 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -508,11 +508,6 @@ ExecInitBitmapHeapScan(BitmapHeapScan *node, EState *estate)
        ExecInitExpr((Expr *) node->bitmapqualorig,
                     (PlanState *) scanstate);
 
-   /*
-    * initialize child nodes
-    */
-   outerPlanState(scanstate) = ExecInitNode(outerPlan(node), estate);
-
 #define BITMAPHEAPSCAN_NSLOTS 2
 
    /*
@@ -562,6 +557,15 @@ ExecInitBitmapHeapScan(BitmapHeapScan *node, EState *estate)
    ExecAssignResultTypeFromTL(&scanstate->ss.ps);
    ExecAssignScanProjectionInfo(&scanstate->ss);
 
+   /*
+    * initialize child nodes
+    *
+    * We do this last because the child nodes will open indexscans on our
+    * relation's indexes, and we want to be sure we have acquired a lock
+    * on the relation first.
+    */
+   outerPlanState(scanstate) = ExecInitNode(outerPlan(node), estate);
+
    /*
     * all done.
     */