LCOV - differential code coverage report
Current view: top level - src/backend/access/rmgrdesc - heapdesc.c (source / functions) Coverage Total Hit UNC UBC GBC GIC GNC CBC DUB DCB
Current: Differential Code Coverage 16@8cea358b128 vs 17@8cea358b128 Lines: 89.7 % 252 226 26 40 1 71 114 14 31
Current Date: 2024-04-14 14:21:10 Functions: 100.0 % 8 8 6 2
Baseline: 16@8cea358b128 Branches: 79.1 % 110 87 4 19 14 30 43
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 % 68 68 1 67
(180,240] days: 100.0 % 3 3 3
(240..) days: 85.6 % 181 155 26 39 1 1 114
Function coverage date bins:
[..60] days: 100.0 % 1 1 1
(240..) days: 100.0 % 7 7 5 2
Branch coverage date bins:
[..60] days: 88.2 % 34 30 4 30
(240..) days: 75.0 % 76 57 19 14 43

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

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