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

 Age         Owner                    Branch data    TLA  Line data    Source code
                                  1                 :                : /*
                                  2                 :                :  * contrib/btree_gist/btree_numeric.c
                                  3                 :                :  */
                                  4                 :                : #include "postgres.h"
                                  5                 :                : 
                                  6                 :                : #include <math.h>
                                  7                 :                : #include <float.h>
                                  8                 :                : 
                                  9                 :                : #include "btree_gist.h"
                                 10                 :                : #include "btree_utils_var.h"
                                 11                 :                : #include "utils/builtins.h"
                                 12                 :                : #include "utils/numeric.h"
                                 13                 :                : #include "utils/rel.h"
                                 14                 :                : 
                                 15                 :                : /*
                                 16                 :                : ** Bytea ops
                                 17                 :                : */
 7261 teodor@sigaev.ru           18                 :CBC           3 : PG_FUNCTION_INFO_V1(gbt_numeric_compress);
                                 19                 :              3 : PG_FUNCTION_INFO_V1(gbt_numeric_union);
                                 20                 :              3 : PG_FUNCTION_INFO_V1(gbt_numeric_picksplit);
                                 21                 :              3 : PG_FUNCTION_INFO_V1(gbt_numeric_consistent);
                                 22                 :              3 : PG_FUNCTION_INFO_V1(gbt_numeric_penalty);
                                 23                 :              3 : PG_FUNCTION_INFO_V1(gbt_numeric_same);
                                 24                 :                : 
                                 25                 :                : 
                                 26                 :                : /* define for comparison */
                                 27                 :                : 
                                 28                 :                : static bool
 2581 andrew@dunslane.net        29                 :           2768 : gbt_numeric_gt(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
                                 30                 :                : {
 4741 tgl@sss.pgh.pa.us          31                 :           2768 :     return DatumGetBool(DirectFunctionCall2(numeric_gt,
                                 32                 :                :                                             PointerGetDatum(a),
                                 33                 :                :                                             PointerGetDatum(b)));
                                 34                 :                : }
                                 35                 :                : 
                                 36                 :                : static bool
 2581 andrew@dunslane.net        37                 :           3075 : gbt_numeric_ge(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
                                 38                 :                : {
 4741 tgl@sss.pgh.pa.us          39                 :           3075 :     return DatumGetBool(DirectFunctionCall2(numeric_ge,
                                 40                 :                :                                             PointerGetDatum(a),
                                 41                 :                :                                             PointerGetDatum(b)));
                                 42                 :                : }
                                 43                 :                : 
                                 44                 :                : static bool
 2581 andrew@dunslane.net        45                 :           1263 : gbt_numeric_eq(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
                                 46                 :                : {
 4741 tgl@sss.pgh.pa.us          47                 :           1263 :     return DatumGetBool(DirectFunctionCall2(numeric_eq,
                                 48                 :                :                                             PointerGetDatum(a),
                                 49                 :                :                                             PointerGetDatum(b)));
                                 50                 :                : }
                                 51                 :                : 
                                 52                 :                : static bool
 2581 andrew@dunslane.net        53                 :           2370 : gbt_numeric_le(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
                                 54                 :                : {
 4741 tgl@sss.pgh.pa.us          55                 :           2370 :     return DatumGetBool(DirectFunctionCall2(numeric_le,
                                 56                 :                :                                             PointerGetDatum(a),
                                 57                 :                :                                             PointerGetDatum(b)));
                                 58                 :                : }
                                 59                 :                : 
                                 60                 :                : static bool
 2581 andrew@dunslane.net        61                 :           1796 : gbt_numeric_lt(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
                                 62                 :                : {
 4741 tgl@sss.pgh.pa.us          63                 :           1796 :     return DatumGetBool(DirectFunctionCall2(numeric_lt,
                                 64                 :                :                                             PointerGetDatum(a),
                                 65                 :                :                                             PointerGetDatum(b)));
                                 66                 :                : }
                                 67                 :                : 
                                 68                 :                : static int32
 2581 andrew@dunslane.net        69                 :          62059 : gbt_numeric_cmp(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
                                 70                 :                : {
 4741 tgl@sss.pgh.pa.us          71                 :          62059 :     return DatumGetInt32(DirectFunctionCall2(numeric_cmp,
                                 72                 :                :                                              PointerGetDatum(a),
                                 73                 :                :                                              PointerGetDatum(b)));
                                 74                 :                : }
                                 75                 :                : 
                                 76                 :                : 
                                 77                 :                : static const gbtree_vinfo tinfo =
                                 78                 :                : {
                                 79                 :                :     gbt_t_numeric,
                                 80                 :                :     0,
                                 81                 :                :     false,
                                 82                 :                :     gbt_numeric_gt,
                                 83                 :                :     gbt_numeric_ge,
                                 84                 :                :     gbt_numeric_eq,
                                 85                 :                :     gbt_numeric_le,
                                 86                 :                :     gbt_numeric_lt,
                                 87                 :                :     gbt_numeric_cmp,
                                 88                 :                :     NULL
                                 89                 :                : };
                                 90                 :                : 
                                 91                 :                : 
                                 92                 :                : /**************************************************
                                 93                 :                :  * Text ops
                                 94                 :                :  **************************************************/
                                 95                 :                : 
                                 96                 :                : 
                                 97                 :                : Datum
 7168 bruce@momjian.us           98                 :           3173 : gbt_numeric_compress(PG_FUNCTION_ARGS)
                                 99                 :                : {
                                100                 :           3173 :     GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
                                101                 :                : 
                                102                 :           3173 :     PG_RETURN_POINTER(gbt_var_compress(entry, &tinfo));
                                103                 :                : }
                                104                 :                : 
                                105                 :                : 
                                106                 :                : 
                                107                 :                : Datum
 7261 teodor@sigaev.ru          108                 :          11405 : gbt_numeric_consistent(PG_FUNCTION_ARGS)
                                109                 :                : {
 7168 bruce@momjian.us          110                 :          11405 :     GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
                                111                 :          11405 :     void       *query = (void *) DatumGetNumeric(PG_GETARG_DATUM(1));
                                112                 :          11405 :     StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
                                113                 :                : 
                                114                 :                :     /* Oid      subtype = PG_GETARG_OID(3); */
 5844 tgl@sss.pgh.pa.us         115                 :          11405 :     bool       *recheck = (bool *) PG_GETARG_POINTER(4);
                                116                 :                :     bool        retval;
                                117                 :          11405 :     GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(entry->key);
 7168 bruce@momjian.us          118                 :          11405 :     GBT_VARKEY_R r = gbt_var_key_readable(key);
                                119                 :                : 
                                120                 :                :     /* All cases served by this function are exact */
 5844 tgl@sss.pgh.pa.us         121                 :          11405 :     *recheck = false;
                                122                 :                : 
 4741                           123                 :          22810 :     retval = gbt_var_consistent(&r, query, strategy, PG_GET_COLLATION(),
 2581 andrew@dunslane.net       124                 :          11405 :                                 GIST_LEAF(entry), &tinfo, fcinfo->flinfo);
 7168 bruce@momjian.us          125                 :          11405 :     PG_RETURN_BOOL(retval);
                                126                 :                : }
                                127                 :                : 
                                128                 :                : 
                                129                 :                : 
                                130                 :                : Datum
 7261 teodor@sigaev.ru          131                 :           2745 : gbt_numeric_union(PG_FUNCTION_ARGS)
                                132                 :                : {
 7168 bruce@momjian.us          133                 :           2745 :     GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
                                134                 :           2745 :     int32      *size = (int *) PG_GETARG_POINTER(1);
                                135                 :                : 
 4741 tgl@sss.pgh.pa.us         136                 :           2745 :     PG_RETURN_POINTER(gbt_var_union(entryvec, size, PG_GET_COLLATION(),
                                137                 :                :                                     &tinfo, fcinfo->flinfo));
                                138                 :                : }
                                139                 :                : 
                                140                 :                : 
                                141                 :                : Datum
 7261 teodor@sigaev.ru          142                 :           2700 : gbt_numeric_same(PG_FUNCTION_ARGS)
                                143                 :                : {
 7168 bruce@momjian.us          144                 :           2700 :     Datum       d1 = PG_GETARG_DATUM(0);
                                145                 :           2700 :     Datum       d2 = PG_GETARG_DATUM(1);
                                146                 :           2700 :     bool       *result = (bool *) PG_GETARG_POINTER(2);
                                147                 :                : 
 2581 andrew@dunslane.net       148                 :           2700 :     *result = gbt_var_same(d1, d2, PG_GET_COLLATION(), &tinfo, fcinfo->flinfo);
 4741 tgl@sss.pgh.pa.us         149                 :           2700 :     PG_RETURN_POINTER(result);
                                150                 :                : }
                                151                 :                : 
                                152                 :                : 
                                153                 :                : Datum
 7168 bruce@momjian.us          154                 :           6258 : gbt_numeric_penalty(PG_FUNCTION_ARGS)
                                155                 :                : {
                                156                 :           6258 :     GISTENTRY  *o = (GISTENTRY *) PG_GETARG_POINTER(0);
                                157                 :           6258 :     GISTENTRY  *n = (GISTENTRY *) PG_GETARG_POINTER(1);
                                158                 :           6258 :     float      *result = (float *) PG_GETARG_POINTER(2);
                                159                 :                : 
                                160                 :                :     Numeric     us,
                                161                 :                :                 os,
                                162                 :                :                 ds;
                                163                 :                : 
                                164                 :           6258 :     GBT_VARKEY *org = (GBT_VARKEY *) DatumGetPointer(o->key);
                                165                 :           6258 :     GBT_VARKEY *newe = (GBT_VARKEY *) DatumGetPointer(n->key);
                                166                 :                :     Datum       uni;
                                167                 :                :     GBT_VARKEY_R rk,
                                168                 :                :                 ok,
                                169                 :                :                 uk;
                                170                 :                : 
                                171                 :           6258 :     rk = gbt_var_key_readable(org);
 3307 heikki.linnakangas@i      172                 :           6258 :     uni = PointerGetDatum(gbt_var_key_copy(&rk));
 2581 andrew@dunslane.net       173                 :           6258 :     gbt_var_bin_union(&uni, newe, PG_GET_COLLATION(), &tinfo, fcinfo->flinfo);
 7168 bruce@momjian.us          174                 :           6258 :     ok = gbt_var_key_readable(org);
                                175                 :           6258 :     uk = gbt_var_key_readable((GBT_VARKEY *) DatumGetPointer(uni));
                                176                 :                : 
 1536 alvherre@alvh.no-ip.      177                 :           6258 :     us = DatumGetNumeric(DirectFunctionCall2(numeric_sub,
                                178                 :                :                                              PointerGetDatum(uk.upper),
                                179                 :                :                                              PointerGetDatum(uk.lower)));
                                180                 :                : 
                                181                 :           6258 :     os = DatumGetNumeric(DirectFunctionCall2(numeric_sub,
                                182                 :                :                                              PointerGetDatum(ok.upper),
                                183                 :                :                                              PointerGetDatum(ok.lower)));
                                184                 :                : 
                                185                 :           6258 :     ds = DatumGetNumeric(DirectFunctionCall2(numeric_sub,
                                186                 :                :                                              NumericGetDatum(us),
                                187                 :                :                                              NumericGetDatum(os)));
                                188                 :                : 
 5007 rhaas@postgresql.org      189         [ +  + ]:           6258 :     if (numeric_is_nan(us))
                                190                 :                :     {
                                191         [ +  + ]:            327 :         if (numeric_is_nan(os))
 7168 bruce@momjian.us          192                 :            320 :             *result = 0.0;
                                193                 :                :         else
                                194                 :              7 :             *result = 1.0;
                                195                 :                :     }
                                196                 :                :     else
                                197                 :                :     {
 1313 peter@eisentraut.org      198                 :           5931 :         Numeric     nul = int64_to_numeric(0);
                                199                 :                : 
 7168 bruce@momjian.us          200                 :           5931 :         *result = 0.0;
                                201                 :                : 
                                202         [ +  + ]:           5931 :         if (DirectFunctionCall2(numeric_gt, NumericGetDatum(ds), NumericGetDatum(nul)))
                                203                 :                :         {
                                204                 :           1608 :             *result += FLT_MIN;
 1536 alvherre@alvh.no-ip.      205                 :           1608 :             os = DatumGetNumeric(DirectFunctionCall2(numeric_div,
                                206                 :                :                                                      NumericGetDatum(ds),
                                207                 :                :                                                      NumericGetDatum(us)));
 7168 bruce@momjian.us          208                 :           1608 :             *result += (float4) DatumGetFloat8(DirectFunctionCall1(numeric_float8_no_overflow, NumericGetDatum(os)));
                                209                 :                :         }
                                210                 :                :     }
                                211                 :                : 
                                212         [ +  + ]:           6258 :     if (*result > 0)
                                213                 :           1615 :         *result *= (FLT_MAX / (((GISTENTRY *) PG_GETARG_POINTER(0))->rel->rd_att->natts + 1));
                                214                 :                : 
                                215                 :           6258 :     PG_RETURN_POINTER(result);
                                216                 :                : }
                                217                 :                : 
                                218                 :                : 
                                219                 :                : 
                                220                 :                : Datum
 7261 teodor@sigaev.ru          221                 :             26 : gbt_numeric_picksplit(PG_FUNCTION_ARGS)
                                222                 :                : {
 7168 bruce@momjian.us          223                 :             26 :     GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
                                224                 :             26 :     GIST_SPLITVEC *v = (GIST_SPLITVEC *) PG_GETARG_POINTER(1);
                                225                 :                : 
 4741 tgl@sss.pgh.pa.us         226                 :             26 :     gbt_var_picksplit(entryvec, v, PG_GET_COLLATION(),
                                227                 :                :                       &tinfo, fcinfo->flinfo);
 7168 bruce@momjian.us          228                 :             26 :     PG_RETURN_POINTER(v);
                                229                 :                : }
        

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