From 184dd28d5c2c8067d2336398a03f04a8b989e52e Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Mon, 17 May 1999 06:38:41 +0000
Subject: [PATCH] This is actually more of a fundamental problem with
 mdtruncate.  It 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 | 27 +++++++++++++++++++--------
 1 file changed, 19 insertions(+), 8 deletions(-)

diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c
index 8d7e4c864b1..84fd67510dc 100644
--- a/src/backend/storage/smgr/md.c
+++ b/src/backend/storage/smgr/md.c
@@ -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);
-- 
GitLab