| 1 | /*------------------------------------------------------------------------- |
| 2 | * |
| 3 | * spgdesc.c |
| 4 | * rmgr descriptor routines for access/spgist/spgxlog.c |
| 5 | * |
| 6 | * Portions Copyright (c) 1996-2019, PostgreSQL Global Development Group |
| 7 | * Portions Copyright (c) 1994, Regents of the University of California |
| 8 | * |
| 9 | * |
| 10 | * IDENTIFICATION |
| 11 | * src/backend/access/rmgrdesc/spgdesc.c |
| 12 | * |
| 13 | *------------------------------------------------------------------------- |
| 14 | */ |
| 15 | #include "postgres.h" |
| 16 | |
| 17 | #include "access/spgxlog.h" |
| 18 | |
| 19 | void |
| 20 | spg_desc(StringInfo buf, XLogReaderState *record) |
| 21 | { |
| 22 | char *rec = XLogRecGetData(record); |
| 23 | uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK; |
| 24 | |
| 25 | switch (info) |
| 26 | { |
| 27 | case XLOG_SPGIST_ADD_LEAF: |
| 28 | { |
| 29 | spgxlogAddLeaf *xlrec = (spgxlogAddLeaf *) rec; |
| 30 | |
| 31 | appendStringInfoString(buf, "add leaf to page" ); |
| 32 | appendStringInfo(buf, "; off %u; headoff %u; parentoff %u" , |
| 33 | xlrec->offnumLeaf, xlrec->offnumHeadLeaf, |
| 34 | xlrec->offnumParent); |
| 35 | if (xlrec->newPage) |
| 36 | appendStringInfoString(buf, " (newpage)" ); |
| 37 | if (xlrec->storesNulls) |
| 38 | appendStringInfoString(buf, " (nulls)" ); |
| 39 | } |
| 40 | break; |
| 41 | case XLOG_SPGIST_MOVE_LEAFS: |
| 42 | appendStringInfo(buf, "%u leafs" , |
| 43 | ((spgxlogMoveLeafs *) rec)->nMoves); |
| 44 | break; |
| 45 | case XLOG_SPGIST_ADD_NODE: |
| 46 | appendStringInfo(buf, "off %u" , |
| 47 | ((spgxlogAddNode *) rec)->offnum); |
| 48 | break; |
| 49 | case XLOG_SPGIST_SPLIT_TUPLE: |
| 50 | appendStringInfo(buf, "prefix off: %u, postfix off: %u (same %d, new %d)" , |
| 51 | ((spgxlogSplitTuple *) rec)->offnumPrefix, |
| 52 | ((spgxlogSplitTuple *) rec)->offnumPostfix, |
| 53 | ((spgxlogSplitTuple *) rec)->postfixBlkSame, |
| 54 | ((spgxlogSplitTuple *) rec)->newPage |
| 55 | ); |
| 56 | break; |
| 57 | case XLOG_SPGIST_PICKSPLIT: |
| 58 | { |
| 59 | spgxlogPickSplit *xlrec = (spgxlogPickSplit *) rec; |
| 60 | |
| 61 | appendStringInfo(buf, "ndel %u; nins %u" , |
| 62 | xlrec->nDelete, xlrec->nInsert); |
| 63 | if (xlrec->innerIsParent) |
| 64 | appendStringInfoString(buf, " (innerIsParent)" ); |
| 65 | if (xlrec->isRootSplit) |
| 66 | appendStringInfoString(buf, " (isRootSplit)" ); |
| 67 | } |
| 68 | break; |
| 69 | case XLOG_SPGIST_VACUUM_LEAF: |
| 70 | /* no further information */ |
| 71 | break; |
| 72 | case XLOG_SPGIST_VACUUM_ROOT: |
| 73 | /* no further information */ |
| 74 | break; |
| 75 | case XLOG_SPGIST_VACUUM_REDIRECT: |
| 76 | appendStringInfo(buf, "newest XID %u" , |
| 77 | ((spgxlogVacuumRedirect *) rec)->newestRedirectXid); |
| 78 | break; |
| 79 | } |
| 80 | } |
| 81 | |
| 82 | const char * |
| 83 | spg_identify(uint8 info) |
| 84 | { |
| 85 | const char *id = NULL; |
| 86 | |
| 87 | switch (info & ~XLR_INFO_MASK) |
| 88 | { |
| 89 | case XLOG_SPGIST_ADD_LEAF: |
| 90 | id = "ADD_LEAF" ; |
| 91 | break; |
| 92 | case XLOG_SPGIST_MOVE_LEAFS: |
| 93 | id = "MOVE_LEAFS" ; |
| 94 | break; |
| 95 | case XLOG_SPGIST_ADD_NODE: |
| 96 | id = "ADD_NODE" ; |
| 97 | break; |
| 98 | case XLOG_SPGIST_SPLIT_TUPLE: |
| 99 | id = "SPLIT_TUPLE" ; |
| 100 | break; |
| 101 | case XLOG_SPGIST_PICKSPLIT: |
| 102 | id = "PICKSPLIT" ; |
| 103 | break; |
| 104 | case XLOG_SPGIST_VACUUM_LEAF: |
| 105 | id = "VACUUM_LEAF" ; |
| 106 | break; |
| 107 | case XLOG_SPGIST_VACUUM_ROOT: |
| 108 | id = "VACUUM_ROOT" ; |
| 109 | break; |
| 110 | case XLOG_SPGIST_VACUUM_REDIRECT: |
| 111 | id = "VACUUM_REDIRECT" ; |
| 112 | break; |
| 113 | } |
| 114 | |
| 115 | return id; |
| 116 | } |
| 117 | |