LCOV - differential code coverage report
Current view: top level - src/backend/utils/sort - sortsupport.c (source / functions) Coverage Total Hit UBC CBC
Current: Differential Code Coverage 16@8cea358b128 vs 17@8cea358b128 Lines: 87.9 % 58 51 7 51
Current Date: 2024-04-14 14:21:10 Functions: 100.0 % 6 6 6
Baseline: 16@8cea358b128 Branches: 40.0 % 40 16 24 16
Baseline Date: 2024-04-14 14:21:09 Line coverage date bins:
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed (240..) days: 87.9 % 58 51 7 51
Function coverage date bins:
(240..) days: 100.0 % 6 6 6
Branch coverage date bins:
(240..) days: 40.0 % 40 16 24 16

 Age         Owner                    Branch data    TLA  Line data    Source code
                                  1                 :                : /*-------------------------------------------------------------------------
                                  2                 :                :  *
                                  3                 :                :  * sortsupport.c
                                  4                 :                :  *    Support routines for accelerated sorting.
                                  5                 :                :  *
                                  6                 :                :  *
                                  7                 :                :  * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
                                  8                 :                :  * Portions Copyright (c) 1994, Regents of the University of California
                                  9                 :                :  *
                                 10                 :                :  * IDENTIFICATION
                                 11                 :                :  *    src/backend/utils/sort/sortsupport.c
                                 12                 :                :  *
                                 13                 :                :  *-------------------------------------------------------------------------
                                 14                 :                :  */
                                 15                 :                : 
                                 16                 :                : #include "postgres.h"
                                 17                 :                : 
                                 18                 :                : #include "access/gist.h"
                                 19                 :                : #include "access/nbtree.h"
                                 20                 :                : #include "fmgr.h"
                                 21                 :                : #include "utils/lsyscache.h"
                                 22                 :                : #include "utils/rel.h"
                                 23                 :                : #include "utils/sortsupport.h"
                                 24                 :                : 
                                 25                 :                : 
                                 26                 :                : /* Info needed to use an old-style comparison function as a sort comparator */
                                 27                 :                : typedef struct
                                 28                 :                : {
                                 29                 :                :     FmgrInfo    flinfo;         /* lookup data for comparison function */
                                 30                 :                :     FunctionCallInfoBaseData fcinfo;    /* reusable callinfo structure */
                                 31                 :                : } SortShimExtra;
                                 32                 :                : 
                                 33                 :                : #define SizeForSortShimExtra(nargs) (offsetof(SortShimExtra, fcinfo) + SizeForFunctionCallInfo(nargs))
                                 34                 :                : 
                                 35                 :                : /*
                                 36                 :                :  * Shim function for calling an old-style comparator
                                 37                 :                :  *
                                 38                 :                :  * This is essentially an inlined version of FunctionCall2Coll(), except
                                 39                 :                :  * we assume that the FunctionCallInfoBaseData was already mostly set up by
                                 40                 :                :  * PrepareSortSupportComparisonShim.
                                 41                 :                :  */
                                 42                 :                : static int
 4512 tgl@sss.pgh.pa.us          43                 :CBC    53951680 : comparison_shim(Datum x, Datum y, SortSupport ssup)
                                 44                 :                : {
                                 45                 :       53951680 :     SortShimExtra *extra = (SortShimExtra *) ssup->ssup_extra;
                                 46                 :                :     Datum       result;
                                 47                 :                : 
 1905 andres@anarazel.de         48                 :       53951680 :     extra->fcinfo.args[0].value = x;
                                 49                 :       53951680 :     extra->fcinfo.args[1].value = y;
                                 50                 :                : 
                                 51                 :                :     /* just for paranoia's sake, we reset isnull each time */
 4512 tgl@sss.pgh.pa.us          52                 :       53951680 :     extra->fcinfo.isnull = false;
                                 53                 :                : 
                                 54                 :       53951680 :     result = FunctionCallInvoke(&extra->fcinfo);
                                 55                 :                : 
                                 56                 :                :     /* Check for null result, since caller is clearly not expecting one */
                                 57         [ -  + ]:       53951680 :     if (extra->fcinfo.isnull)
 4512 tgl@sss.pgh.pa.us          58         [ #  # ]:UBC           0 :         elog(ERROR, "function %u returned NULL", extra->flinfo.fn_oid);
                                 59                 :                : 
 4512 tgl@sss.pgh.pa.us          60                 :CBC    53951680 :     return result;
                                 61                 :                : }
                                 62                 :                : 
                                 63                 :                : /*
                                 64                 :                :  * Set up a shim function to allow use of an old-style btree comparison
                                 65                 :                :  * function as if it were a sort support comparator.
                                 66                 :                :  */
                                 67                 :                : void
                                 68                 :          12412 : PrepareSortSupportComparisonShim(Oid cmpFunc, SortSupport ssup)
                                 69                 :                : {
                                 70                 :                :     SortShimExtra *extra;
                                 71                 :                : 
                                 72                 :          12412 :     extra = (SortShimExtra *) MemoryContextAlloc(ssup->ssup_cxt,
                                 73                 :                :                                                  SizeForSortShimExtra(2));
                                 74                 :                : 
                                 75                 :                :     /* Lookup the comparison function */
                                 76                 :          12412 :     fmgr_info_cxt(cmpFunc, &extra->flinfo, ssup->ssup_cxt);
                                 77                 :                : 
                                 78                 :                :     /* We can initialize the callinfo just once and re-use it */
                                 79                 :          12412 :     InitFunctionCallInfoData(extra->fcinfo, &extra->flinfo, 2,
                                 80                 :                :                              ssup->ssup_collation, NULL, NULL);
 1905 andres@anarazel.de         81                 :          12412 :     extra->fcinfo.args[0].isnull = false;
                                 82                 :          12412 :     extra->fcinfo.args[1].isnull = false;
                                 83                 :                : 
 4512 tgl@sss.pgh.pa.us          84                 :          12412 :     ssup->ssup_extra = extra;
                                 85                 :          12412 :     ssup->comparator = comparison_shim;
                                 86                 :          12412 : }
                                 87                 :                : 
                                 88                 :                : /*
                                 89                 :                :  * Look up and call sortsupport function to setup SortSupport comparator;
                                 90                 :                :  * or if no such function exists or it declines to set up the appropriate
                                 91                 :                :  * state, prepare a suitable shim.
                                 92                 :                :  */
                                 93                 :                : static void
 3446 rhaas@postgresql.org       94                 :         193564 : FinishSortSupportFunction(Oid opfamily, Oid opcintype, SortSupport ssup)
                                 95                 :                : {
                                 96                 :                :     Oid         sortSupportFunction;
                                 97                 :                : 
                                 98                 :                :     /* Look for a sort support function */
 3539                            99                 :         193564 :     sortSupportFunction = get_opfamily_proc(opfamily, opcintype, opcintype,
                                100                 :                :                                             BTSORTSUPPORT_PROC);
                                101         [ +  + ]:         193564 :     if (OidIsValid(sortSupportFunction))
                                102                 :                :     {
                                103                 :                :         /*
                                104                 :                :          * The sort support function can provide a comparator, but it can also
                                105                 :                :          * choose not to so (e.g. based on the selected collation).
                                106                 :                :          */
                                107                 :         181391 :         OidFunctionCall1(sortSupportFunction, PointerGetDatum(ssup));
                                108                 :                :     }
                                109                 :                : 
                                110         [ +  + ]:         193558 :     if (ssup->comparator == NULL)
                                111                 :                :     {
                                112                 :                :         Oid         sortFunction;
                                113                 :                : 
                                114                 :          12173 :         sortFunction = get_opfamily_proc(opfamily, opcintype, opcintype,
                                115                 :                :                                          BTORDER_PROC);
                                116                 :                : 
                                117         [ -  + ]:          12173 :         if (!OidIsValid(sortFunction))
 3539 rhaas@postgresql.org      118         [ #  # ]:UBC           0 :             elog(ERROR, "missing support function %d(%u,%u) in opfamily %u",
                                119                 :                :                  BTORDER_PROC, opcintype, opcintype, opfamily);
                                120                 :                : 
                                121                 :                :         /* We'll use a shim to call the old-style btree comparator */
 4512 tgl@sss.pgh.pa.us         122                 :CBC       12173 :         PrepareSortSupportComparisonShim(sortFunction, ssup);
                                123                 :                :     }
                                124                 :         193558 : }
                                125                 :                : 
                                126                 :                : /*
                                127                 :                :  * Fill in SortSupport given an ordering operator (btree "<" or ">" operator).
                                128                 :                :  *
                                129                 :                :  * Caller must previously have zeroed the SortSupportData structure and then
                                130                 :                :  * filled in ssup_cxt, ssup_collation, and ssup_nulls_first.  This will fill
                                131                 :                :  * in ssup_reverse as well as the comparator function pointer.
                                132                 :                :  */
                                133                 :                : void
 3446 rhaas@postgresql.org      134                 :         124944 : PrepareSortSupportFromOrderingOp(Oid orderingOp, SortSupport ssup)
                                135                 :                : {
                                136                 :                :     Oid         opfamily;
                                137                 :                :     Oid         opcintype;
                                138                 :                :     int16       strategy;
                                139                 :                : 
                                140         [ -  + ]:         124944 :     Assert(ssup->comparator == NULL);
                                141                 :                : 
                                142                 :                :     /* Find the operator in pg_amop */
                                143         [ -  + ]:         124944 :     if (!get_ordering_op_properties(orderingOp, &opfamily, &opcintype,
                                144                 :                :                                     &strategy))
 3446 rhaas@postgresql.org      145         [ #  # ]:UBC           0 :         elog(ERROR, "operator %u is not a valid ordering operator",
                                146                 :                :              orderingOp);
 3446 rhaas@postgresql.org      147                 :CBC      124944 :     ssup->ssup_reverse = (strategy == BTGreaterStrategyNumber);
                                148                 :                : 
                                149                 :         124944 :     FinishSortSupportFunction(opfamily, opcintype, ssup);
                                150                 :         124938 : }
                                151                 :                : 
                                152                 :                : /*
                                153                 :                :  * Fill in SortSupport given an index relation, attribute, and strategy.
                                154                 :                :  *
                                155                 :                :  * Caller must previously have zeroed the SortSupportData structure and then
                                156                 :                :  * filled in ssup_cxt, ssup_attno, ssup_collation, and ssup_nulls_first.  This
                                157                 :                :  * will fill in ssup_reverse (based on the supplied strategy), as well as the
                                158                 :                :  * comparator function pointer.
                                159                 :                :  */
                                160                 :                : void
                                161                 :          68620 : PrepareSortSupportFromIndexRel(Relation indexRel, int16 strategy,
                                162                 :                :                                SortSupport ssup)
                                163                 :                : {
                                164                 :          68620 :     Oid         opfamily = indexRel->rd_opfamily[ssup->ssup_attno - 1];
                                165                 :          68620 :     Oid         opcintype = indexRel->rd_opcintype[ssup->ssup_attno - 1];
                                166                 :                : 
                                167         [ -  + ]:          68620 :     Assert(ssup->comparator == NULL);
                                168                 :                : 
                                169         [ -  + ]:          68620 :     if (indexRel->rd_rel->relam != BTREE_AM_OID)
 3446 rhaas@postgresql.org      170         [ #  # ]:UBC           0 :         elog(ERROR, "unexpected non-btree AM: %u", indexRel->rd_rel->relam);
 3446 rhaas@postgresql.org      171   [ +  +  -  + ]:CBC       68620 :     if (strategy != BTGreaterStrategyNumber &&
                                172                 :                :         strategy != BTLessStrategyNumber)
 3446 rhaas@postgresql.org      173         [ #  # ]:UBC           0 :         elog(ERROR, "unexpected sort support strategy: %d", strategy);
 3446 rhaas@postgresql.org      174                 :CBC       68620 :     ssup->ssup_reverse = (strategy == BTGreaterStrategyNumber);
                                175                 :                : 
                                176                 :          68620 :     FinishSortSupportFunction(opfamily, opcintype, ssup);
                                177                 :          68620 : }
                                178                 :                : 
                                179                 :                : /*
                                180                 :                :  * Fill in SortSupport given a GiST index relation
                                181                 :                :  *
                                182                 :                :  * Caller must previously have zeroed the SortSupportData structure and then
                                183                 :                :  * filled in ssup_cxt, ssup_attno, ssup_collation, and ssup_nulls_first.  This
                                184                 :                :  * will fill in ssup_reverse (always false for GiST index build), as well as
                                185                 :                :  * the comparator function pointer.
                                186                 :                :  */
                                187                 :                : void
 1305 heikki.linnakangas@i      188                 :             75 : PrepareSortSupportFromGistIndexRel(Relation indexRel, SortSupport ssup)
                                189                 :                : {
                                190                 :             75 :     Oid         opfamily = indexRel->rd_opfamily[ssup->ssup_attno - 1];
                                191                 :             75 :     Oid         opcintype = indexRel->rd_opcintype[ssup->ssup_attno - 1];
                                192                 :                :     Oid         sortSupportFunction;
                                193                 :                : 
                                194         [ -  + ]:             75 :     Assert(ssup->comparator == NULL);
                                195                 :                : 
                                196         [ -  + ]:             75 :     if (indexRel->rd_rel->relam != GIST_AM_OID)
 1305 heikki.linnakangas@i      197         [ #  # ]:UBC           0 :         elog(ERROR, "unexpected non-gist AM: %u", indexRel->rd_rel->relam);
 1305 heikki.linnakangas@i      198                 :CBC          75 :     ssup->ssup_reverse = false;
                                199                 :                : 
                                200                 :                :     /*
                                201                 :                :      * Look up the sort support function. This is simpler than for B-tree
                                202                 :                :      * indexes because we don't support the old-style btree comparators.
                                203                 :                :      */
                                204                 :             75 :     sortSupportFunction = get_opfamily_proc(opfamily, opcintype, opcintype,
                                205                 :                :                                             GIST_SORTSUPPORT_PROC);
                                206         [ -  + ]:             75 :     if (!OidIsValid(sortSupportFunction))
 1305 heikki.linnakangas@i      207         [ #  # ]:UBC           0 :         elog(ERROR, "missing support function %d(%u,%u) in opfamily %u",
                                208                 :                :              GIST_SORTSUPPORT_PROC, opcintype, opcintype, opfamily);
 1305 heikki.linnakangas@i      209                 :CBC          75 :     OidFunctionCall1(sortSupportFunction, PointerGetDatum(ssup));
                                210                 :             75 : }
        

Generated by: LCOV version 2.1-beta2-3-g6141622