Ensure that pg_largeobject references opened by lo_import() or lo_export()
will be cleaned up at end of transaction, even when there is no other LO operation in the transaction. Per bug report from Daniel Schuchardt.
This commit is contained in:
parent
b85faa87b9
commit
9835944e54
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/libpq/be-fsstubs.c,v 1.74 2004/08/29 05:06:43 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/libpq/be-fsstubs.c,v 1.75 2004/09/11 15:56:46 tgl Exp $
|
||||
*
|
||||
* NOTES
|
||||
* This should be moved to a more appropriate place. It is here
|
||||
@ -65,6 +65,16 @@ static int cookies_size = 0;
|
||||
|
||||
static MemoryContext fscxt = NULL;
|
||||
|
||||
#define CreateFSContext() \
|
||||
do { \
|
||||
if (fscxt == NULL) \
|
||||
fscxt = AllocSetContextCreate(TopMemoryContext, \
|
||||
"Filesystem", \
|
||||
ALLOCSET_DEFAULT_MINSIZE, \
|
||||
ALLOCSET_DEFAULT_INITSIZE, \
|
||||
ALLOCSET_DEFAULT_MAXSIZE); \
|
||||
} while (0)
|
||||
|
||||
|
||||
static int newLOfd(LargeObjectDesc *lobjCookie);
|
||||
static void deleteLOfd(int fd);
|
||||
@ -87,12 +97,7 @@ lo_open(PG_FUNCTION_ARGS)
|
||||
elog(DEBUG4, "lo_open(%u,%d)", lobjId, mode);
|
||||
#endif
|
||||
|
||||
if (fscxt == NULL)
|
||||
fscxt = AllocSetContextCreate(TopMemoryContext,
|
||||
"Filesystem",
|
||||
ALLOCSET_DEFAULT_MINSIZE,
|
||||
ALLOCSET_DEFAULT_INITSIZE,
|
||||
ALLOCSET_DEFAULT_MAXSIZE);
|
||||
CreateFSContext();
|
||||
|
||||
currentContext = MemoryContextSwitchTo(fscxt);
|
||||
|
||||
@ -236,12 +241,7 @@ lo_creat(PG_FUNCTION_ARGS)
|
||||
MemoryContext currentContext;
|
||||
Oid lobjId;
|
||||
|
||||
if (fscxt == NULL)
|
||||
fscxt = AllocSetContextCreate(TopMemoryContext,
|
||||
"Filesystem",
|
||||
ALLOCSET_DEFAULT_MINSIZE,
|
||||
ALLOCSET_DEFAULT_INITSIZE,
|
||||
ALLOCSET_DEFAULT_MAXSIZE);
|
||||
CreateFSContext();
|
||||
|
||||
currentContext = MemoryContextSwitchTo(fscxt);
|
||||
|
||||
@ -379,6 +379,12 @@ lo_import(PG_FUNCTION_ARGS)
|
||||
errhint("Anyone can use the client-side lo_import() provided by libpq.")));
|
||||
#endif
|
||||
|
||||
/*
|
||||
* We don't actually need to switch into fscxt, but create it anyway
|
||||
* to ensure that AtEOXact_LargeObject knows there is state to clean up
|
||||
*/
|
||||
CreateFSContext();
|
||||
|
||||
/*
|
||||
* open the file to be read in
|
||||
*/
|
||||
@ -446,6 +452,12 @@ lo_export(PG_FUNCTION_ARGS)
|
||||
errhint("Anyone can use the client-side lo_export() provided by libpq.")));
|
||||
#endif
|
||||
|
||||
/*
|
||||
* We don't actually need to switch into fscxt, but create it anyway
|
||||
* to ensure that AtEOXact_LargeObject knows there is state to clean up
|
||||
*/
|
||||
CreateFSContext();
|
||||
|
||||
/*
|
||||
* open the inversion object (no need to test for failure)
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user