mirror of
https://git.postgresql.org/git/postgresql.git
synced 2026-02-14 18:37:03 +08:00
when we first read the page, rather than checking them one at a time. This allows us to take and release the buffer content lock just once per page, instead of once per tuple. Since it's a shared lock the contention penalty for holding the lock longer shouldn't be too bad. We can safely do this only when using an MVCC snapshot; else the assumption that visibility won't change over time is uncool. Therefore there are now two code paths depending on the snapshot type. I also made the same change in nodeBitmapHeapscan.c, where it can be done always because we only support MVCC snapshots for bitmap scans anyway. Also make some incidental cleanups in the APIs of these functions. Per a suggestion from Qingqing Zhou.
69 lines
1.4 KiB
C
69 lines
1.4 KiB
C
/*-------------------------------------------------------------------------
|
|
*
|
|
* valid.h
|
|
* POSTGRES tuple qualification validity definitions.
|
|
*
|
|
*
|
|
* Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
|
|
* Portions Copyright (c) 1994, Regents of the University of California
|
|
*
|
|
* $PostgreSQL: pgsql/src/include/access/valid.h,v 1.37 2005/11/26 03:03:07 tgl Exp $
|
|
*
|
|
*-------------------------------------------------------------------------
|
|
*/
|
|
#ifndef VALID_H
|
|
#define VALID_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 = FunctionCall2(&__cur_keys->sk_func, \
|
|
__atp, __cur_keys->sk_argument); \
|
|
\
|
|
if (!DatumGetBool(__test)) \
|
|
{ \
|
|
(result) = false; \
|
|
break; \
|
|
} \
|
|
} \
|
|
} while (0)
|
|
|
|
#endif /* VALID_H */
|