Coverage Report

Created: 2025-06-15 06:31

/src/postgres/src/backend/access/common/scankey.c
Line
Count
Source (jump to first uncovered line)
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"
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
0
{
41
0
  entry->sk_flags = flags;
42
0
  entry->sk_attno = attributeNumber;
43
0
  entry->sk_strategy = strategy;
44
0
  entry->sk_subtype = subtype;
45
0
  entry->sk_collation = collation;
46
0
  entry->sk_argument = argument;
47
0
  if (RegProcedureIsValid(procedure))
48
0
  {
49
0
    fmgr_info(procedure, &entry->sk_func);
50
0
  }
51
0
  else
52
0
  {
53
0
    Assert(flags & (SK_SEARCHNULL | SK_SEARCHNOTNULL));
54
0
    MemSet(&entry->sk_func, 0, sizeof(entry->sk_func));
55
0
  }
56
0
}
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
0
{
82
0
  entry->sk_flags = 0;
83
0
  entry->sk_attno = attributeNumber;
84
0
  entry->sk_strategy = strategy;
85
0
  entry->sk_subtype = InvalidOid;
86
0
  entry->sk_collation = C_COLLATION_OID;
87
0
  entry->sk_argument = argument;
88
0
  fmgr_info(procedure, &entry->sk_func);
89
0
}
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
0
{
110
0
  entry->sk_flags = flags;
111
0
  entry->sk_attno = attributeNumber;
112
0
  entry->sk_strategy = strategy;
113
0
  entry->sk_subtype = subtype;
114
0
  entry->sk_collation = collation;
115
0
  entry->sk_argument = argument;
116
0
  fmgr_info_copy(&entry->sk_func, finfo, CurrentMemoryContext);
117
0
}