| 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 | |