Deduplicate code in LargeObjectExists and myLargeObjectExists.

myLargeObjectExists() and LargeObjectExists() had nearly identical code,
except for handling snapshots. This commit renames myLargeObjectExists()
to LargeObjectExistsWithSnapshot() and refactors LargeObjectExists()
to call it internally, reducing duplication.

Author: Yugo Nagata
Reviewed-by: Fujii Masao
Discussion: https://postgr.es/m/20240702163444.ab586f6075e502eb84f11b1a@sranhm.sraoss.co.jp
This commit is contained in:
Fujii Masao 2024-09-12 21:45:42 +09:00
parent 23d0b48468
commit 412229d197
3 changed files with 13 additions and 42 deletions

View File

@ -14,8 +14,6 @@
*/ */
#include "postgres.h" #include "postgres.h"
#include "access/genam.h"
#include "access/htup_details.h"
#include "access/table.h" #include "access/table.h"
#include "catalog/catalog.h" #include "catalog/catalog.h"
#include "catalog/indexing.h" #include "catalog/indexing.h"
@ -153,6 +151,15 @@ LargeObjectDrop(Oid loid)
*/ */
bool bool
LargeObjectExists(Oid loid) LargeObjectExists(Oid loid)
{
return LargeObjectExistsWithSnapshot(loid, NULL);
}
/*
* Same as LargeObjectExists(), except snapshot to read with can be specified.
*/
bool
LargeObjectExistsWithSnapshot(Oid loid, Snapshot snapshot)
{ {
Relation pg_lo_meta; Relation pg_lo_meta;
ScanKeyData skey[1]; ScanKeyData skey[1];
@ -170,7 +177,7 @@ LargeObjectExists(Oid loid)
sd = systable_beginscan(pg_lo_meta, sd = systable_beginscan(pg_lo_meta,
LargeObjectMetadataOidIndexId, true, LargeObjectMetadataOidIndexId, true,
NULL, 1, skey); snapshot, 1, skey);
tuple = systable_getnext(sd); tuple = systable_getnext(sd);
if (HeapTupleIsValid(tuple)) if (HeapTupleIsValid(tuple))

View File

@ -41,7 +41,6 @@
#include "catalog/indexing.h" #include "catalog/indexing.h"
#include "catalog/objectaccess.h" #include "catalog/objectaccess.h"
#include "catalog/pg_largeobject.h" #include "catalog/pg_largeobject.h"
#include "catalog/pg_largeobject_metadata.h"
#include "libpq/libpq-fs.h" #include "libpq/libpq-fs.h"
#include "miscadmin.h" #include "miscadmin.h"
#include "storage/large_object.h" #include "storage/large_object.h"
@ -123,43 +122,6 @@ close_lo_relation(bool isCommit)
} }
/*
* Same as pg_largeobject.c's LargeObjectExists(), except snapshot to
* read with can be specified.
*/
static bool
myLargeObjectExists(Oid loid, Snapshot snapshot)
{
Relation pg_lo_meta;
ScanKeyData skey[1];
SysScanDesc sd;
HeapTuple tuple;
bool retval = false;
ScanKeyInit(&skey[0],
Anum_pg_largeobject_metadata_oid,
BTEqualStrategyNumber, F_OIDEQ,
ObjectIdGetDatum(loid));
pg_lo_meta = table_open(LargeObjectMetadataRelationId,
AccessShareLock);
sd = systable_beginscan(pg_lo_meta,
LargeObjectMetadataOidIndexId, true,
snapshot, 1, skey);
tuple = systable_getnext(sd);
if (HeapTupleIsValid(tuple))
retval = true;
systable_endscan(sd);
table_close(pg_lo_meta, AccessShareLock);
return retval;
}
/* /*
* Extract data field from a pg_largeobject tuple, detoasting if needed * Extract data field from a pg_largeobject tuple, detoasting if needed
* and verifying that the length is sane. Returns data pointer (a bytea *), * and verifying that the length is sane. Returns data pointer (a bytea *),
@ -279,7 +241,7 @@ inv_open(Oid lobjId, int flags, MemoryContext mcxt)
snapshot = GetActiveSnapshot(); snapshot = GetActiveSnapshot();
/* Can't use LargeObjectExists here because we need to specify snapshot */ /* Can't use LargeObjectExists here because we need to specify snapshot */
if (!myLargeObjectExists(lobjId, snapshot)) if (!LargeObjectExistsWithSnapshot(lobjId, snapshot))
ereport(ERROR, ereport(ERROR,
(errcode(ERRCODE_UNDEFINED_OBJECT), (errcode(ERRCODE_UNDEFINED_OBJECT),
errmsg("large object %u does not exist", lobjId))); errmsg("large object %u does not exist", lobjId)));

View File

@ -20,6 +20,7 @@
#include "catalog/genbki.h" #include "catalog/genbki.h"
#include "catalog/pg_largeobject_d.h" #include "catalog/pg_largeobject_d.h"
#include "utils/snapshot.h"
/* ---------------- /* ----------------
* pg_largeobject definition. cpp turns this into * pg_largeobject definition. cpp turns this into
@ -49,5 +50,6 @@ DECLARE_UNIQUE_INDEX_PKEY(pg_largeobject_loid_pn_index, 2683, LargeObjectLOidPNI
extern Oid LargeObjectCreate(Oid loid); extern Oid LargeObjectCreate(Oid loid);
extern void LargeObjectDrop(Oid loid); extern void LargeObjectDrop(Oid loid);
extern bool LargeObjectExists(Oid loid); extern bool LargeObjectExists(Oid loid);
extern bool LargeObjectExistsWithSnapshot(Oid loid, Snapshot snapshot);
#endif /* PG_LARGEOBJECT_H */ #endif /* PG_LARGEOBJECT_H */