Update copyright for 2022
[pgsql.git] / src / backend / access / common / scankey.c
blobff2b608f2efa93a6b8cf80bddba88b426bcaaa50
1 /*-------------------------------------------------------------------------
3 * scankey.c
4 * scan key support code
6 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
7 * Portions Copyright (c) 1994, Regents of the University of California
10 * IDENTIFICATION
11 * src/backend/access/common/scankey.c
13 *-------------------------------------------------------------------------
15 #include "postgres.h"
17 #include "access/skey.h"
18 #include "catalog/pg_collation.h"
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).
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.
31 void
32 ScanKeyEntryInitialize(ScanKey entry,
33 int flags,
34 AttrNumber attributeNumber,
35 StrategyNumber strategy,
36 Oid subtype,
37 Oid collation,
38 RegProcedure procedure,
39 Datum argument)
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))
49 fmgr_info(procedure, &entry->sk_func);
51 else
53 Assert(flags & (SK_SEARCHNULL | SK_SEARCHNOTNULL));
54 MemSet(&entry->sk_func, 0, sizeof(entry->sk_func));
59 * ScanKeyInit
60 * Shorthand version of ScanKeyEntryInitialize: flags and subtype
61 * are assumed to be zero (the usual value), and collation is defaulted.
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.
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.
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.
75 void
76 ScanKeyInit(ScanKey entry,
77 AttrNumber attributeNumber,
78 StrategyNumber strategy,
79 RegProcedure procedure,
80 Datum argument)
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);
92 * ScanKeyEntryInitializeWithInfo
93 * Initializes a scan key entry using an already-completed FmgrInfo
94 * function lookup record.
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.
100 void
101 ScanKeyEntryInitializeWithInfo(ScanKey entry,
102 int flags,
103 AttrNumber attributeNumber,
104 StrategyNumber strategy,
105 Oid subtype,
106 Oid collation,
107 FmgrInfo *finfo,
108 Datum argument)
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;
116 fmgr_info_copy(&entry->sk_func, finfo, CurrentMemoryContext);