Commit d785841f authored by Tom Lane's avatar Tom Lane

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.
parent ae449122
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * 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) ...@@ -5379,21 +5379,20 @@ ATExecSetTableSpace(Oid tableOid, Oid newTableSpace)
dstrel = smgropen(newrnode); dstrel = smgropen(newrnode);
smgrcreate(dstrel, rel->rd_istemp, false); smgrcreate(dstrel, rel->rd_istemp, false);
/* copy relation data to the new physical file */
copy_relation_data(rel, dstrel);
/* schedule unlinking old physical file */ /* schedule unlinking old physical file */
if (rel->rd_smgr == NULL) if (rel->rd_smgr == NULL)
rel->rd_smgr = smgropen(rel->rd_node); rel->rd_smgr = smgropen(rel->rd_node);
smgrscheduleunlink(rel->rd_smgr, rel->rd_istemp); smgrscheduleunlink(rel->rd_smgr, rel->rd_istemp);
rel->rd_smgr = NULL;
/* copy relation data to the new physical file */
copy_relation_data(rel, dstrel);
/* /*
* Now drop smgr references. We need not smgrclose() the old file, * Now drop smgr references. The source was already dropped by
* since it will be dropped anyway at commit by the pending unlink. * smgrscheduleunlink.
* We do need to get rid of relcache's reference to it, however.
*/ */
smgrclose(dstrel); smgrclose(dstrel);
rel->rd_smgr = NULL;
/* update the pg_class row */ /* update the pg_class row */
rd_rel->reltablespace = (newTableSpace == MyDatabaseTableSpace) ? InvalidOid : newTableSpace; rd_rel->reltablespace = (newTableSpace == MyDatabaseTableSpace) ? InvalidOid : newTableSpace;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment