diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2016-06-03 18:34:05 -0400 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2016-06-03 18:34:05 -0400 |
commit | d50183c5786a21910bac566d2987f955c7bc1d62 (patch) | |
tree | 091fee1278b5d7d8b611846ff617e1dc7163a087 /src/backend/utils/adt/expandeddatum.c | |
parent | 9eaf5be5067571febf323337fc58bcac97b9f5d5 (diff) | |
download | postgresql-d50183c5786a21910bac566d2987f955c7bc1d62.tar.gz postgresql-d50183c5786a21910bac566d2987f955c7bc1d62.zip |
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.
Diffstat (limited to 'src/backend/utils/adt/expandeddatum.c')
-rw-r--r-- | src/backend/utils/adt/expandeddatum.c | 26 |
1 files changed, 4 insertions, 22 deletions
diff --git a/src/backend/utils/adt/expandeddatum.c b/src/backend/utils/adt/expandeddatum.c index 6bb5675e083..bc30150dde9 100644 --- a/src/backend/utils/adt/expandeddatum.c +++ b/src/backend/utils/adt/expandeddatum.c @@ -85,35 +85,17 @@ EOH_flatten_into(ExpandedObjectHeader *eohptr, } /* - * 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. * 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 -MakeExpandedObjectReadOnly(Datum d, bool isnull, int16 typlen) +MakeExpandedObjectReadOnlyInternal(Datum d) { 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 */ if (!VARATT_IS_EXTERNAL_EXPANDED_RW(DatumGetPointer(d))) return d; |