mirror of https://github.com/postgres/postgres
Change fastgetattr and heap_getattr to inline functions
They were macros previously, but recent callsite additions made Coverity complain about one of the assertions being always true. This change could have been made a long time ago, but the Coverity complain broke the inertia. Reviewed-by: Michael Paquier <michael@paquier.xyz> Reviewed-by: Japin Li <japinli@hotmail.com> Reviewed-by: Peter Eisentraut <peter.eisentraut@enterprisedb.com> Discussion: https://postgr.es/m/202203241021.uts52sczx3al@alvherre.pgsql
This commit is contained in:
parent
0bd7af082a
commit
e27f4ee0a7
|
@ -1131,52 +1131,6 @@ heapgettup_pagemode(HeapScanDesc scan,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if defined(DISABLE_COMPLEX_MACRO)
|
|
||||||
/*
|
|
||||||
* This is formatted so oddly so that the correspondence to the macro
|
|
||||||
* definition in access/htup_details.h is maintained.
|
|
||||||
*/
|
|
||||||
Datum
|
|
||||||
fastgetattr(HeapTuple tup, int attnum, TupleDesc tupleDesc,
|
|
||||||
bool *isnull)
|
|
||||||
{
|
|
||||||
return (
|
|
||||||
(attnum) > 0 ?
|
|
||||||
(
|
|
||||||
(*(isnull) = false),
|
|
||||||
HeapTupleNoNulls(tup) ?
|
|
||||||
(
|
|
||||||
TupleDescAttr((tupleDesc), (attnum) - 1)->attcacheoff >= 0 ?
|
|
||||||
(
|
|
||||||
fetchatt(TupleDescAttr((tupleDesc), (attnum) - 1),
|
|
||||||
(char *) (tup)->t_data + (tup)->t_data->t_hoff +
|
|
||||||
TupleDescAttr((tupleDesc), (attnum) - 1)->attcacheoff)
|
|
||||||
)
|
|
||||||
:
|
|
||||||
nocachegetattr((tup), (attnum), (tupleDesc))
|
|
||||||
)
|
|
||||||
:
|
|
||||||
(
|
|
||||||
att_isnull((attnum) - 1, (tup)->t_data->t_bits) ?
|
|
||||||
(
|
|
||||||
(*(isnull) = true),
|
|
||||||
(Datum) NULL
|
|
||||||
)
|
|
||||||
:
|
|
||||||
(
|
|
||||||
nocachegetattr((tup), (attnum), (tupleDesc))
|
|
||||||
)
|
|
||||||
)
|
|
||||||
)
|
|
||||||
:
|
|
||||||
(
|
|
||||||
(Datum) NULL
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
#endif /* defined(DISABLE_COMPLEX_MACRO) */
|
|
||||||
|
|
||||||
|
|
||||||
/* ----------------------------------------------------------------
|
/* ----------------------------------------------------------------
|
||||||
* heap access method interface
|
* heap access method interface
|
||||||
* ----------------------------------------------------------------
|
* ----------------------------------------------------------------
|
||||||
|
|
|
@ -690,88 +690,6 @@ struct MinimalTupleData
|
||||||
#define HeapTupleClearHeapOnly(tuple) \
|
#define HeapTupleClearHeapOnly(tuple) \
|
||||||
HeapTupleHeaderClearHeapOnly((tuple)->t_data)
|
HeapTupleHeaderClearHeapOnly((tuple)->t_data)
|
||||||
|
|
||||||
|
|
||||||
/* ----------------
|
|
||||||
* fastgetattr
|
|
||||||
*
|
|
||||||
* Fetch a user attribute's value as a Datum (might be either a
|
|
||||||
* value, or a pointer into the data area of the tuple).
|
|
||||||
*
|
|
||||||
* This must not be used when a system attribute might be requested.
|
|
||||||
* Furthermore, the passed attnum MUST be valid. Use heap_getattr()
|
|
||||||
* instead, if in doubt.
|
|
||||||
*
|
|
||||||
* This gets called many times, so we macro the cacheable and NULL
|
|
||||||
* lookups, and call nocachegetattr() for the rest.
|
|
||||||
* ----------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
#if !defined(DISABLE_COMPLEX_MACRO)
|
|
||||||
|
|
||||||
#define fastgetattr(tup, attnum, tupleDesc, isnull) \
|
|
||||||
( \
|
|
||||||
AssertMacro((attnum) > 0), \
|
|
||||||
(*(isnull) = false), \
|
|
||||||
HeapTupleNoNulls(tup) ? \
|
|
||||||
( \
|
|
||||||
TupleDescAttr((tupleDesc), (attnum)-1)->attcacheoff >= 0 ? \
|
|
||||||
( \
|
|
||||||
fetchatt(TupleDescAttr((tupleDesc), (attnum)-1), \
|
|
||||||
(char *) (tup)->t_data + (tup)->t_data->t_hoff + \
|
|
||||||
TupleDescAttr((tupleDesc), (attnum)-1)->attcacheoff)\
|
|
||||||
) \
|
|
||||||
: \
|
|
||||||
nocachegetattr((tup), (attnum), (tupleDesc)) \
|
|
||||||
) \
|
|
||||||
: \
|
|
||||||
( \
|
|
||||||
att_isnull((attnum)-1, (tup)->t_data->t_bits) ? \
|
|
||||||
( \
|
|
||||||
(*(isnull) = true), \
|
|
||||||
(Datum)NULL \
|
|
||||||
) \
|
|
||||||
: \
|
|
||||||
( \
|
|
||||||
nocachegetattr((tup), (attnum), (tupleDesc)) \
|
|
||||||
) \
|
|
||||||
) \
|
|
||||||
)
|
|
||||||
#else /* defined(DISABLE_COMPLEX_MACRO) */
|
|
||||||
|
|
||||||
extern Datum fastgetattr(HeapTuple tup, int attnum, TupleDesc tupleDesc,
|
|
||||||
bool *isnull);
|
|
||||||
#endif /* defined(DISABLE_COMPLEX_MACRO) */
|
|
||||||
|
|
||||||
|
|
||||||
/* ----------------
|
|
||||||
* heap_getattr
|
|
||||||
*
|
|
||||||
* Extract an attribute of a heap tuple and return it as a Datum.
|
|
||||||
* This works for either system or user attributes. The given attnum
|
|
||||||
* is properly range-checked.
|
|
||||||
*
|
|
||||||
* If the field in question has a NULL value, we return a zero Datum
|
|
||||||
* and set *isnull == true. Otherwise, we set *isnull == false.
|
|
||||||
*
|
|
||||||
* <tup> is the pointer to the heap tuple. <attnum> is the attribute
|
|
||||||
* number of the column (field) caller wants. <tupleDesc> is a
|
|
||||||
* pointer to the structure describing the row and all its fields.
|
|
||||||
* ----------------
|
|
||||||
*/
|
|
||||||
#define heap_getattr(tup, attnum, tupleDesc, isnull) \
|
|
||||||
( \
|
|
||||||
((attnum) > 0) ? \
|
|
||||||
( \
|
|
||||||
((attnum) > (int) HeapTupleHeaderGetNatts((tup)->t_data)) ? \
|
|
||||||
getmissingattr((tupleDesc), (attnum), (isnull)) \
|
|
||||||
: \
|
|
||||||
fastgetattr((tup), (attnum), (tupleDesc), (isnull)) \
|
|
||||||
) \
|
|
||||||
: \
|
|
||||||
heap_getsysattr((tup), (attnum), (tupleDesc), (isnull)) \
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
/* prototypes for functions in common/heaptuple.c */
|
/* prototypes for functions in common/heaptuple.c */
|
||||||
extern Size heap_compute_data_size(TupleDesc tupleDesc,
|
extern Size heap_compute_data_size(TupleDesc tupleDesc,
|
||||||
Datum *values, bool *isnull);
|
Datum *values, bool *isnull);
|
||||||
|
@ -815,4 +733,73 @@ extern size_t varsize_any(void *p);
|
||||||
extern HeapTuple heap_expand_tuple(HeapTuple sourceTuple, TupleDesc tupleDesc);
|
extern HeapTuple heap_expand_tuple(HeapTuple sourceTuple, TupleDesc tupleDesc);
|
||||||
extern MinimalTuple minimal_expand_tuple(HeapTuple sourceTuple, TupleDesc tupleDesc);
|
extern MinimalTuple minimal_expand_tuple(HeapTuple sourceTuple, TupleDesc tupleDesc);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* fastgetattr
|
||||||
|
* Fetch a user attribute's value as a Datum (might be either a
|
||||||
|
* value, or a pointer into the data area of the tuple).
|
||||||
|
*
|
||||||
|
* This must not be used when a system attribute might be requested.
|
||||||
|
* Furthermore, the passed attnum MUST be valid. Use heap_getattr()
|
||||||
|
* instead, if in doubt.
|
||||||
|
*
|
||||||
|
* This gets called many times, so we macro the cacheable and NULL
|
||||||
|
* lookups, and call nocachegetattr() for the rest.
|
||||||
|
*/
|
||||||
|
static inline Datum
|
||||||
|
fastgetattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
|
||||||
|
{
|
||||||
|
AssertMacro(attnum > 0);
|
||||||
|
|
||||||
|
*isnull = false;
|
||||||
|
if (HeapTupleNoNulls(tup))
|
||||||
|
{
|
||||||
|
Form_pg_attribute att;
|
||||||
|
|
||||||
|
att = TupleDescAttr(tupleDesc, attnum - 1);
|
||||||
|
if (att->attcacheoff >= 0)
|
||||||
|
return fetchatt(att, (char *) tup->t_data + tup->t_data->t_hoff +
|
||||||
|
att->attcacheoff);
|
||||||
|
else
|
||||||
|
return nocachegetattr(tup, attnum, tupleDesc);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (att_isnull(attnum - 1, tup->t_data->t_bits))
|
||||||
|
{
|
||||||
|
*isnull = true;
|
||||||
|
return (Datum) NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return nocachegetattr(tup, attnum, tupleDesc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* heap_getattr
|
||||||
|
* Extract an attribute of a heap tuple and return it as a Datum.
|
||||||
|
* This works for either system or user attributes. The given attnum
|
||||||
|
* is properly range-checked.
|
||||||
|
*
|
||||||
|
* If the field in question has a NULL value, we return a zero Datum
|
||||||
|
* and set *isnull == true. Otherwise, we set *isnull == false.
|
||||||
|
*
|
||||||
|
* <tup> is the pointer to the heap tuple. <attnum> is the attribute
|
||||||
|
* number of the column (field) caller wants. <tupleDesc> is a
|
||||||
|
* pointer to the structure describing the row and all its fields.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static inline Datum
|
||||||
|
heap_getattr(HeapTuple tup, int attnum, TupleDesc tupleDesc, bool *isnull)
|
||||||
|
{
|
||||||
|
if (attnum > 0)
|
||||||
|
{
|
||||||
|
if (attnum > (int) HeapTupleHeaderGetNatts(tup->t_data))
|
||||||
|
return getmissingattr(tupleDesc, attnum, isnull);
|
||||||
|
else
|
||||||
|
return fastgetattr(tup, attnum, tupleDesc, isnull);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
return heap_getsysattr(tup, attnum, tupleDesc, isnull);
|
||||||
|
}
|
||||||
|
|
||||||
#endif /* HTUP_DETAILS_H */
|
#endif /* HTUP_DETAILS_H */
|
||||||
|
|
Loading…
Reference in New Issue