1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-20 05:03:10 +03:00

Turn HeapKeyTest macro into inline function

It is easier to read as a function.

Author: Melanie Plageman <melanieplageman@gmail.com>
Reviewed-by: Andres Freund <andres@anarazel.de>
Discussion: https://www.postgresql.org/message-id/flat/CAAKRu_YSOnhKsDyFcqJsKtBSrd32DP-jjXmv7hL0BPD-z0TGXQ@mail.gmail.com
This commit is contained in:
Peter Eisentraut
2022-11-16 13:25:59 +01:00
parent c0f1e51ac7
commit 4eb3b11200
2 changed files with 39 additions and 50 deletions

View File

@ -719,8 +719,8 @@ heapgettup(HeapScanDesc scan,
snapshot);
if (valid && key != NULL)
HeapKeyTest(tuple, RelationGetDescr(scan->rs_base.rs_rd),
nkeys, key, valid);
valid = HeapKeyTest(tuple, RelationGetDescr(scan->rs_base.rs_rd),
nkeys, key);
if (valid)
{
@ -1035,8 +1035,8 @@ heapgettup_pagemode(HeapScanDesc scan,
{
bool valid;
HeapKeyTest(tuple, RelationGetDescr(scan->rs_base.rs_rd),
nkeys, key, valid);
valid = HeapKeyTest(tuple, RelationGetDescr(scan->rs_base.rs_rd),
nkeys, key);
if (valid)
{
scan->rs_cindex = lineindex;

View File

@ -14,56 +14,45 @@
#ifndef VALID_H
#define VALID_H
#include "access/htup.h"
#include "access/htup_details.h"
#include "access/skey.h"
#include "access/tupdesc.h"
/*
* HeapKeyTest
*
* Test a heap tuple to see if it satisfies a scan key.
*/
#define HeapKeyTest(tuple, \
tupdesc, \
nkeys, \
keys, \
result) \
do \
{ \
/* Use underscores to protect the variables passed in as parameters */ \
int __cur_nkeys = (nkeys); \
ScanKey __cur_keys = (keys); \
\
(result) = true; /* may change */ \
for (; __cur_nkeys--; __cur_keys++) \
{ \
Datum __atp; \
bool __isnull; \
Datum __test; \
\
if (__cur_keys->sk_flags & SK_ISNULL) \
{ \
(result) = false; \
break; \
} \
\
__atp = heap_getattr((tuple), \
__cur_keys->sk_attno, \
(tupdesc), \
&__isnull); \
\
if (__isnull) \
{ \
(result) = false; \
break; \
} \
\
__test = FunctionCall2Coll(&__cur_keys->sk_func, \
__cur_keys->sk_collation, \
__atp, __cur_keys->sk_argument); \
\
if (!DatumGetBool(__test)) \
{ \
(result) = false; \
break; \
} \
} \
} while (0)
static inline bool
HeapKeyTest(HeapTuple tuple, TupleDesc tupdesc, int nkeys, ScanKey keys)
{
int cur_nkeys = nkeys;
ScanKey cur_key = keys;
for (; cur_nkeys--; cur_key++)
{
Datum atp;
bool isnull;
Datum test;
if (cur_key->sk_flags & SK_ISNULL)
return false;
atp = heap_getattr(tuple, cur_key->sk_attno, tupdesc, &isnull);
if (isnull)
return false;
test = FunctionCall2Coll(&cur_key->sk_func,
cur_key->sk_collation,
atp, cur_key->sk_argument);
if (!DatumGetBool(test))
return false;
}
return true;
}
#endif /* VALID_H */