From d785841f831fd9bc9cf11ed62d8571910a71bd0c Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Fri, 13 Aug 2004 04:50:28 +0000
Subject: [PATCH] Change order of operations in ALTER TABLE SET TABLESPACE so
 that we 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 | 15 +++++++--------
 1 file changed, 7 insertions(+), 8 deletions(-)

diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index bc5339a91bf..87a2fb4856d 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -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;
-- 
GitLab