Line data Source code
1 : /*-------------------------------------------------------------------------
2 : *
3 : * skipsupport.c
4 : * Support routines for B-Tree skip scan.
5 : *
6 : *
7 : * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
8 : * Portions Copyright (c) 1994, Regents of the University of California
9 : *
10 : * IDENTIFICATION
11 : * src/backend/utils/adt/skipsupport.c
12 : *
13 : *-------------------------------------------------------------------------
14 : */
15 :
16 : #include "postgres.h"
17 :
18 : #include "access/nbtree.h"
19 : #include "utils/lsyscache.h"
20 : #include "utils/skipsupport.h"
21 :
22 : /*
23 : * Fill in SkipSupport given an operator class (opfamily + opcintype).
24 : *
25 : * On success, returns skip support struct, allocating in caller's memory
26 : * context. Otherwise returns NULL, indicating that operator class has no
27 : * skip support function.
28 : */
29 : SkipSupport
30 2085 : PrepareSkipSupportFromOpclass(Oid opfamily, Oid opcintype, bool reverse)
31 : {
32 : Oid skipSupportFunction;
33 : SkipSupport sksup;
34 :
35 : /* Look for a skip support function */
36 2085 : skipSupportFunction = get_opfamily_proc(opfamily, opcintype, opcintype,
37 : BTSKIPSUPPORT_PROC);
38 2085 : if (!OidIsValid(skipSupportFunction))
39 267 : return NULL;
40 :
41 1818 : sksup = palloc_object(SkipSupportData);
42 1818 : OidFunctionCall1(skipSupportFunction, PointerGetDatum(sksup));
43 :
44 1818 : if (reverse)
45 : {
46 : /*
47 : * DESC/reverse case: swap low_elem with high_elem, and swap decrement
48 : * with increment
49 : */
50 36 : Datum low_elem = sksup->low_elem;
51 36 : SkipSupportIncDec decrement = sksup->decrement;
52 :
53 36 : sksup->low_elem = sksup->high_elem;
54 36 : sksup->decrement = sksup->increment;
55 :
56 36 : sksup->high_elem = low_elem;
57 36 : sksup->increment = decrement;
58 : }
59 :
60 1818 : return sksup;
61 : }
|