LCOV - code coverage report
Current view: top level - src/backend/access/rmgrdesc - heapdesc.c (source / functions) Coverage Total Hit
Test: PostgreSQL 20devel Lines: 78.1 % 247 193
Test Date: 2026-07-12 09:15:39 Functions: 87.5 % 8 7
Legend: Lines:     hit not hit
Branches: + taken - not taken # not executed
Branches: 71.7 % 99 71

             Branch data     Line data    Source code
       1                 :             : /*-------------------------------------------------------------------------
       2                 :             :  *
       3                 :             :  * heapdesc.c
       4                 :             :  *    rmgr descriptor routines for access/heap/heapam.c
       5                 :             :  *
       6                 :             :  * Portions Copyright (c) 1996-2026, PostgreSQL Global Development Group
       7                 :             :  * Portions Copyright (c) 1994, Regents of the University of California
       8                 :             :  *
       9                 :             :  *
      10                 :             :  * IDENTIFICATION
      11                 :             :  *    src/backend/access/rmgrdesc/heapdesc.c
      12                 :             :  *
      13                 :             :  *-------------------------------------------------------------------------
      14                 :             :  */
      15                 :             : #include "postgres.h"
      16                 :             : 
      17                 :             : #include "access/heapam_xlog.h"
      18                 :             : #include "access/rmgrdesc_utils.h"
      19                 :             : #include "access/visibilitymapdefs.h"
      20                 :             : #include "storage/standbydefs.h"
      21                 :             : 
      22                 :             : /*
      23                 :             :  * NOTE: "keyname" argument cannot have trailing spaces or punctuation
      24                 :             :  * characters
      25                 :             :  */
      26                 :             : static void
      27                 :          48 : infobits_desc(StringInfo buf, uint8 infobits, const char *keyname)
      28                 :             : {
      29                 :          48 :     appendStringInfo(buf, "%s: [", keyname);
      30                 :             : 
      31                 :             :     Assert(buf->data[buf->len - 1] != ' ');
      32                 :             : 
      33         [ -  + ]:          48 :     if (infobits & XLHL_XMAX_IS_MULTI)
      34                 :           0 :         appendStringInfoString(buf, "IS_MULTI, ");
      35         [ +  + ]:          48 :     if (infobits & XLHL_XMAX_LOCK_ONLY)
      36                 :           6 :         appendStringInfoString(buf, "LOCK_ONLY, ");
      37         [ +  + ]:          48 :     if (infobits & XLHL_XMAX_EXCL_LOCK)
      38                 :           6 :         appendStringInfoString(buf, "EXCL_LOCK, ");
      39         [ -  + ]:          48 :     if (infobits & XLHL_XMAX_KEYSHR_LOCK)
      40                 :           0 :         appendStringInfoString(buf, "KEYSHR_LOCK, ");
      41         [ +  + ]:          48 :     if (infobits & XLHL_KEYS_UPDATED)
      42                 :          20 :         appendStringInfoString(buf, "KEYS_UPDATED, ");
      43                 :             : 
      44         [ +  + ]:          48 :     if (buf->data[buf->len - 1] == ' ')
      45                 :             :     {
      46                 :             :         /* Truncate-away final unneeded ", "  */
      47                 :             :         Assert(buf->data[buf->len - 2] == ',');
      48                 :          26 :         buf->len -= 2;
      49                 :          26 :         buf->data[buf->len] = '\0';
      50                 :             :     }
      51                 :             : 
      52                 :          48 :     appendStringInfoChar(buf, ']');
      53                 :          48 : }
      54                 :             : 
      55                 :             : static void
      56                 :           0 : truncate_flags_desc(StringInfo buf, uint8 flags)
      57                 :             : {
      58                 :           0 :     appendStringInfoString(buf, "flags: [");
      59                 :             : 
      60         [ #  # ]:           0 :     if (flags & XLH_TRUNCATE_CASCADE)
      61                 :           0 :         appendStringInfoString(buf, "CASCADE, ");
      62         [ #  # ]:           0 :     if (flags & XLH_TRUNCATE_RESTART_SEQS)
      63                 :           0 :         appendStringInfoString(buf, "RESTART_SEQS, ");
      64                 :             : 
      65         [ #  # ]:           0 :     if (buf->data[buf->len - 1] == ' ')
      66                 :             :     {
      67                 :             :         /* Truncate-away final unneeded ", "  */
      68                 :             :         Assert(buf->data[buf->len - 2] == ',');
      69                 :           0 :         buf->len -= 2;
      70                 :           0 :         buf->data[buf->len] = '\0';
      71                 :             :     }
      72                 :             : 
      73                 :           0 :     appendStringInfoChar(buf, ']');
      74                 :           0 : }
      75                 :             : 
      76                 :             : static void
      77                 :           8 : plan_elem_desc(StringInfo buf, void *plan, void *data)
      78                 :             : {
      79                 :           8 :     xlhp_freeze_plan *new_plan = (xlhp_freeze_plan *) plan;
      80                 :           8 :     OffsetNumber **offsets = data;
      81                 :             : 
      82                 :           8 :     appendStringInfo(buf, "{ xmax: %u, infomask: %u, infomask2: %u, ntuples: %u",
      83                 :             :                      new_plan->xmax,
      84                 :           8 :                      new_plan->t_infomask, new_plan->t_infomask2,
      85                 :           8 :                      new_plan->ntuples);
      86                 :             : 
      87                 :           8 :     appendStringInfoString(buf, ", offsets:");
      88                 :           8 :     array_desc(buf, *offsets, sizeof(OffsetNumber), new_plan->ntuples,
      89                 :             :                &offset_elem_desc, NULL);
      90                 :             : 
      91                 :           8 :     *offsets += new_plan->ntuples;
      92                 :             : 
      93                 :           8 :     appendStringInfoString(buf, " }");
      94                 :           8 : }
      95                 :             : 
      96                 :             : 
      97                 :             : /*
      98                 :             :  * Given a MAXALIGNed buffer returned by XLogRecGetBlockData() and pointed to
      99                 :             :  * by cursor and any xl_heap_prune flags, deserialize the arrays of
     100                 :             :  * OffsetNumbers contained in an XLOG_HEAP2_PRUNE_* record.
     101                 :             :  *
     102                 :             :  * This is in heapdesc.c so it can be shared between heap2_redo and heap2_desc
     103                 :             :  * code, the latter of which is used in frontend (pg_waldump) code.
     104                 :             :  */
     105                 :             : void
     106                 :       12913 : heap_xlog_deserialize_prune_and_freeze(char *cursor, uint16 flags,
     107                 :             :                                        int *nplans, xlhp_freeze_plan **plans,
     108                 :             :                                        OffsetNumber **frz_offsets,
     109                 :             :                                        int *nredirected, OffsetNumber **redirected,
     110                 :             :                                        int *ndead, OffsetNumber **nowdead,
     111                 :             :                                        int *nunused, OffsetNumber **nowunused)
     112                 :             : {
     113         [ +  + ]:       12913 :     if (flags & XLHP_HAS_FREEZE_PLANS)
     114                 :             :     {
     115                 :         986 :         xlhp_freeze_plans *freeze_plans = (xlhp_freeze_plans *) cursor;
     116                 :             : 
     117                 :         986 :         *nplans = freeze_plans->nplans;
     118                 :             :         Assert(*nplans > 0);
     119                 :         986 :         *plans = freeze_plans->plans;
     120                 :             : 
     121                 :         986 :         cursor += offsetof(xlhp_freeze_plans, plans);
     122                 :         986 :         cursor += sizeof(xlhp_freeze_plan) * *nplans;
     123                 :             :     }
     124                 :             :     else
     125                 :             :     {
     126                 :       11927 :         *nplans = 0;
     127                 :       11927 :         *plans = NULL;
     128                 :             :     }
     129                 :             : 
     130         [ +  + ]:       12913 :     if (flags & XLHP_HAS_REDIRECTIONS)
     131                 :             :     {
     132                 :        2222 :         xlhp_prune_items *subrecord = (xlhp_prune_items *) cursor;
     133                 :             : 
     134                 :        2222 :         *nredirected = subrecord->ntargets;
     135                 :             :         Assert(*nredirected > 0);
     136                 :        2222 :         *redirected = &subrecord->data[0];
     137                 :             : 
     138                 :        2222 :         cursor += offsetof(xlhp_prune_items, data);
     139                 :        2222 :         cursor += sizeof(OffsetNumber[2]) * *nredirected;
     140                 :             :     }
     141                 :             :     else
     142                 :             :     {
     143                 :       10691 :         *nredirected = 0;
     144                 :       10691 :         *redirected = NULL;
     145                 :             :     }
     146                 :             : 
     147         [ +  + ]:       12913 :     if (flags & XLHP_HAS_DEAD_ITEMS)
     148                 :             :     {
     149                 :        6957 :         xlhp_prune_items *subrecord = (xlhp_prune_items *) cursor;
     150                 :             : 
     151                 :        6957 :         *ndead = subrecord->ntargets;
     152                 :             :         Assert(*ndead > 0);
     153                 :        6957 :         *nowdead = subrecord->data;
     154                 :             : 
     155                 :        6957 :         cursor += offsetof(xlhp_prune_items, data);
     156                 :        6957 :         cursor += sizeof(OffsetNumber) * *ndead;
     157                 :             :     }
     158                 :             :     else
     159                 :             :     {
     160                 :        5956 :         *ndead = 0;
     161                 :        5956 :         *nowdead = NULL;
     162                 :             :     }
     163                 :             : 
     164         [ +  + ]:       12913 :     if (flags & XLHP_HAS_NOW_UNUSED_ITEMS)
     165                 :             :     {
     166                 :        4199 :         xlhp_prune_items *subrecord = (xlhp_prune_items *) cursor;
     167                 :             : 
     168                 :        4199 :         *nunused = subrecord->ntargets;
     169                 :             :         Assert(*nunused > 0);
     170                 :        4199 :         *nowunused = subrecord->data;
     171                 :             : 
     172                 :        4199 :         cursor += offsetof(xlhp_prune_items, data);
     173                 :        4199 :         cursor += sizeof(OffsetNumber) * *nunused;
     174                 :             :     }
     175                 :             :     else
     176                 :             :     {
     177                 :        8714 :         *nunused = 0;
     178                 :        8714 :         *nowunused = NULL;
     179                 :             :     }
     180                 :             : 
     181                 :       12913 :     *frz_offsets = (OffsetNumber *) cursor;
     182                 :       12913 : }
     183                 :             : 
     184                 :             : void
     185                 :       30953 : heap_desc(StringInfo buf, XLogReaderState *record)
     186                 :             : {
     187                 :       30953 :     char       *rec = XLogRecGetData(record);
     188                 :       30953 :     uint8       info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
     189                 :             : 
     190                 :       30953 :     info &= XLOG_HEAP_OPMASK;
     191         [ +  + ]:       30953 :     if (info == XLOG_HEAP_INSERT)
     192                 :             :     {
     193                 :       30903 :         xl_heap_insert *xlrec = (xl_heap_insert *) rec;
     194                 :             : 
     195                 :       30903 :         appendStringInfo(buf, "off: %u, flags: 0x%02X",
     196                 :       30903 :                          xlrec->offnum,
     197                 :       30903 :                          xlrec->flags);
     198                 :             :     }
     199         [ +  + ]:          50 :     else if (info == XLOG_HEAP_DELETE)
     200                 :             :     {
     201                 :          20 :         xl_heap_delete *xlrec = (xl_heap_delete *) rec;
     202                 :             : 
     203                 :          20 :         appendStringInfo(buf, "xmax: %u, off: %u, ",
     204                 :          20 :                          xlrec->xmax, xlrec->offnum);
     205                 :          20 :         infobits_desc(buf, xlrec->infobits_set, "infobits");
     206                 :          20 :         appendStringInfo(buf, ", flags: 0x%02X", xlrec->flags);
     207                 :             :     }
     208         [ +  + ]:          30 :     else if (info == XLOG_HEAP_UPDATE)
     209                 :             :     {
     210                 :           6 :         xl_heap_update *xlrec = (xl_heap_update *) rec;
     211                 :             : 
     212                 :           6 :         appendStringInfo(buf, "old_xmax: %u, old_off: %u, ",
     213                 :           6 :                          xlrec->old_xmax, xlrec->old_offnum);
     214                 :           6 :         infobits_desc(buf, xlrec->old_infobits_set, "old_infobits");
     215                 :           6 :         appendStringInfo(buf, ", flags: 0x%02X, new_xmax: %u, new_off: %u",
     216                 :           6 :                          xlrec->flags, xlrec->new_xmax, xlrec->new_offnum);
     217                 :             :     }
     218         [ +  + ]:          24 :     else if (info == XLOG_HEAP_HOT_UPDATE)
     219                 :             :     {
     220                 :          16 :         xl_heap_update *xlrec = (xl_heap_update *) rec;
     221                 :             : 
     222                 :          16 :         appendStringInfo(buf, "old_xmax: %u, old_off: %u, ",
     223                 :          16 :                          xlrec->old_xmax, xlrec->old_offnum);
     224                 :          16 :         infobits_desc(buf, xlrec->old_infobits_set, "old_infobits");
     225                 :          16 :         appendStringInfo(buf, ", flags: 0x%02X, new_xmax: %u, new_off: %u",
     226                 :          16 :                          xlrec->flags, xlrec->new_xmax, xlrec->new_offnum);
     227                 :             :     }
     228         [ -  + ]:           8 :     else if (info == XLOG_HEAP_TRUNCATE)
     229                 :             :     {
     230                 :           0 :         xl_heap_truncate *xlrec = (xl_heap_truncate *) rec;
     231                 :             : 
     232                 :           0 :         truncate_flags_desc(buf, xlrec->flags);
     233                 :           0 :         appendStringInfo(buf, ", nrelids: %u", xlrec->nrelids);
     234                 :           0 :         appendStringInfoString(buf, ", relids:");
     235                 :           0 :         array_desc(buf, xlrec->relids, sizeof(Oid), xlrec->nrelids,
     236                 :             :                    &oid_elem_desc, NULL);
     237                 :             :     }
     238         [ -  + ]:           8 :     else if (info == XLOG_HEAP_CONFIRM)
     239                 :             :     {
     240                 :           0 :         xl_heap_confirm *xlrec = (xl_heap_confirm *) rec;
     241                 :             : 
     242                 :           0 :         appendStringInfo(buf, "off: %u", xlrec->offnum);
     243                 :             :     }
     244         [ +  + ]:           8 :     else if (info == XLOG_HEAP_LOCK)
     245                 :             :     {
     246                 :           6 :         xl_heap_lock *xlrec = (xl_heap_lock *) rec;
     247                 :             : 
     248                 :           6 :         appendStringInfo(buf, "xmax: %u, off: %u, ",
     249                 :           6 :                          xlrec->xmax, xlrec->offnum);
     250                 :           6 :         infobits_desc(buf, xlrec->infobits_set, "infobits");
     251                 :           6 :         appendStringInfo(buf, ", flags: 0x%02X", xlrec->flags);
     252                 :             :     }
     253         [ +  - ]:           2 :     else if (info == XLOG_HEAP_INPLACE)
     254                 :             :     {
     255                 :           2 :         xl_heap_inplace *xlrec = (xl_heap_inplace *) rec;
     256                 :             : 
     257                 :           2 :         appendStringInfo(buf, "off: %u", xlrec->offnum);
     258                 :           2 :         standby_desc_invalidations(buf, xlrec->nmsgs, xlrec->msgs,
     259                 :             :                                    xlrec->dbId, xlrec->tsId,
     260                 :           2 :                                    xlrec->relcacheInitFileInval);
     261                 :             :     }
     262                 :       30953 : }
     263                 :             : 
     264                 :             : void
     265                 :          50 : heap2_desc(StringInfo buf, XLogReaderState *record)
     266                 :             : {
     267                 :          50 :     char       *rec = XLogRecGetData(record);
     268                 :          50 :     uint8       info = XLogRecGetInfo(record) & ~XLR_INFO_MASK;
     269                 :             : 
     270                 :          50 :     info &= XLOG_HEAP_OPMASK;
     271   [ +  +  +  + ]:          50 :     if (info == XLOG_HEAP2_PRUNE_ON_ACCESS ||
     272         [ +  + ]:          22 :         info == XLOG_HEAP2_PRUNE_VACUUM_SCAN ||
     273                 :             :         info == XLOG_HEAP2_PRUNE_VACUUM_CLEANUP)
     274                 :          30 :     {
     275                 :          30 :         xl_heap_prune *xlrec = (xl_heap_prune *) rec;
     276                 :             : 
     277         [ +  + ]:          30 :         if (xlrec->flags & XLHP_HAS_CONFLICT_HORIZON)
     278                 :             :         {
     279                 :             :             TransactionId conflict_xid;
     280                 :             : 
     281                 :          19 :             memcpy(&conflict_xid, rec + SizeOfHeapPrune, sizeof(TransactionId));
     282                 :             : 
     283                 :          19 :             appendStringInfo(buf, "snapshotConflictHorizon: %u",
     284                 :             :                              conflict_xid);
     285                 :             :         }
     286                 :             : 
     287                 :          30 :         appendStringInfo(buf, ", isCatalogRel: %c",
     288         [ +  + ]:          30 :                          xlrec->flags & XLHP_IS_CATALOG_REL ? 'T' : 'F');
     289                 :             : 
     290         [ +  + ]:          30 :         if (xlrec->flags & XLHP_VM_ALL_VISIBLE)
     291                 :             :         {
     292                 :           6 :             uint8       vmflags = VISIBILITYMAP_ALL_VISIBLE;
     293                 :             : 
     294         [ +  + ]:           6 :             if (xlrec->flags & XLHP_VM_ALL_FROZEN)
     295                 :           5 :                 vmflags |= VISIBILITYMAP_ALL_FROZEN;
     296                 :           6 :             appendStringInfo(buf, ", vm_flags: 0x%02X", vmflags);
     297                 :             :         }
     298                 :             : 
     299         [ +  - ]:          30 :         if (XLogRecHasBlockData(record, 0))
     300                 :             :         {
     301                 :             :             Size        datalen;
     302                 :             :             OffsetNumber *redirected;
     303                 :             :             OffsetNumber *nowdead;
     304                 :             :             OffsetNumber *nowunused;
     305                 :             :             int         nredirected;
     306                 :             :             int         nunused;
     307                 :             :             int         ndead;
     308                 :             :             int         nplans;
     309                 :             :             xlhp_freeze_plan *plans;
     310                 :             :             OffsetNumber *frz_offsets;
     311                 :             : 
     312                 :          30 :             char       *cursor = XLogRecGetBlockData(record, 0, &datalen);
     313                 :             : 
     314                 :          30 :             heap_xlog_deserialize_prune_and_freeze(cursor, xlrec->flags,
     315                 :             :                                                    &nplans, &plans, &frz_offsets,
     316                 :             :                                                    &nredirected, &redirected,
     317                 :             :                                                    &ndead, &nowdead,
     318                 :             :                                                    &nunused, &nowunused);
     319                 :             : 
     320                 :          30 :             appendStringInfo(buf, ", nplans: %u, nredirected: %u, ndead: %u, nunused: %u",
     321                 :             :                              nplans, nredirected, ndead, nunused);
     322                 :             : 
     323         [ +  + ]:          30 :             if (nplans > 0)
     324                 :             :             {
     325                 :           6 :                 appendStringInfoString(buf, ", plans:");
     326                 :           6 :                 array_desc(buf, plans, sizeof(xlhp_freeze_plan), nplans,
     327                 :             :                            &plan_elem_desc, &frz_offsets);
     328                 :             :             }
     329                 :             : 
     330         [ +  + ]:          30 :             if (nredirected > 0)
     331                 :             :             {
     332                 :           7 :                 appendStringInfoString(buf, ", redirected:");
     333                 :           7 :                 array_desc(buf, redirected, sizeof(OffsetNumber) * 2,
     334                 :             :                            nredirected, &redirect_elem_desc, NULL);
     335                 :             :             }
     336                 :             : 
     337         [ +  + ]:          30 :             if (ndead > 0)
     338                 :             :             {
     339                 :          19 :                 appendStringInfoString(buf, ", dead:");
     340                 :          19 :                 array_desc(buf, nowdead, sizeof(OffsetNumber), ndead,
     341                 :             :                            &offset_elem_desc, NULL);
     342                 :             :             }
     343                 :             : 
     344         [ +  + ]:          30 :             if (nunused > 0)
     345                 :             :             {
     346                 :           9 :                 appendStringInfoString(buf, ", unused:");
     347                 :           9 :                 array_desc(buf, nowunused, sizeof(OffsetNumber), nunused,
     348                 :             :                            &offset_elem_desc, NULL);
     349                 :             :             }
     350                 :             :         }
     351                 :             :     }
     352         [ +  - ]:          20 :     else if (info == XLOG_HEAP2_MULTI_INSERT)
     353                 :             :     {
     354                 :          20 :         xl_heap_multi_insert *xlrec = (xl_heap_multi_insert *) rec;
     355                 :          20 :         bool        isinit = (XLogRecGetInfo(record) & XLOG_HEAP_INIT_PAGE) != 0;
     356                 :             : 
     357                 :          20 :         appendStringInfo(buf, "ntuples: %d, flags: 0x%02X", xlrec->ntuples,
     358                 :          20 :                          xlrec->flags);
     359                 :             : 
     360         [ -  + ]:          20 :         if (xlrec->flags & XLH_INSERT_ALL_FROZEN_SET)
     361                 :           0 :             appendStringInfo(buf, ", vm_flags: 0x%02X",
     362                 :             :                              VISIBILITYMAP_ALL_VISIBLE |
     363                 :             :                              VISIBILITYMAP_ALL_FROZEN);
     364                 :             : 
     365   [ +  +  +  - ]:          20 :         if (XLogRecHasBlockData(record, 0) && !isinit)
     366                 :             :         {
     367                 :          18 :             appendStringInfoString(buf, ", offsets:");
     368                 :          18 :             array_desc(buf, xlrec->offsets, sizeof(OffsetNumber),
     369                 :          18 :                        xlrec->ntuples, &offset_elem_desc, NULL);
     370                 :             :         }
     371                 :             :     }
     372         [ #  # ]:           0 :     else if (info == XLOG_HEAP2_LOCK_UPDATED)
     373                 :             :     {
     374                 :           0 :         xl_heap_lock_updated *xlrec = (xl_heap_lock_updated *) rec;
     375                 :             : 
     376                 :           0 :         appendStringInfo(buf, "xmax: %u, off: %u, ",
     377                 :           0 :                          xlrec->xmax, xlrec->offnum);
     378                 :           0 :         infobits_desc(buf, xlrec->infobits_set, "infobits");
     379                 :           0 :         appendStringInfo(buf, ", flags: 0x%02X", xlrec->flags);
     380                 :             :     }
     381         [ #  # ]:           0 :     else if (info == XLOG_HEAP2_NEW_CID)
     382                 :             :     {
     383                 :           0 :         xl_heap_new_cid *xlrec = (xl_heap_new_cid *) rec;
     384                 :             : 
     385                 :           0 :         appendStringInfo(buf, "rel: %u/%u/%u, tid: %u/%u",
     386                 :             :                          xlrec->target_locator.spcOid,
     387                 :             :                          xlrec->target_locator.dbOid,
     388                 :             :                          xlrec->target_locator.relNumber,
     389                 :           0 :                          ItemPointerGetBlockNumber(&(xlrec->target_tid)),
     390                 :           0 :                          ItemPointerGetOffsetNumber(&(xlrec->target_tid)));
     391                 :           0 :         appendStringInfo(buf, ", cmin: %u, cmax: %u, combo: %u",
     392                 :             :                          xlrec->cmin, xlrec->cmax, xlrec->combocid);
     393                 :             :     }
     394                 :          50 : }
     395                 :             : 
     396                 :             : const char *
     397                 :       30953 : heap_identify(uint8 info)
     398                 :             : {
     399                 :       30953 :     const char *id = NULL;
     400                 :             : 
     401   [ +  +  +  +  :       30953 :     switch (info & ~XLR_INFO_MASK)
          +  +  -  -  -  
                +  +  - ]
     402                 :             :     {
     403                 :       29490 :         case XLOG_HEAP_INSERT:
     404                 :       29490 :             id = "INSERT";
     405                 :       29490 :             break;
     406                 :        1413 :         case XLOG_HEAP_INSERT | XLOG_HEAP_INIT_PAGE:
     407                 :        1413 :             id = "INSERT+INIT";
     408                 :        1413 :             break;
     409                 :          20 :         case XLOG_HEAP_DELETE:
     410                 :          20 :             id = "DELETE";
     411                 :          20 :             break;
     412                 :           5 :         case XLOG_HEAP_UPDATE:
     413                 :           5 :             id = "UPDATE";
     414                 :           5 :             break;
     415                 :           1 :         case XLOG_HEAP_UPDATE | XLOG_HEAP_INIT_PAGE:
     416                 :           1 :             id = "UPDATE+INIT";
     417                 :           1 :             break;
     418                 :          16 :         case XLOG_HEAP_HOT_UPDATE:
     419                 :          16 :             id = "HOT_UPDATE";
     420                 :          16 :             break;
     421                 :           0 :         case XLOG_HEAP_HOT_UPDATE | XLOG_HEAP_INIT_PAGE:
     422                 :           0 :             id = "HOT_UPDATE+INIT";
     423                 :           0 :             break;
     424                 :           0 :         case XLOG_HEAP_TRUNCATE:
     425                 :           0 :             id = "TRUNCATE";
     426                 :           0 :             break;
     427                 :           0 :         case XLOG_HEAP_CONFIRM:
     428                 :           0 :             id = "HEAP_CONFIRM";
     429                 :           0 :             break;
     430                 :           6 :         case XLOG_HEAP_LOCK:
     431                 :           6 :             id = "LOCK";
     432                 :           6 :             break;
     433                 :           2 :         case XLOG_HEAP_INPLACE:
     434                 :           2 :             id = "INPLACE";
     435                 :           2 :             break;
     436                 :             :     }
     437                 :             : 
     438                 :       30953 :     return id;
     439                 :             : }
     440                 :             : 
     441                 :             : const char *
     442                 :          50 : heap2_identify(uint8 info)
     443                 :             : {
     444                 :          50 :     const char *id = NULL;
     445                 :             : 
     446   [ +  +  +  +  :          50 :     switch (info & ~XLR_INFO_MASK)
             -  -  -  -  
                      - ]
     447                 :             :     {
     448                 :          17 :         case XLOG_HEAP2_PRUNE_ON_ACCESS:
     449                 :          17 :             id = "PRUNE_ON_ACCESS";
     450                 :          17 :             break;
     451                 :          11 :         case XLOG_HEAP2_PRUNE_VACUUM_SCAN:
     452                 :          11 :             id = "PRUNE_VACUUM_SCAN";
     453                 :          11 :             break;
     454                 :           2 :         case XLOG_HEAP2_PRUNE_VACUUM_CLEANUP:
     455                 :           2 :             id = "PRUNE_VACUUM_CLEANUP";
     456                 :           2 :             break;
     457                 :          20 :         case XLOG_HEAP2_MULTI_INSERT:
     458                 :          20 :             id = "MULTI_INSERT";
     459                 :          20 :             break;
     460                 :           0 :         case XLOG_HEAP2_MULTI_INSERT | XLOG_HEAP_INIT_PAGE:
     461                 :           0 :             id = "MULTI_INSERT+INIT";
     462                 :           0 :             break;
     463                 :           0 :         case XLOG_HEAP2_LOCK_UPDATED:
     464                 :           0 :             id = "LOCK_UPDATED";
     465                 :           0 :             break;
     466                 :           0 :         case XLOG_HEAP2_NEW_CID:
     467                 :           0 :             id = "NEW_CID";
     468                 :           0 :             break;
     469                 :           0 :         case XLOG_HEAP2_REWRITE:
     470                 :           0 :             id = "REWRITE";
     471                 :           0 :             break;
     472                 :             :     }
     473                 :             : 
     474                 :          50 :     return id;
     475                 :             : }
        

Generated by: LCOV version 2.0-1