]> granicus.if.org Git - postgresql/commitdiff
ExecEndAppend() neglected to close indices on appended result rels,
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 9 Nov 2000 18:12:53 +0000 (18:12 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 9 Nov 2000 18:12:53 +0000 (18:12 +0000)
and improperly prevented the main result rel from being closed if it
wasn't one of the Append's own result rels.  Per report from Hiroshi.

src/backend/executor/nodeAppend.c

index 6c547854b555fa3c2fbbfa16240815cde5a40058..81eeb1e8b0b2a66b1b0a41b11ef629a9bcdb0aec 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/executor/nodeAppend.c,v 1.36 2000/10/05 19:11:26 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/executor/nodeAppend.c,v 1.37 2000/11/09 18:12:53 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -493,27 +493,32 @@ ExecEndAppend(Append *node)
 
        /* ----------------
         *      close out the different result relations
+        *
+        *      NB: this must agree with what EndPlan() does to close a result rel
         * ----------------
         */
        resultRelationInfoList = appendstate->as_result_relation_info_list;
        while (resultRelationInfoList != NIL)
        {
                RelationInfo *resultRelationInfo;
-               Relation        resultRelationDesc;
 
                resultRelationInfo = (RelationInfo *) lfirst(resultRelationInfoList);
-               resultRelationDesc = resultRelationInfo->ri_RelationDesc;
-               heap_close(resultRelationDesc, NoLock);
+
+               heap_close(resultRelationInfo->ri_RelationDesc, NoLock);
+               /* close indices on the result relation, too */
+               ExecCloseIndices(resultRelationInfo);
+
+               /*
+                * estate may (or may not) be pointing at one of my result relations.
+                * If so, make sure EndPlan() doesn't try to close it again!
+                */
+               if (estate->es_result_relation_info == resultRelationInfo)
+                       estate->es_result_relation_info = NULL;
+
                pfree(resultRelationInfo);
                resultRelationInfoList = lnext(resultRelationInfoList);
        }
        appendstate->as_result_relation_info_list = NIL;
-       /*
-        * This next step is critical to prevent EndPlan() from trying to close
-        * an already-closed-and-deleted RelationInfo --- es_result_relation_info
-        * is pointing at one of the nodes we just zapped above.
-        */
-       estate->es_result_relation_info = NULL;
 
        /*
         * XXX should free appendstate->as_junkfilter_list here