]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
This is actually more of a fundamental problem with mdtruncate. It
authorBruce Momjian <bruce@momjian.us>
Mon, 17 May 1999 06:38:41 +0000 (06:38 +0000)
committerBruce Momjian <bruce@momjian.us>
Mon, 17 May 1999 06:38:41 +0000 (06:38 +0000)
looks
like someone just didn't add support for multiple segments for
truncation.

The following patch seems to do the right thing, for me at least.
It passed my tests, my data looks right(no data that shouldn't be in
there) and regression is ok.

Ole Gjerde

src/backend/storage/smgr/md.c

index 8d7e4c864b18a248e32ad9a3ead6293a1966a934..84fd67510dcdd5b402436dcddae51791eaaaf58d 100644 (file)
@@ -7,7 +7,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/storage/smgr/md.c,v 1.42 1999/04/05 22:25:11 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/storage/smgr/md.c,v 1.43 1999/05/17 06:38:41 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -711,15 +711,26 @@ mdtruncate(Relation reln, int nblocks)
        MdfdVec    *v;
 
 #ifndef LET_OS_MANAGE_FILESIZE
-       int                     curnblk;
+       int                     curnblk,
+                                       i,
+                                       oldsegno,
+                                       newsegno;
+       char            fname[NAMEDATALEN];
+       char            tname[NAMEDATALEN + 10];
 
        curnblk = mdnblocks(reln);
-       if (curnblk / RELSEG_SIZE > 0)
-       {
-               elog(NOTICE, "Can't truncate multi-segments relation %s",
-                        reln->rd_rel->relname.data);
-               return curnblk;
-       }
+       oldsegno = curnblk / RELSEG_SIZE;
+       newsegno = nblocks / RELSEG_SIZE;
+
+       StrNCpy(fname, RelationGetRelationName(reln)->data, NAMEDATALEN);
+
+       if (newsegno < oldsegno) {
+               for (i = (newsegno + 1);; i++) {
+                       sprintf(tname, "%s.%d", fname, i);
+                       if (FileNameUnlink(tname) < 0)
+                               break;
+               }
+        }
 #endif
 
        fd = RelationGetFile(reln);