LCOV - differential code coverage report
Current view: top level - src/common - relpath.c (source / functions) Coverage Total Hit UNC UBC GBC GNC CBC DCB
Current: Differential Code Coverage 16@8cea358b128 vs 17@8cea358b128 Lines: 94.1 % 51 48 3 1 3 44 3
Current Date: 2024-04-14 14:21:10 Functions: 100.0 % 4 4 1 3
Baseline: 16@8cea358b128 Branches: 83.3 % 42 35 1 6 5 30
Baseline Date: 2024-04-14 14:21:09 Line coverage date bins:
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed [..60] days: 100.0 % 3 3 3
(240..) days: 93.8 % 48 45 3 1 44
Function coverage date bins:
(240..) days: 100.0 % 4 4 1 3
Branch coverage date bins:
[..60] days: 83.3 % 6 5 1 5
(240..) days: 83.3 % 36 30 6 30

 Age         Owner                    Branch data    TLA  Line data    Source code
                                  1                 :                : /*-------------------------------------------------------------------------
                                  2                 :                :  * relpath.c
                                  3                 :                :  *      Shared frontend/backend code to compute pathnames of relation files
                                  4                 :                :  *
                                  5                 :                :  * This module also contains some logic associated with fork names.
                                  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/common/relpath.c
                                 12                 :                :  *
                                 13                 :                :  *-------------------------------------------------------------------------
                                 14                 :                :  */
                                 15                 :                : #ifndef FRONTEND
                                 16                 :                : #include "postgres.h"
                                 17                 :                : #else
                                 18                 :                : #include "postgres_fe.h"
                                 19                 :                : #endif
                                 20                 :                : 
                                 21                 :                : #include "catalog/pg_tablespace_d.h"
                                 22                 :                : #include "common/relpath.h"
                                 23                 :                : #include "storage/procnumber.h"
                                 24                 :                : 
                                 25                 :                : 
                                 26                 :                : /*
                                 27                 :                :  * Lookup table of fork name by fork number.
                                 28                 :                :  *
                                 29                 :                :  * If you add a new entry, remember to update the errhint in
                                 30                 :                :  * forkname_to_number() below, and update the SGML documentation for
                                 31                 :                :  * pg_relation_size().
                                 32                 :                :  */
                                 33                 :                : const char *const forkNames[] = {
                                 34                 :                :     [MAIN_FORKNUM] = "main",
                                 35                 :                :     [FSM_FORKNUM] = "fsm",
                                 36                 :                :     [VISIBILITYMAP_FORKNUM] = "vm",
                                 37                 :                :     [INIT_FORKNUM] = "init",
                                 38                 :                : };
                                 39                 :                : 
                                 40                 :                : StaticAssertDecl(lengthof(forkNames) == (MAX_FORKNUM + 1),
                                 41                 :                :                  "array length mismatch");
                                 42                 :                : 
                                 43                 :                : /*
                                 44                 :                :  * forkname_to_number - look up fork number by name
                                 45                 :                :  *
                                 46                 :                :  * In backend, we throw an error for no match; in frontend, we just
                                 47                 :                :  * return InvalidForkNumber.
                                 48                 :                :  */
                                 49                 :                : ForkNumber
 3637 tgl@sss.pgh.pa.us          50                 :CBC        2869 : forkname_to_number(const char *forkName)
                                 51                 :                : {
                                 52                 :                :     ForkNumber  forkNum;
                                 53                 :                : 
                                 54         [ +  + ]:           2887 :     for (forkNum = 0; forkNum <= MAX_FORKNUM; forkNum++)
                                 55         [ +  + ]:           2885 :         if (strcmp(forkNames[forkNum], forkName) == 0)
                                 56                 :           2867 :             return forkNum;
                                 57                 :                : 
                                 58                 :                : #ifndef FRONTEND
                                 59         [ +  - ]:              1 :     ereport(ERROR,
                                 60                 :                :             (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                                 61                 :                :              errmsg("invalid fork name"),
                                 62                 :                :              errhint("Valid fork names are \"main\", \"fsm\", "
                                 63                 :                :                      "\"vm\", and \"init\".")));
                                 64                 :                : #endif
                                 65                 :                : 
 3637 tgl@sss.pgh.pa.us          66                 :GBC           1 :     return InvalidForkNumber;
                                 67                 :                : }
                                 68                 :                : 
                                 69                 :                : /*
                                 70                 :                :  * forkname_chars
                                 71                 :                :  *      We use this to figure out whether a filename could be a relation
                                 72                 :                :  *      fork (as opposed to an oddly named stray file that somehow ended
                                 73                 :                :  *      up in the database directory).  If the passed string begins with
                                 74                 :                :  *      a fork name (other than the main fork name), we return its length,
                                 75                 :                :  *      and set *fork (if not NULL) to the fork number.  If not, we return 0.
                                 76                 :                :  *
                                 77                 :                :  * Note that the present coding assumes that there are no fork names which
                                 78                 :                :  * are prefixes of other fork names.
                                 79                 :                :  */
                                 80                 :                : int
 4070 alvherre@alvh.no-ip.       81                 :CBC      199451 : forkname_chars(const char *str, ForkNumber *fork)
                                 82                 :                : {
                                 83                 :                :     ForkNumber  forkNum;
                                 84                 :                : 
                                 85         [ +  - ]:         299104 :     for (forkNum = 1; forkNum <= MAX_FORKNUM; forkNum++)
                                 86                 :                :     {
                                 87                 :         299104 :         int         len = strlen(forkNames[forkNum]);
                                 88                 :                : 
                                 89         [ +  + ]:         299104 :         if (strncmp(forkNames[forkNum], str, len) == 0)
                                 90                 :                :         {
                                 91         [ +  + ]:         199451 :             if (fork)
                                 92                 :         199429 :                 *fork = forkNum;
                                 93                 :         199451 :             return len;
                                 94                 :                :         }
                                 95                 :                :     }
 3637 tgl@sss.pgh.pa.us          96         [ #  # ]:UBC           0 :     if (fork)
                                 97                 :              0 :         *fork = InvalidForkNumber;
 4070 alvherre@alvh.no-ip.       98                 :              0 :     return 0;
                                 99                 :                : }
                                100                 :                : 
                                101                 :                : 
                                102                 :                : /*
                                103                 :                :  * GetDatabasePath - construct path to a database directory
                                104                 :                :  *
                                105                 :                :  * Result is a palloc'd string.
                                106                 :                :  *
                                107                 :                :  * XXX this must agree with GetRelationPath()!
                                108                 :                :  */
                                109                 :                : char *
  648 rhaas@postgresql.org      110                 :CBC      157593 : GetDatabasePath(Oid dbOid, Oid spcOid)
                                111                 :                : {
                                112         [ +  + ]:         157593 :     if (spcOid == GLOBALTABLESPACE_OID)
                                113                 :                :     {
                                114                 :                :         /* Shared system relations live in {datadir}/global */
                                115         [ -  + ]:              2 :         Assert(dbOid == 0);
 3637 tgl@sss.pgh.pa.us         116                 :              2 :         return pstrdup("global");
                                117                 :                :     }
  648 rhaas@postgresql.org      118         [ +  + ]:         157591 :     else if (spcOid == DEFAULTTABLESPACE_OID)
                                119                 :                :     {
                                120                 :                :         /* The default tablespace is {datadir}/base */
                                121                 :         154393 :         return psprintf("base/%u", dbOid);
                                122                 :                :     }
                                123                 :                :     else
                                124                 :                :     {
                                125                 :                :         /* All other tablespaces are accessed via symlinks */
 3637 tgl@sss.pgh.pa.us         126                 :           3198 :         return psprintf("pg_tblspc/%u/%s/%u",
                                127                 :                :                         spcOid, TABLESPACE_VERSION_DIRECTORY, dbOid);
                                128                 :                :     }
                                129                 :                : }
                                130                 :                : 
                                131                 :                : /*
                                132                 :                :  * GetRelationPath - construct path to a relation's file
                                133                 :                :  *
                                134                 :                :  * Result is a palloc'd string.
                                135                 :                :  *
                                136                 :                :  * Note: ideally, procNumber would be declared as type ProcNumber, but
                                137                 :                :  * relpath.h would have to include a backend-only header to do that; doesn't
                                138                 :                :  * seem worth the trouble considering ProcNumber is just int anyway.
                                139                 :                :  */
                                140                 :                : char *
  648 rhaas@postgresql.org      141                 :        1598881 : GetRelationPath(Oid dbOid, Oid spcOid, RelFileNumber relNumber,
                                142                 :                :                 int procNumber, ForkNumber forkNumber)
                                143                 :                : {
                                144                 :                :     char       *path;
                                145                 :                : 
                                146         [ +  + ]:        1598881 :     if (spcOid == GLOBALTABLESPACE_OID)
                                147                 :                :     {
                                148                 :                :         /* Shared system relations live in {datadir}/global */
                                149         [ -  + ]:          85445 :         Assert(dbOid == 0);
   42 heikki.linnakangas@i      150         [ -  + ]:GNC       85445 :         Assert(procNumber == INVALID_PROC_NUMBER);
 3637 tgl@sss.pgh.pa.us         151         [ +  + ]:CBC       85445 :         if (forkNumber != MAIN_FORKNUM)
  564 rhaas@postgresql.org      152                 :          26755 :             path = psprintf("global/%u_%s",
  648                           153                 :          26755 :                             relNumber, forkNames[forkNumber]);
                                154                 :                :         else
  564                           155                 :          58690 :             path = psprintf("global/%u", relNumber);
                                156                 :                :     }
  648                           157         [ +  + ]:        1513436 :     else if (spcOid == DEFAULTTABLESPACE_OID)
                                158                 :                :     {
                                159                 :                :         /* The default tablespace is {datadir}/base */
   42 heikki.linnakangas@i      160         [ +  + ]:GNC     1506449 :         if (procNumber == INVALID_PROC_NUMBER)
                                161                 :                :         {
 3637 tgl@sss.pgh.pa.us         162         [ +  + ]:CBC     1479344 :             if (forkNumber != MAIN_FORKNUM)
  564 rhaas@postgresql.org      163                 :         618664 :                 path = psprintf("base/%u/%u_%s",
                                164                 :                :                                 dbOid, relNumber,
 3637 tgl@sss.pgh.pa.us         165                 :         618664 :                                 forkNames[forkNumber]);
                                166                 :                :             else
  564 rhaas@postgresql.org      167                 :         860680 :                 path = psprintf("base/%u/%u",
                                168                 :                :                                 dbOid, relNumber);
                                169                 :                :         }
                                170                 :                :         else
                                171                 :                :         {
 3637 tgl@sss.pgh.pa.us         172         [ +  + ]:          27105 :             if (forkNumber != MAIN_FORKNUM)
  564 rhaas@postgresql.org      173                 :          14330 :                 path = psprintf("base/%u/t%d_%u_%s",
                                174                 :                :                                 dbOid, procNumber, relNumber,
 3637 tgl@sss.pgh.pa.us         175                 :          14330 :                                 forkNames[forkNumber]);
                                176                 :                :             else
  564 rhaas@postgresql.org      177                 :          12775 :                 path = psprintf("base/%u/t%d_%u",
                                178                 :                :                                 dbOid, procNumber, relNumber);
                                179                 :                :         }
                                180                 :                :     }
                                181                 :                :     else
                                182                 :                :     {
                                183                 :                :         /* All other tablespaces are accessed via symlinks */
   42 heikki.linnakangas@i      184         [ +  + ]:GNC        6987 :         if (procNumber == INVALID_PROC_NUMBER)
                                185                 :                :         {
 3637 tgl@sss.pgh.pa.us         186         [ +  + ]:CBC        6930 :             if (forkNumber != MAIN_FORKNUM)
  564 rhaas@postgresql.org      187                 :           2687 :                 path = psprintf("pg_tblspc/%u/%s/%u/%u_%s",
                                188                 :                :                                 spcOid, TABLESPACE_VERSION_DIRECTORY,
                                189                 :                :                                 dbOid, relNumber,
 3637 tgl@sss.pgh.pa.us         190                 :           2687 :                                 forkNames[forkNumber]);
                                191                 :                :             else
  564 rhaas@postgresql.org      192                 :           4243 :                 path = psprintf("pg_tblspc/%u/%s/%u/%u",
                                193                 :                :                                 spcOid, TABLESPACE_VERSION_DIRECTORY,
                                194                 :                :                                 dbOid, relNumber);
                                195                 :                :         }
                                196                 :                :         else
                                197                 :                :         {
 3637 tgl@sss.pgh.pa.us         198         [ +  + ]:             57 :             if (forkNumber != MAIN_FORKNUM)
  564 rhaas@postgresql.org      199                 :             30 :                 path = psprintf("pg_tblspc/%u/%s/%u/t%d_%u_%s",
                                200                 :                :                                 spcOid, TABLESPACE_VERSION_DIRECTORY,
                                201                 :                :                                 dbOid, procNumber, relNumber,
 3637 tgl@sss.pgh.pa.us         202                 :             30 :                                 forkNames[forkNumber]);
                                203                 :                :             else
  564 rhaas@postgresql.org      204                 :             27 :                 path = psprintf("pg_tblspc/%u/%s/%u/t%d_%u",
                                205                 :                :                                 spcOid, TABLESPACE_VERSION_DIRECTORY,
                                206                 :                :                                 dbOid, procNumber, relNumber);
                                207                 :                :         }
                                208                 :                :     }
 4070 alvherre@alvh.no-ip.      209                 :        1598881 :     return path;
                                210                 :                : }
        

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