49 #include "utils/fmgroids.h"
140 Anum_pg_largeobject_metadata_oid,
144 pg_lo_meta =
table_open(LargeObjectMetadataRelationId,
148 LargeObjectMetadataOidIndexId,
true,
178 datafield = &(tuple->data);
182 datafield = (
bytea *)
190 errmsg(
"pg_largeobject entry for OID %u, page %d has invalid data field size %d",
191 tuple->loid, tuple->pageno,
len)));
192 *pdatafield = datafield;
271 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
272 errmsg(
"invalid flags for opening a large object: %d",
284 (
errcode(ERRCODE_UNDEFINED_OBJECT),
285 errmsg(
"large object %u does not exist", lobjId)));
296 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
297 errmsg(
"permission denied for large object %u",
308 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
309 errmsg(
"permission denied for large object %u",
318 retval->
flags = descflags;
356 object.
classId = LargeObjectRelationId;
357 object.objectId = lobjId;
358 object.objectSubId = 0;
390 Anum_pg_largeobject_loid,
412 elog(
ERROR,
"null field found in pg_largeobject");
447 newoffset = obj_desc->
offset + offset;
454 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
455 errmsg(
"invalid whence setting: %d", whence)));
466 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
470 obj_desc->
offset = newoffset;
505 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
506 errmsg(
"permission denied for large object %u",
515 Anum_pg_largeobject_loid,
520 Anum_pg_largeobject_pageno,
534 elog(
ERROR,
"null field found in pg_largeobject");
543 if (pageoff > obj_desc->
offset)
545 n = pageoff - obj_desc->
offset;
546 n = (n <= (nbytes - nread)) ? n : (nbytes - nread);
555 off = (int) (obj_desc->
offset - pageoff);
562 n = (n <= (nbytes - nread)) ? n : (nbytes - nread);
563 memcpy(
buf + nread,
VARDATA(datafield) + off, n);
603 char *workb =
VARDATA(&workbuf.hdr);
606 bool nulls[Natts_pg_largeobject];
607 bool replace[Natts_pg_largeobject];
616 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
617 errmsg(
"permission denied for large object %u",
626 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
627 errmsg(
"invalid large object write request size: %d",
635 Anum_pg_largeobject_loid,
640 Anum_pg_largeobject_pageno,
651 while (nwritten < nbytes)
662 elog(
ERROR,
"null field found in pg_largeobject");
664 Assert(olddata->pageno >= pageno);
666 neednextpage =
false;
673 if (olddata != NULL && olddata->pageno == pageno)
696 n = (n <= (nbytes - nwritten)) ? n : (nbytes - nwritten);
697 memcpy(workb + off,
buf + nwritten, n);
709 memset(nulls,
false,
sizeof(nulls));
710 memset(replace,
false,
sizeof(replace));
712 replace[Anum_pg_largeobject_data - 1] =
true;
741 n = (n <= (nbytes - nwritten)) ? n : (nbytes - nwritten);
742 memcpy(workb + off,
buf + nwritten, n);
753 memset(nulls,
false,
sizeof(nulls));
794 char *workb =
VARDATA(&workbuf.hdr);
797 bool nulls[Natts_pg_largeobject];
798 bool replace[Natts_pg_largeobject];
806 (
errcode(ERRCODE_INSUFFICIENT_PRIVILEGE),
807 errmsg(
"permission denied for large object %u",
816 (
errcode(ERRCODE_INVALID_PARAMETER_VALUE),
828 Anum_pg_largeobject_loid,
833 Anum_pg_largeobject_pageno,
848 elog(
ERROR,
"null field found in pg_largeobject");
850 Assert(olddata->pageno >= pageno);
858 if (olddata != NULL && olddata->pageno == pageno)
866 memcpy(workb,
VARDATA(datafield), pagelen);
875 MemSet(workb + pagelen, 0, off - pagelen);
884 memset(nulls,
false,
sizeof(nulls));
885 memset(replace,
false,
sizeof(replace));
887 replace[Anum_pg_largeobject_data - 1] =
true;
903 Assert(olddata->pageno > pageno);
923 memset(nulls,
false,
sizeof(nulls));
AclResult pg_largeobject_aclcheck_snapshot(Oid lobj_oid, Oid roleid, AclMode mode, Snapshot snapshot)
static Datum values[MAXATTR]
#define InvalidSubTransactionId
#define Assert(condition)
#define PointerIsValid(pointer)
#define MemSet(start, val, len)
void performDeletion(const ObjectAddress *object, DropBehavior behavior, int flags)
struct varlena * detoast_attr(struct varlena *attr)
int errmsg_internal(const char *fmt,...)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
void systable_endscan(SysScanDesc sysscan)
SysScanDesc systable_beginscan_ordered(Relation heapRelation, Relation indexRelation, Snapshot snapshot, int nkeys, ScanKey key)
HeapTuple systable_getnext(SysScanDesc sysscan)
void systable_endscan_ordered(SysScanDesc sysscan)
HeapTuple systable_getnext_ordered(SysScanDesc sysscan, ScanDirection direction)
SysScanDesc systable_beginscan(Relation heapRelation, Oid indexId, bool indexOK, Snapshot snapshot, int nkeys, ScanKey key)
HeapTuple heap_modify_tuple(HeapTuple tuple, TupleDesc tupleDesc, const Datum *replValues, const bool *replIsnull, const bool *doReplace)
HeapTuple heap_form_tuple(TupleDesc tupleDescriptor, const Datum *values, const bool *isnull)
void heap_freetuple(HeapTuple htup)
#define HeapTupleIsValid(tuple)
#define HeapTupleHasNulls(tuple)
void index_close(Relation relation, LOCKMODE lockmode)
Relation index_open(Oid relationId, LOCKMODE lockmode)
void CatalogTupleInsertWithInfo(Relation heapRel, HeapTuple tup, CatalogIndexState indstate)
void CatalogCloseIndexes(CatalogIndexState indstate)
CatalogIndexState CatalogOpenIndexes(Relation heapRel)
void CatalogTupleDelete(Relation heapRel, ItemPointer tid)
void CatalogTupleUpdateWithInfo(Relation heapRel, ItemPointer otid, HeapTuple tup, CatalogIndexState indstate)
static Relation lo_index_r
void inv_truncate(LargeObjectDesc *obj_desc, int64 len)
LargeObjectDesc * inv_open(Oid lobjId, int flags, MemoryContext mcxt)
int inv_read(LargeObjectDesc *obj_desc, char *buf, int nbytes)
static void getdatafield(Form_pg_largeobject tuple, bytea **pdatafield, int *plen, bool *pfreeit)
Oid inv_create(Oid lobjId)
static Relation lo_heap_r
static void open_lo_relation(void)
int64 inv_seek(LargeObjectDesc *obj_desc, int64 offset, int whence)
void close_lo_relation(bool isCommit)
int inv_write(LargeObjectDesc *obj_desc, const char *buf, int nbytes)
int64 inv_tell(LargeObjectDesc *obj_desc)
static bool myLargeObjectExists(Oid loid, Snapshot snapshot)
bool lo_compat_privileges
void inv_close(LargeObjectDesc *obj_desc)
static uint64 inv_getsize(LargeObjectDesc *obj_desc)
if(TABLE==NULL||TABLE_index==NULL)
#define MAX_LARGE_OBJECT_SIZE
void pfree(void *pointer)
void * MemoryContextAlloc(MemoryContext context, Size size)
#define InvokeObjectPostCreateHook(classId, objectId, subId)
#define ERRCODE_DATA_CORRUPTED
Oid LargeObjectCreate(Oid loid)
FormData_pg_largeobject * Form_pg_largeobject
void recordDependencyOnOwner(Oid classId, Oid objectId, Oid owner)
static Datum PointerGetDatum(const void *X)
static Datum ObjectIdGetDatum(Oid X)
static Datum Int32GetDatum(int32 X)
#define RelationGetDescr(relation)
ResourceOwner TopTransactionResourceOwner
ResourceOwner CurrentResourceOwner
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
Snapshot GetActiveSnapshot(void)
#define BTEqualStrategyNumber
#define BTGreaterEqualStrategyNumber
void table_close(Relation relation, LOCKMODE lockmode)
Relation table_open(Oid relationId, LOCKMODE lockmode)
#define VARATT_IS_EXTENDED(PTR)
#define SET_VARSIZE(PTR, len)
void CommandCounterIncrement(void)