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 30 3768 : PrepareSkipSupportFromOpclass(Oid opfamily, Oid opcintype, bool reverse) 31 : { 32 : Oid skipSupportFunction; 33 : SkipSupport sksup; 34 : 35 : /* Look for a skip support function */ 36 3768 : skipSupportFunction = get_opfamily_proc(opfamily, opcintype, opcintype, 37 : BTSKIPSUPPORT_PROC); 38 3768 : if (!OidIsValid(skipSupportFunction)) 39 500 : return NULL; 40 : 41 3268 : sksup = palloc(sizeof(SkipSupportData)); 42 3268 : OidFunctionCall1(skipSupportFunction, PointerGetDatum(sksup)); 43 : 44 3268 : if (reverse) 45 : { 46 : /* 47 : * DESC/reverse case: swap low_elem with high_elem, and swap decrement 48 : * with increment 49 : */ 50 72 : Datum low_elem = sksup->low_elem; 51 72 : SkipSupportIncDec decrement = sksup->decrement; 52 : 53 72 : sksup->low_elem = sksup->high_elem; 54 72 : sksup->decrement = sksup->increment; 55 : 56 72 : sksup->high_elem = low_elem; 57 72 : sksup->increment = decrement; 58 : } 59 : 60 3268 : return sksup; 61 : }