Inline the easy cases in MakeExpandedObjectReadOnly().
This attempts to buy back some of whatever performance we lost from fixing bug #14174 by inlining the initial checks in MakeExpandedObjectReadOnly() into the callers. We can do that in a macro without creating multiple- evaluation hazards, so it's pretty much free notationally; and the amount of code added to callers should be minimal as well. (Testing a value can't take many more instructions than passing it to a subroutine.) Might as well inline DatumIsReadWriteExpandedObject() while we're at it. This is an ABI break for callers, so it doesn't seem safe to put into 9.5, but I see no reason not to do it in HEAD.
This commit is contained in:
parent
9eaf5be506
commit
d50183c578
|
@ -84,36 +84,18 @@ EOH_flatten_into(ExpandedObjectHeader *eohptr,
|
||||||
(*eohptr->eoh_methods->flatten_into) (eohptr, result, allocated_size);
|
(*eohptr->eoh_methods->flatten_into) (eohptr, result, allocated_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* Does the Datum represent a writable expanded object?
|
|
||||||
*/
|
|
||||||
bool
|
|
||||||
DatumIsReadWriteExpandedObject(Datum d, bool isnull, int16 typlen)
|
|
||||||
{
|
|
||||||
/* Reject if it's NULL or not a varlena type */
|
|
||||||
if (isnull || typlen != -1)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
/* Reject if not a read-write expanded-object pointer */
|
|
||||||
if (!VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(d)))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the Datum represents a R/W expanded object, change it to R/O.
|
* If the Datum represents a R/W expanded object, change it to R/O.
|
||||||
* Otherwise return the original Datum.
|
* Otherwise return the original Datum.
|
||||||
|
*
|
||||||
|
* Caller must ensure that the datum is a non-null varlena value. Typically
|
||||||
|
* this is invoked via MakeExpandedObjectReadOnly(), which checks that.
|
||||||
*/
|
*/
|
||||||
Datum
|
Datum
|
||||||
MakeExpandedObjectReadOnly(Datum d, bool isnull, int16 typlen)
|
MakeExpandedObjectReadOnlyInternal(Datum d)
|
||||||
{
|
{
|
||||||
ExpandedObjectHeader *eohptr;
|
ExpandedObjectHeader *eohptr;
|
||||||
|
|
||||||
/* Nothing to do if it's NULL or not a varlena type */
|
|
||||||
if (isnull || typlen != -1)
|
|
||||||
return d;
|
|
||||||
|
|
||||||
/* Nothing to do if not a read-write expanded-object pointer */
|
/* Nothing to do if not a read-write expanded-object pointer */
|
||||||
if (!VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(d)))
|
if (!VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(d)))
|
||||||
return d;
|
return d;
|
||||||
|
|
|
@ -136,6 +136,15 @@ struct ExpandedObjectHeader
|
||||||
#define EOHPGetRWDatum(eohptr) PointerGetDatum((eohptr)->eoh_rw_ptr)
|
#define EOHPGetRWDatum(eohptr) PointerGetDatum((eohptr)->eoh_rw_ptr)
|
||||||
#define EOHPGetRODatum(eohptr) PointerGetDatum((eohptr)->eoh_ro_ptr)
|
#define EOHPGetRODatum(eohptr) PointerGetDatum((eohptr)->eoh_ro_ptr)
|
||||||
|
|
||||||
|
/* Does the Datum represent a writable expanded object? */
|
||||||
|
#define DatumIsReadWriteExpandedObject(d, isnull, typlen) \
|
||||||
|
(((isnull) || (typlen) != -1) ? false : \
|
||||||
|
VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(d)))
|
||||||
|
|
||||||
|
#define MakeExpandedObjectReadOnly(d, isnull, typlen) \
|
||||||
|
(((isnull) || (typlen) != -1) ? (d) : \
|
||||||
|
MakeExpandedObjectReadOnlyInternal(d))
|
||||||
|
|
||||||
extern ExpandedObjectHeader *DatumGetEOHP(Datum d);
|
extern ExpandedObjectHeader *DatumGetEOHP(Datum d);
|
||||||
extern void EOH_init_header(ExpandedObjectHeader *eohptr,
|
extern void EOH_init_header(ExpandedObjectHeader *eohptr,
|
||||||
const ExpandedObjectMethods *methods,
|
const ExpandedObjectMethods *methods,
|
||||||
|
@ -143,8 +152,7 @@ extern void EOH_init_header(ExpandedObjectHeader *eohptr,
|
||||||
extern Size EOH_get_flat_size(ExpandedObjectHeader *eohptr);
|
extern Size EOH_get_flat_size(ExpandedObjectHeader *eohptr);
|
||||||
extern void EOH_flatten_into(ExpandedObjectHeader *eohptr,
|
extern void EOH_flatten_into(ExpandedObjectHeader *eohptr,
|
||||||
void *result, Size allocated_size);
|
void *result, Size allocated_size);
|
||||||
extern bool DatumIsReadWriteExpandedObject(Datum d, bool isnull, int16 typlen);
|
extern Datum MakeExpandedObjectReadOnlyInternal(Datum d);
|
||||||
extern Datum MakeExpandedObjectReadOnly(Datum d, bool isnull, int16 typlen);
|
|
||||||
extern Datum TransferExpandedObject(Datum d, MemoryContext new_parent);
|
extern Datum TransferExpandedObject(Datum d, MemoryContext new_parent);
|
||||||
extern void DeleteExpandedObject(Datum d);
|
extern void DeleteExpandedObject(Datum d);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue