|
|
|
|
@ -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 */ |
|
|
|
|
|