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 */
31void
32ScanKeyEntryInitialize(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 */
75void
76ScanKeyInit(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 */
100void
101ScanKeyEntryInitializeWithInfo(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