LCOV - differential code coverage report
Current view: top level - contrib/intarray - _int_gin.c (source / functions) Coverage Total Hit UBC CBC
Current: Differential Code Coverage 16@8cea358b128 vs 17@8cea358b128 Lines: 92.1 % 89 82 7 82
Current Date: 2024-04-14 14:21:10 Functions: 100.0 % 4 4 4
Baseline: 16@8cea358b128 Branches: 67.3 % 49 33 16 33
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: 92.1 % 89 82 7 82
Function coverage date bins:
(240..) days: 100.0 % 4 4 4
Branch coverage date bins:
(240..) days: 67.3 % 49 33 16 33

 Age         Owner                    Branch data    TLA  Line data    Source code
                                  1                 :                : /*
                                  2                 :                :  * contrib/intarray/_int_gin.c
                                  3                 :                :  */
                                  4                 :                : #include "postgres.h"
                                  5                 :                : 
                                  6                 :                : #include "_int.h"
                                  7                 :                : #include "access/gin.h"
                                  8                 :                : #include "access/stratnum.h"
                                  9                 :                : 
 6556 teodor@sigaev.ru           10                 :CBC           2 : PG_FUNCTION_INFO_V1(ginint4_queryextract);
                                 11                 :                : 
                                 12                 :                : Datum
 6402 bruce@momjian.us           13                 :             26 : ginint4_queryextract(PG_FUNCTION_ARGS)
                                 14                 :                : {
 6283 teodor@sigaev.ru           15                 :             26 :     int32      *nentries = (int32 *) PG_GETARG_POINTER(1);
 6402 bruce@momjian.us           16                 :             26 :     StrategyNumber strategy = PG_GETARG_UINT16(2);
 4844 tgl@sss.pgh.pa.us          17                 :             26 :     int32      *searchMode = (int32 *) PG_GETARG_POINTER(6);
 6402 bruce@momjian.us           18                 :             26 :     Datum      *res = NULL;
                                 19                 :                : 
 6556 teodor@sigaev.ru           20                 :             26 :     *nentries = 0;
                                 21                 :                : 
 6402 bruce@momjian.us           22         [ +  + ]:             26 :     if (strategy == BooleanSearchStrategy)
                                 23                 :                :     {
 4844 tgl@sss.pgh.pa.us          24                 :             12 :         QUERYTYPE  *query = PG_GETARG_QUERYTYPE_P(0);
 6402 bruce@momjian.us           25                 :             12 :         ITEM       *items = GETQUERY(query);
                                 26                 :                :         int         i;
                                 27                 :                : 
                                 28                 :                :         /* empty query must fail */
 4844 tgl@sss.pgh.pa.us          29         [ -  + ]:             12 :         if (query->size <= 0)
 6556 teodor@sigaev.ru           30                 :UBC           0 :             PG_RETURN_POINTER(NULL);
                                 31                 :                : 
                                 32                 :                :         /*
                                 33                 :                :          * If the query doesn't have any required primitive values (for
                                 34                 :                :          * instance, it's something like '! 42'), we have to do a full index
                                 35                 :                :          * scan.
                                 36                 :                :          */
 4844 tgl@sss.pgh.pa.us          37         [ +  + ]:CBC          12 :         if (query_has_required_values(query))
                                 38                 :              8 :             *searchMode = GIN_SEARCH_MODE_DEFAULT;
                                 39                 :                :         else
                                 40                 :              4 :             *searchMode = GIN_SEARCH_MODE_ALL;
                                 41                 :                : 
                                 42                 :                :         /*
                                 43                 :                :          * Extract all the VAL items as things we want GIN to check for.
                                 44                 :                :          */
 6402 bruce@momjian.us           45                 :             12 :         res = (Datum *) palloc(sizeof(Datum) * query->size);
 6556 teodor@sigaev.ru           46                 :             12 :         *nentries = 0;
                                 47                 :                : 
 6402 bruce@momjian.us           48         [ +  + ]:             62 :         for (i = 0; i < query->size; i++)
                                 49                 :                :         {
                                 50         [ +  + ]:             50 :             if (items[i].type == VAL)
                                 51                 :                :             {
                                 52                 :             28 :                 res[*nentries] = Int32GetDatum(items[i].val);
 6556 teodor@sigaev.ru           53                 :             28 :                 (*nentries)++;
                                 54                 :                :             }
                                 55                 :                :         }
                                 56                 :                :     }
                                 57                 :                :     else
                                 58                 :                :     {
 6402 bruce@momjian.us           59                 :             14 :         ArrayType  *query = PG_GETARG_ARRAYTYPE_P(0);
                                 60                 :                : 
 6556 teodor@sigaev.ru           61   [ -  +  -  -  :             14 :         CHECKARRVALID(query);
                                              -  - ]
 6402 bruce@momjian.us           62                 :             14 :         *nentries = ARRNELEMS(query);
                                 63         [ +  - ]:             14 :         if (*nentries > 0)
                                 64                 :                :         {
                                 65                 :                :             int32      *arr;
                                 66                 :                :             int32       i;
                                 67                 :                : 
                                 68                 :             14 :             res = (Datum *) palloc(sizeof(Datum) * (*nentries));
                                 69                 :                : 
                                 70         [ -  + ]:             14 :             arr = ARRPTR(query);
                                 71         [ +  + ]:             46 :             for (i = 0; i < *nentries; i++)
                                 72                 :             32 :                 res[i] = Int32GetDatum(arr[i]);
                                 73                 :                :         }
                                 74                 :                : 
 5995                            75   [ +  +  +  +  :             14 :         switch (strategy)
                                                 - ]
                                 76                 :                :         {
 6283 teodor@sigaev.ru           77                 :              2 :             case RTOverlapStrategyNumber:
 4844 tgl@sss.pgh.pa.us          78                 :              2 :                 *searchMode = GIN_SEARCH_MODE_DEFAULT;
                                 79                 :              2 :                 break;
                                 80                 :              2 :             case RTContainedByStrategyNumber:
                                 81                 :                :             case RTOldContainedByStrategyNumber:
                                 82                 :                :                 /* empty set is contained in everything */
                                 83                 :              2 :                 *searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
 5995 bruce@momjian.us           84                 :              2 :                 break;
 4844 tgl@sss.pgh.pa.us          85                 :              2 :             case RTSameStrategyNumber:
                                 86         [ +  - ]:              2 :                 if (*nentries > 0)
                                 87                 :              2 :                     *searchMode = GIN_SEARCH_MODE_DEFAULT;
                                 88                 :                :                 else
 4844 tgl@sss.pgh.pa.us          89                 :UBC           0 :                     *searchMode = GIN_SEARCH_MODE_INCLUDE_EMPTY;
 5995 bruce@momjian.us           90                 :CBC           2 :                 break;
 4844 tgl@sss.pgh.pa.us          91                 :              8 :             case RTContainsStrategyNumber:
                                 92                 :                :             case RTOldContainsStrategyNumber:
                                 93         [ +  - ]:              8 :                 if (*nentries > 0)
                                 94                 :              8 :                     *searchMode = GIN_SEARCH_MODE_DEFAULT;
                                 95                 :                :                 else            /* everything contains the empty set */
 4844 tgl@sss.pgh.pa.us          96                 :UBC           0 :                     *searchMode = GIN_SEARCH_MODE_ALL;
 4844 tgl@sss.pgh.pa.us          97                 :CBC           8 :                 break;
 4844 tgl@sss.pgh.pa.us          98                 :UBC           0 :             default:
                                 99         [ #  # ]:              0 :                 elog(ERROR, "ginint4_queryextract: unknown strategy number: %d",
                                100                 :                :                      strategy);
                                101                 :                :         }
                                102                 :                :     }
                                103                 :                : 
 6402 bruce@momjian.us          104                 :CBC          26 :     PG_RETURN_POINTER(res);
                                105                 :                : }
                                106                 :                : 
 6556 teodor@sigaev.ru          107                 :              2 : PG_FUNCTION_INFO_V1(ginint4_consistent);
                                108                 :                : 
                                109                 :                : Datum
 6402 bruce@momjian.us          110                 :          16960 : ginint4_consistent(PG_FUNCTION_ARGS)
                                111                 :                : {
                                112                 :          16960 :     bool       *check = (bool *) PG_GETARG_POINTER(0);
                                113                 :          16960 :     StrategyNumber strategy = PG_GETARG_UINT16(1);
 4844 tgl@sss.pgh.pa.us         114                 :          16960 :     int32       nkeys = PG_GETARG_INT32(3);
                                115                 :                : 
                                116                 :                :     /* Pointer     *extra_data = (Pointer *) PG_GETARG_POINTER(4); */
 5499                           117                 :          16960 :     bool       *recheck = (bool *) PG_GETARG_POINTER(5);
 2433 peter_e@gmx.net           118                 :          16960 :     bool        res = false;
                                119                 :                :     int32       i;
                                120                 :                : 
 6402 bruce@momjian.us          121   [ +  +  +  +  :          16960 :     switch (strategy)
                                              +  - ]
                                122                 :                :     {
                                123                 :            405 :         case RTOverlapStrategyNumber:
                                124                 :                :             /* result is not lossy */
 5844 tgl@sss.pgh.pa.us         125                 :            405 :             *recheck = false;
                                126                 :                :             /* at least one element in check[] is true, so result = true */
 2433 peter_e@gmx.net           127                 :            405 :             res = true;
 5844 tgl@sss.pgh.pa.us         128                 :            405 :             break;
 6402 bruce@momjian.us          129                 :            632 :         case RTContainedByStrategyNumber:
                                130                 :                :         case RTOldContainedByStrategyNumber:
                                131                 :                :             /* we will need recheck */
 5844 tgl@sss.pgh.pa.us         132                 :            632 :             *recheck = true;
                                133                 :                :             /* at least one element in check[] is true, so result = true */
 2433 peter_e@gmx.net           134                 :            632 :             res = true;
 6402 bruce@momjian.us          135                 :            632 :             break;
                                136                 :            205 :         case RTSameStrategyNumber:
                                137                 :                :             /* we will need recheck */
 4844 tgl@sss.pgh.pa.us         138                 :            205 :             *recheck = true;
                                139                 :                :             /* Must have all elements in check[] true */
 2433 peter_e@gmx.net           140                 :            205 :             res = true;
 4844 tgl@sss.pgh.pa.us         141         [ +  + ]:            413 :             for (i = 0; i < nkeys; i++)
                                142                 :                :             {
                                143         [ +  + ]:            412 :                 if (!check[i])
                                144                 :                :                 {
 2433 peter_e@gmx.net           145                 :            204 :                     res = false;
 4844 tgl@sss.pgh.pa.us         146                 :            204 :                     break;
                                147                 :                :                 }
                                148                 :                :             }
 5844                           149                 :            205 :             break;
 6402 bruce@momjian.us          150                 :            815 :         case RTContainsStrategyNumber:
                                151                 :                :         case RTOldContainsStrategyNumber:
                                152                 :                :             /* result is not lossy */
 4844 tgl@sss.pgh.pa.us         153                 :            815 :             *recheck = false;
                                154                 :                :             /* Must have all elements in check[] true */
 2433 peter_e@gmx.net           155                 :            815 :             res = true;
 4844 tgl@sss.pgh.pa.us         156         [ +  + ]:            909 :             for (i = 0; i < nkeys; i++)
                                157                 :                :             {
                                158         [ +  + ]:            864 :                 if (!check[i])
                                159                 :                :                 {
 2433 peter_e@gmx.net           160                 :            770 :                     res = false;
 4844 tgl@sss.pgh.pa.us         161                 :            770 :                     break;
                                162                 :                :                 }
                                163                 :                :             }
 6556 teodor@sigaev.ru          164                 :            815 :             break;
 6402 bruce@momjian.us          165                 :          14903 :         case BooleanSearchStrategy:
                                166                 :                :             {
 4844 tgl@sss.pgh.pa.us         167                 :          14903 :                 QUERYTYPE  *query = PG_GETARG_QUERYTYPE_P(2);
                                168                 :                : 
                                169                 :                :                 /* result is not lossy */
 5844                           170                 :          14903 :                 *recheck = false;
 4844                           171                 :          14903 :                 res = gin_bool_consistent(query, check);
                                172                 :                :             }
 6402 bruce@momjian.us          173                 :          14903 :             break;
 6402 bruce@momjian.us          174                 :UBC           0 :         default:
 5844 tgl@sss.pgh.pa.us         175         [ #  # ]:              0 :             elog(ERROR, "ginint4_consistent: unknown strategy number: %d",
                                176                 :                :                  strategy);
                                177                 :                :     }
                                178                 :                : 
 6402 bruce@momjian.us          179                 :CBC       16960 :     PG_RETURN_BOOL(res);
                                180                 :                : }
        

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