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-2025, 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"
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 */
31void
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 */
75void
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 */
100void
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:748
regproc RegProcedure
Definition: c.h:621
#define MemSet(start, val, len)
Definition: c.h:991
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(PointerIsAligned(start, uint64))
MemoryContext CurrentMemoryContext
Definition: mcxt.c:143
uintptr_t Datum
Definition: postgres.h:69
#define InvalidOid
Definition: postgres_ext.h:35
unsigned int Oid
Definition: postgres_ext.h:30
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