0001-Use-64-bit-type-for-BufFileSize.patch

application/octet-stream

Filename: 0001-Use-64-bit-type-for-BufFileSize.patch
Type: application/octet-stream
Part: 0
Message: Re: BUG #15460: Error while creating index or constraint

Patch

Format: format-patch
Series: patch 0001
Subject: Use 64 bit type for BufFileSize().
File+
src/backend/storage/file/buffile.c 3 3
src/backend/utils/sort/logtape.c 1 1
src/include/storage/buffile.h 1 1
From b7145665b2b03d2081a7064aa2328dd79dab9297 Mon Sep 17 00:00:00 2001
From: Thomas Munro <thomas.munro@enterprisedb.com>
Date: Tue, 13 Nov 2018 22:28:40 +1300
Subject: [PATCH] Use 64 bit type for BufFileSize().

BufFileSize() can't use off_t, because it's only 32 bits wide on
some systems.  BufFile objects can have many 1GB segments so the
total size can exceed 2^31.  Bug #15460.

Back-patch to 11, where this function landed.

Discussion: https://postgr.es/m/15460-b6db80de822fa0ad%40postgresql.org
Discussion: https://postgr.es/m/CAHDGBJP_GsESbTt4P3FZA8kMUKuYxjg57XHF7NRBoKnR%3DCAR-g%40mail.gmail.com
---
 src/backend/storage/file/buffile.c | 6 +++---
 src/backend/utils/sort/logtape.c   | 2 +-
 src/include/storage/buffile.h      | 2 +-
 3 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/src/backend/storage/file/buffile.c b/src/backend/storage/file/buffile.c
index dd687dfe71f..d3722616bba 100644
--- a/src/backend/storage/file/buffile.c
+++ b/src/backend/storage/file/buffile.c
@@ -768,17 +768,17 @@ BufFileTellBlock(BufFile *file)
  * Counts any holes left behind by BufFileAppend as part of the size.
  * Returns -1 on error.
  */
-off_t
+int64
 BufFileSize(BufFile *file)
 {
-	off_t		lastFileSize;
+	int64		lastFileSize;
 
 	/* Get the size of the last physical file. */
 	lastFileSize = FileSize(file->files[file->numFiles - 1]);
 	if (lastFileSize < 0)
 		return -1;
 
-	return ((file->numFiles - 1) * (off_t) MAX_PHYSICAL_FILESIZE) +
+	return ((file->numFiles - 1) * (int64) MAX_PHYSICAL_FILESIZE) +
 		lastFileSize;
 }
 
diff --git a/src/backend/utils/sort/logtape.c b/src/backend/utils/sort/logtape.c
index 50a150b7136..269523d5f6a 100644
--- a/src/backend/utils/sort/logtape.c
+++ b/src/backend/utils/sort/logtape.c
@@ -426,7 +426,7 @@ ltsConcatWorkerTapes(LogicalTapeSet *lts, TapeShare *shared,
 	{
 		char		filename[MAXPGPATH];
 		BufFile    *file;
-		off_t		filesize;
+		int64		filesize;
 
 		lt = &lts->tapes[i];
 
diff --git a/src/include/storage/buffile.h b/src/include/storage/buffile.h
index a6cdeb451c1..a4043bd69d1 100644
--- a/src/include/storage/buffile.h
+++ b/src/include/storage/buffile.h
@@ -43,7 +43,7 @@ extern size_t BufFileWrite(BufFile *file, void *ptr, size_t size);
 extern int	BufFileSeek(BufFile *file, int fileno, off_t offset, int whence);
 extern void BufFileTell(BufFile *file, int *fileno, off_t *offset);
 extern int	BufFileSeekBlock(BufFile *file, long blknum);
-extern off_t BufFileSize(BufFile *file);
+extern int64 BufFileSize(BufFile *file);
 extern long BufFileAppend(BufFile *target, BufFile *source);
 
 extern BufFile *BufFileCreateShared(SharedFileSet *fileset, const char *name);
-- 
2.19.1