| /*------------------------------------------------------------------------- |
| * |
| * spgdesc.c |
| * rmgr descriptor routines for access/spgist/spgxlog.c |
| * |
| * Portions Copyright (c) 1996-2021, PostgreSQL Global Development Group |
| * Portions Copyright (c) 1994, Regents of the University of California |
| * |
| * |
| * IDENTIFICATION |
| * src/backend/access/rmgrdesc/spgdesc.c |
| * |
| *------------------------------------------------------------------------- |
| */ |
| #include "postgres.h" |
| |
| #include "access/spgxlog.h" |
| |
| void |
| spg_desc(StringInfo buf, XLogReaderState *record) |
| { |
| char *rec = XLogRecGetData(record); |
| uint8 info = XLogRecGetInfo(record) & ~XLR_INFO_MASK; |
| |
| switch (info) |
| { |
| case XLOG_SPGIST_ADD_LEAF: |
| { |
| spgxlogAddLeaf *xlrec = (spgxlogAddLeaf *) rec; |
| |
| appendStringInfo(buf, "off: %u, headoff: %u, parentoff: %u, nodeI: %u", |
| xlrec->offnumLeaf, xlrec->offnumHeadLeaf, |
| xlrec->offnumParent, xlrec->nodeI); |
| if (xlrec->newPage) |
| appendStringInfoString(buf, " (newpage)"); |
| if (xlrec->storesNulls) |
| appendStringInfoString(buf, " (nulls)"); |
| } |
| break; |
| case XLOG_SPGIST_MOVE_LEAFS: |
| { |
| spgxlogMoveLeafs *xlrec = (spgxlogMoveLeafs *) rec; |
| |
| appendStringInfo(buf, "nmoves: %u, parentoff: %u, nodeI: %u", |
| xlrec->nMoves, |
| xlrec->offnumParent, xlrec->nodeI); |
| if (xlrec->newPage) |
| appendStringInfoString(buf, " (newpage)"); |
| if (xlrec->replaceDead) |
| appendStringInfoString(buf, " (replacedead)"); |
| if (xlrec->storesNulls) |
| appendStringInfoString(buf, " (nulls)"); |
| } |
| break; |
| case XLOG_SPGIST_ADD_NODE: |
| { |
| spgxlogAddNode *xlrec = (spgxlogAddNode *) rec; |
| |
| appendStringInfo(buf, "off: %u, newoff: %u, parentBlk: %d, " |
| "parentoff: %u, nodeI: %u", |
| xlrec->offnum, |
| xlrec->offnumNew, |
| xlrec->parentBlk, |
| xlrec->offnumParent, |
| xlrec->nodeI); |
| if (xlrec->newPage) |
| appendStringInfoString(buf, " (newpage)"); |
| } |
| break; |
| case XLOG_SPGIST_SPLIT_TUPLE: |
| { |
| spgxlogSplitTuple *xlrec = (spgxlogSplitTuple *) rec; |
| |
| appendStringInfo(buf, "prefixoff: %u, postfixoff: %u", |
| xlrec->offnumPrefix, |
| xlrec->offnumPostfix); |
| if (xlrec->newPage) |
| appendStringInfoString(buf, " (newpage)"); |
| if (xlrec->postfixBlkSame) |
| appendStringInfoString(buf, " (same)"); |
| } |
| break; |
| case XLOG_SPGIST_PICKSPLIT: |
| { |
| spgxlogPickSplit *xlrec = (spgxlogPickSplit *) rec; |
| |
| appendStringInfo(buf, "ndelete: %u, ninsert: %u, inneroff: %u, " |
| "parentoff: %u, nodeI: %u", |
| xlrec->nDelete, xlrec->nInsert, |
| xlrec->offnumInner, |
| xlrec->offnumParent, xlrec->nodeI); |
| if (xlrec->innerIsParent) |
| appendStringInfoString(buf, " (innerIsParent)"); |
| if (xlrec->storesNulls) |
| appendStringInfoString(buf, " (nulls)"); |
| if (xlrec->isRootSplit) |
| appendStringInfoString(buf, " (isRootSplit)"); |
| } |
| break; |
| case XLOG_SPGIST_VACUUM_LEAF: |
| { |
| spgxlogVacuumLeaf *xlrec = (spgxlogVacuumLeaf *) rec; |
| |
| appendStringInfo(buf, "ndead: %u, nplaceholder: %u, nmove: %u, nchain: %u", |
| xlrec->nDead, xlrec->nPlaceholder, |
| xlrec->nMove, xlrec->nChain); |
| } |
| break; |
| case XLOG_SPGIST_VACUUM_ROOT: |
| { |
| spgxlogVacuumRoot *xlrec = (spgxlogVacuumRoot *) rec; |
| |
| appendStringInfo(buf, "ndelete: %u", |
| xlrec->nDelete); |
| } |
| break; |
| case XLOG_SPGIST_VACUUM_REDIRECT: |
| { |
| spgxlogVacuumRedirect *xlrec = (spgxlogVacuumRedirect *) rec; |
| |
| appendStringInfo(buf, "ntoplaceholder: %u, firstplaceholder: %u, newestredirectxid: %u", |
| xlrec->nToPlaceholder, |
| xlrec->firstPlaceholder, |
| xlrec->newestRedirectXid); |
| } |
| break; |
| } |
| } |
| |
| const char * |
| spg_identify(uint8 info) |
| { |
| const char *id = NULL; |
| |
| switch (info & ~XLR_INFO_MASK) |
| { |
| case XLOG_SPGIST_ADD_LEAF: |
| id = "ADD_LEAF"; |
| break; |
| case XLOG_SPGIST_MOVE_LEAFS: |
| id = "MOVE_LEAFS"; |
| break; |
| case XLOG_SPGIST_ADD_NODE: |
| id = "ADD_NODE"; |
| break; |
| case XLOG_SPGIST_SPLIT_TUPLE: |
| id = "SPLIT_TUPLE"; |
| break; |
| case XLOG_SPGIST_PICKSPLIT: |
| id = "PICKSPLIT"; |
| break; |
| case XLOG_SPGIST_VACUUM_LEAF: |
| id = "VACUUM_LEAF"; |
| break; |
| case XLOG_SPGIST_VACUUM_ROOT: |
| id = "VACUUM_ROOT"; |
| break; |
| case XLOG_SPGIST_VACUUM_REDIRECT: |
| id = "VACUUM_REDIRECT"; |
| break; |
| } |
| |
| return id; |
| } |