PostgreSQL Source Code  git master
scankey.c
Go to the documentation of this file.
1 /*-------------------------------------------------------------------------
2  *
3  * scankey.c
4  * scan key support code
5  *
6  * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
7  * Portions Copyright (c) 1994, Regents of the University of California
8  *
9  *
10  * IDENTIFICATION
11  * src/backend/access/common/scankey.c
12  *
13  *-------------------------------------------------------------------------
14  */
15 #include "postgres.h"
16 
17 #include "access/skey.h"
18 #include "catalog/pg_collation.h"
19 
20 
21 /*
22  * ScanKeyEntryInitialize
23  * Initializes a scan key entry given all the field values.
24  * The target procedure is specified by OID (but can be invalid
25  * if SK_SEARCHNULL or SK_SEARCHNOTNULL is set).
26  *
27  * Note: CurrentMemoryContext at call should be as long-lived as the ScanKey
28  * itself, because that's what will be used for any subsidiary info attached
29  * to the ScanKey's FmgrInfo record.
30  */
31 void
33  int flags,
34  AttrNumber attributeNumber,
35  StrategyNumber strategy,
36  Oid subtype,
37  Oid collation,
38  RegProcedure procedure,
39  Datum argument)
40 {
41  entry->sk_flags = flags;
42  entry->sk_attno = attributeNumber;
43  entry->sk_strategy = strategy;
44  entry->sk_subtype = subtype;
45  entry->sk_collation = collation;
46  entry->sk_argument = argument;
47  if (RegProcedureIsValid(procedure))
48  {
49  fmgr_info(procedure, &entry->sk_func);
50  }
51  else
52  {
54  MemSet(&entry->sk_func, 0, sizeof(entry->sk_func));
55  }
56 }
57 
58 /*
59  * ScanKeyInit
60  * Shorthand version of ScanKeyEntryInitialize: flags and subtype
61  * are assumed to be zero (the usual value), and collation is defaulted.
62  *
63  * This is the recommended version for hardwired lookups in system catalogs.
64  * It cannot handle NULL arguments, unary operators, or nondefault operators,
65  * but we need none of those features for most hardwired lookups.
66  *
67  * We set collation to C_COLLATION_OID always. This is the correct value
68  * for all collation-aware columns in system catalogs, and it will be ignored
69  * for other column types, so it's not worth trying to be more finicky.
70  *
71  * Note: CurrentMemoryContext at call should be as long-lived as the ScanKey
72  * itself, because that's what will be used for any subsidiary info attached
73  * to the ScanKey's FmgrInfo record.
74  */
75 void
77  AttrNumber attributeNumber,
78  StrategyNumber strategy,
79  RegProcedure procedure,
80  Datum argument)
81 {
82  entry->sk_flags = 0;
83  entry->sk_attno = attributeNumber;
84  entry->sk_strategy = strategy;
85  entry->sk_subtype = InvalidOid;
86  entry->sk_collation = C_COLLATION_OID;
87  entry->sk_argument = argument;
88  fmgr_info(procedure, &entry->sk_func);
89 }
90 
91 /*
92  * ScanKeyEntryInitializeWithInfo
93  * Initializes a scan key entry using an already-completed FmgrInfo
94  * function lookup record.
95  *
96  * Note: CurrentMemoryContext at call should be as long-lived as the ScanKey
97  * itself, because that's what will be used for any subsidiary info attached
98  * to the ScanKey's FmgrInfo record.
99  */
100 void
102  int flags,
103  AttrNumber attributeNumber,
104  StrategyNumber strategy,
105  Oid subtype,
106  Oid collation,
107  FmgrInfo *finfo,
108  Datum argument)
109 {
110  entry->sk_flags = flags;
111  entry->sk_attno = attributeNumber;
112  entry->sk_strategy = strategy;
113  entry->sk_subtype = subtype;
114  entry->sk_collation = collation;
115  entry->sk_argument = argument;
117 }
int16 AttrNumber
Definition: attnum.h:21
#define RegProcedureIsValid(p)
Definition: c.h:764
regproc RegProcedure
Definition: c.h:637
#define MemSet(start, val, len)
Definition: c.h:1007
void fmgr_info(Oid functionId, FmgrInfo *finfo)
Definition: fmgr.c:127
void fmgr_info_copy(FmgrInfo *dstinfo, FmgrInfo *srcinfo, MemoryContext destcxt)
Definition: fmgr.c:580
Assert(fmt[strlen(fmt) - 1] !='\n')
MemoryContext CurrentMemoryContext
Definition: mcxt.c:131
uintptr_t Datum
Definition: postgres.h:64
#define InvalidOid
Definition: postgres_ext.h:36
unsigned int Oid
Definition: postgres_ext.h:31
void ScanKeyEntryInitialize(ScanKey entry, int flags, AttrNumber attributeNumber, StrategyNumber strategy, Oid subtype, Oid collation, RegProcedure procedure, Datum argument)
Definition: scankey.c:32
void ScanKeyEntryInitializeWithInfo(ScanKey entry, int flags, AttrNumber attributeNumber, StrategyNumber strategy, Oid subtype, Oid collation, FmgrInfo *finfo, Datum argument)
Definition: scankey.c:101
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
Definition: scankey.c:76
#define SK_SEARCHNOTNULL
Definition: skey.h:122
#define SK_SEARCHNULL
Definition: skey.h:121
uint16 StrategyNumber
Definition: stratnum.h:22
Definition: fmgr.h:57
int sk_flags
Definition: skey.h:66
Datum sk_argument
Definition: skey.h:72
FmgrInfo sk_func
Definition: skey.h:71
Oid sk_subtype
Definition: skey.h:69
Oid sk_collation
Definition: skey.h:70
StrategyNumber sk_strategy
Definition: skey.h:68
AttrNumber sk_attno
Definition: skey.h:67