Change order of operations in ALTER TABLE SET TABLESPACE so that we
authorTom Lane <tgl@sss.pgh.pa.us>
Fri, 13 Aug 2004 04:50:28 +0000 (04:50 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Fri, 13 Aug 2004 04:50:28 +0000 (04:50 +0000)
don't hold an open file reference to the original table at the end.
This is a good thing in any case, particularly so on Windows which
cannot drop the table file otherwise.

src/backend/commands/tablecmds.c

index bc5339a91bf091ec759db6c441830a38e03f196c..87a2fb4856d666c7b840123bbbd992b7428c397e 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.124 2004/08/04 20:53:53 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.125 2004/08/13 04:50:28 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -5379,21 +5379,20 @@ ATExecSetTableSpace(Oid tableOid, Oid newTableSpace)
        dstrel = smgropen(newrnode);
        smgrcreate(dstrel, rel->rd_istemp, false);
 
+       /* copy relation data to the new physical file */
+       copy_relation_data(rel, dstrel);
+
        /* schedule unlinking old physical file */
        if (rel->rd_smgr == NULL)
                rel->rd_smgr = smgropen(rel->rd_node);
        smgrscheduleunlink(rel->rd_smgr, rel->rd_istemp);
-
-       /* copy relation data to the new physical file */
-       copy_relation_data(rel, dstrel);
+       rel->rd_smgr = NULL;
 
        /*
-        * Now drop smgr references.  We need not smgrclose() the old file,
-        * since it will be dropped anyway at commit by the pending unlink.
-        * We do need to get rid of relcache's reference to it, however.
+        * Now drop smgr references.  The source was already dropped by
+        * smgrscheduleunlink.
         */
        smgrclose(dstrel);
-       rel->rd_smgr = NULL;
 
        /* update the pg_class row */
        rd_rel->reltablespace = (newTableSpace == MyDatabaseTableSpace) ? InvalidOid : newTableSpace;