1 | /*------------------------------------------------------------------------- |
2 | * |
3 | * scankey.c |
4 | * scan key support code |
5 | * |
6 | * Portions Copyright (c) 1996-2019, 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 |
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) |
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 | { |
53 | Assert(flags & (SK_SEARCHNULL | SK_SEARCHNOTNULL)); |
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 |
76 | ScanKeyInit(ScanKey entry, |
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 |
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) |
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; |
116 | fmgr_info_copy(&entry->sk_func, finfo, CurrentMemoryContext); |
117 | } |
118 | |