PostgreSQL Source Code  git master
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros
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-2017, 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 DEFAULT_COLLATION_OID always. This is appropriate
68  * for textual columns in system catalogs, and it will be ignored for
69  * non-textual columns, 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;
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 }
Oid sk_subtype
Definition: skey.h:69
Definition: fmgr.h:53
void ScanKeyEntryInitializeWithInfo(ScanKey entry, int flags, AttrNumber attributeNumber, StrategyNumber strategy, Oid subtype, Oid collation, FmgrInfo *finfo, Datum argument)
Definition: scankey.c:101
regproc RegProcedure
Definition: c.h:395
uint16 StrategyNumber
Definition: stratnum.h:22
#define MemSet(start, val, len)
Definition: c.h:857
unsigned int Oid
Definition: postgres_ext.h:31
void fmgr_info(Oid functionId, FmgrInfo *finfo)
Definition: fmgr.c:159
StrategyNumber sk_strategy
Definition: skey.h:68
void fmgr_info_copy(FmgrInfo *dstinfo, FmgrInfo *srcinfo, MemoryContext destcxt)
Definition: fmgr.c:583
void ScanKeyEntryInitialize(ScanKey entry, int flags, AttrNumber attributeNumber, StrategyNumber strategy, Oid subtype, Oid collation, RegProcedure procedure, Datum argument)
Definition: scankey.c:32
#define DEFAULT_COLLATION_OID
Definition: pg_collation.h:74
#define RegProcedureIsValid(p)
Definition: c.h:540
FmgrInfo sk_func
Definition: skey.h:71
#define SK_SEARCHNOTNULL
Definition: skey.h:122
MemoryContext CurrentMemoryContext
Definition: mcxt.c:37
uintptr_t Datum
Definition: postgres.h:372
#define InvalidOid
Definition: postgres_ext.h:36
int sk_flags
Definition: skey.h:66
#define Assert(condition)
Definition: c.h:675
Oid sk_collation
Definition: skey.h:70
void ScanKeyInit(ScanKey entry, AttrNumber attributeNumber, StrategyNumber strategy, RegProcedure procedure, Datum argument)
Definition: scankey.c:76
Datum sk_argument
Definition: skey.h:72
int16 AttrNumber
Definition: attnum.h:21
#define SK_SEARCHNULL
Definition: skey.h:121
AttrNumber sk_attno
Definition: skey.h:67