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.
This commit is contained in:
Tom Lane 2004-08-13 04:50:28 +00:00
parent ae449122cf
commit d785841f83
1 changed files with 7 additions and 8 deletions

View File

@ -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)
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;