Age Owner Branch data TLA Line data Source code
1 : : /*-------------------------------------------------------------------------
2 : : *
3 : : * skipsupport.c
4 : : * Support routines for B-Tree skip scan.
5 : : *
6 : : *
7 : : * Portions Copyright (c) 1996-2025, 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
155 pg@bowt.ie 30 :CBC 1885 : PrepareSkipSupportFromOpclass(Oid opfamily, Oid opcintype, bool reverse)
31 : : {
32 : : Oid skipSupportFunction;
33 : : SkipSupport sksup;
34 : :
35 : : /* Look for a skip support function */
36 : 1885 : skipSupportFunction = get_opfamily_proc(opfamily, opcintype, opcintype,
37 : : BTSKIPSUPPORT_PROC);
38 [ + + ]: 1885 : if (!OidIsValid(skipSupportFunction))
39 : 236 : return NULL;
40 : :
41 : 1649 : sksup = palloc(sizeof(SkipSupportData));
42 : 1649 : OidFunctionCall1(skipSupportFunction, PointerGetDatum(sksup));
43 : :
44 [ + + ]: 1649 : 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 : 1649 : return sksup;
61 : : }
|