1 /*-------------------------------------------------------------------------
2  *
3  * valid.h
4  *	  POSTGRES tuple qualification validity definitions.
5  *
6  *
7  * Portions Copyright (c) 1996-2016, PostgreSQL Global Development Group
8  * Portions Copyright (c) 1994, Regents of the University of California
9  *
10  * src/include/access/valid.h
11  *
12  *-------------------------------------------------------------------------
13  */
14 #ifndef VALID_H
15 #define VALID_H
16 
17 /*
18  *		HeapKeyTest
19  *
20  *		Test a heap tuple to see if it satisfies a scan key.
21  */
22 #define HeapKeyTest(tuple, \
23 					tupdesc, \
24 					nkeys, \
25 					keys, \
26 					result) \
27 do \
28 { \
29 	/* Use underscores to protect the variables passed in as parameters */ \
30 	int			__cur_nkeys = (nkeys); \
31 	ScanKey		__cur_keys = (keys); \
32  \
33 	(result) = true; /* may change */ \
34 	for (; __cur_nkeys--; __cur_keys++) \
35 	{ \
36 		Datum	__atp; \
37 		bool	__isnull; \
38 		Datum	__test; \
39  \
40 		if (__cur_keys->sk_flags & SK_ISNULL) \
41 		{ \
42 			(result) = false; \
43 			break; \
44 		} \
45  \
46 		__atp = heap_getattr((tuple), \
47 							 __cur_keys->sk_attno, \
48 							 (tupdesc), \
49 							 &__isnull); \
50  \
51 		if (__isnull) \
52 		{ \
53 			(result) = false; \
54 			break; \
55 		} \
56  \
57 		__test = FunctionCall2Coll(&__cur_keys->sk_func, \
58 								   __cur_keys->sk_collation, \
59 								   __atp, __cur_keys->sk_argument); \
60  \
61 		if (!DatumGetBool(__test)) \
62 		{ \
63 			(result) = false; \
64 			break; \
65 		} \
66 	} \
67 } while (0)
68 
69 #endif   /* VALID_H */
70