LCOV - code coverage report
Current view: top level - src/backend/utils/adt - skipsupport.c (source / functions) Hit Total Coverage
Test: PostgreSQL 18devel Lines: 14 14 100.0 %
Date: 2025-04-24 12:15:10 Functions: 1 1 100.0 %
Legend: Lines: hit not hit

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

Generated by: LCOV version 1.14