PostgreSQL Source Code: src/backend/access/spgist/spgxlog.c Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
16
23
24
26
27
28
29
30
31
32
33
34static void
36{
38
42}
43
44
45
46
47
48
49static void
51{
53 {
56
58 elog(ERROR, "SPGiST tuple to be replaced is not a placeholder");
59
62
64 }
65
67
68 if (PageAddItem(page, tuple, size, offset, false, false) != offset)
69 elog(ERROR, "failed to add item of size %u to SPGiST index page",
70 size);
71}
72
73static void
75{
79 char *leafTuple;
84
86 leafTuple = ptr;
87
89
90
91
92
93
94
96 {
101 }
102 else
104
106 {
108
109
111 {
112
115
116
118 {
120
125 }
126 }
127 else
128 {
129
132 (Item) leafTuple, leafTupleHdr.size,
134 elog(ERROR, "failed to add item of size %u to SPGiST index page",
135 leafTupleHdr.size);
136 }
137
140 }
143
144
146 {
148 {
151
153
155
158
161
164 }
167 }
168}
169
170static void
172{
179 int nInsert;
184
186
188
190
196
197
198
199
200
201
202
203
204
205
207 {
212 }
213 else
215
217 {
218 int i;
219
221
222 for (i = 0; i < nInsert; i++)
223 {
224 char *leafTuple;
226
227
228
229
230
231 leafTuple = ptr;
232 memcpy(&leafTupleHdr, leafTuple,
234
236 leafTupleHdr.size, toInsert[i]);
237 ptr += leafTupleHdr.size;
238 }
239
242 }
245
246
248 {
250
254 blknoDst,
255 toInsert[nInsert - 1]);
256
259 }
262
263
265 {
267
269
272
274 blknoDst, toInsert[nInsert - 1]);
275
278 }
281}
282
283static void
285{
289 char *innerTuple;
295
297 innerTuple = ptr;
298
300
302
304 {
305
308 {
310
314 false, false) != xldata->offnum)
315 elog(ERROR, "failed to add item of size %u to SPGiST index page",
316 innerTupleHdr.size);
317
320 }
323 }
324 else
325 {
328
331
332
333
334
335
336
337
338
339
340
342 {
343
347 }
348 else
351 {
353
356
357
358
359
361 {
363
366
369 }
372 }
375
376
378 {
380
382
383 if (state.isBuild)
387 else
389 blknoNew,
391
395 false, false) != xldata->offnum)
396 elog(ERROR, "failed to add item of size %u to SPGiST index page",
398
399 if (state.isBuild)
401 else
403
404
405
406
408 {
410
413
416 }
419 }
422
423
424
425
426
428 {
430 {
432
434
437
440
443 }
446 }
447 }
448}
449
450static void
452{
456 char *prefixTuple;
458 char *postfixTuple;
463
465 prefixTuple = ptr;
466
468 ptr += prefixTupleHdr.size;
469 postfixTuple = ptr;
470
472
473
474
475
476
477
478
479
481 {
483 {
485
488 }
489 else
492 {
494
497
500 }
503 }
504
505
507 {
509
513 elog(ERROR, "failed to add item of size %u to SPGiST index page",
514 prefixTupleHdr.size);
515
518 postfixTupleHdr.size,
520
523 }
526}
527
528static void
530{
534 char *innerTuple;
539 uint8 *leafPageSelect;
543 Page srcPage;
544 Page destPage;
546 int i;
549
551
553
559 leafPageSelect = (uint8 *) ptr;
561
562 innerTuple = ptr;
563
565 ptr += innerTupleHdr.size;
566
567
568
570 {
571
573 srcPage = NULL;
574 }
575 else if (xldata->initSrc)
576 {
577
580
583
584 }
585 else
586 {
587
588
589
590
591
592
593 srcPage = NULL;
595 {
597
598
599
600
601
602
603 if (.isBuild)
605 toDelete, xldata->nDelete,
608 blknoInner,
610 else
612 toDelete, xldata->nDelete,
617
618
619 }
620 }
621
622
624 {
626 destPage = NULL;
627 }
629 {
630
633
636
637 }
638 else
639 {
640
641
642
643
646 else
647 destPage = NULL;
648 }
649
650
651 for (i = 0; i < xldata->nInsert; i++)
652 {
653 char *leafTuple;
655
656
657 leafTuple = ptr;
659 ptr += leafTupleHdr.size;
660
661 page = leafPageSelect[i] ? destPage : srcPage;
662 if (page == NULL)
663 continue;
664
666 toInsert[i]);
667 }
668
669
670 if (srcPage != NULL)
671 {
674 }
675 if (destPage != NULL)
676 {
679 }
680
681
683 {
687 }
688 else
690
692 {
694
697
698
700 {
702
707 }
708
711 }
714
715
716
717
718
723
724
726 {
728
730 {
732
734
739
742 }
745 }
746 else
748}
749
750static void
752{
765 int i;
766
768
781
783 {
785
787 toDead, xldata->nDead,
791
797
798
799 for (i = 0; i < xldata->nMove; i++)
800 {
804
805 tmp = *idSrc;
806 *idSrc = *idDest;
807 *idDest = tmp;
808 }
809
811 moveSrc, xldata->nMove,
815
816 for (i = 0; i < xldata->nChain; i++)
817 {
819
824 }
825
828 }
831}
832
833static void
835{
842
843 toDelete = xldata->offsets;
844
846 {
848
849
851
854 }
857}
858
859static void
861{
867
868 itemToPlaceholder = xldata->offsets;
869
870
871
872
873
875 {
877
881 locator);
882 }
883
885 {
888 int i;
889
890
892 {
894
900 }
901
905
906
908 {
911
913
916
920
921
923
925 }
926
929 }
932}
933
934void
936{
939
941 switch (info)
942 {
945 break;
948 break;
951 break;
954 break;
957 break;
960 break;
963 break;
966 break;
967 default:
968 elog(PANIC, "spg_redo: unknown op code %u", info);
969 }
970
973}
974
975void
977{
979 "SP-GiST temporary context",
981}
982
983void
985{
988}
989
990
991
992
993void
995{
998
1000
1002
1003
1004
1005
1006
1009}
#define InvalidBlockNumber
void mask_page_lsn_and_checksum(Page page)
void mask_unused_space(Page page)
void mask_page_hint_bits(Page page)
void UnlockReleaseBuffer(Buffer buffer)
void MarkBufferDirty(Buffer buffer)
static Page BufferGetPage(Buffer buffer)
static bool BufferIsValid(Buffer bufnum)
void PageIndexMultiDelete(Page page, OffsetNumber *itemnos, int nitems)
void PageIndexTupleDelete(Page page, OffsetNumber offnum)
PageHeaderData * PageHeader
static Item PageGetItem(const PageData *page, const ItemIdData *itemId)
#define SizeOfPageHeaderData
static ItemId PageGetItemId(Page page, OffsetNumber offsetNumber)
static void PageSetLSN(Page page, XLogRecPtr lsn)
#define PageAddItem(page, item, size, offsetNumber, overwrite, is_heap)
static OffsetNumber PageGetMaxOffsetNumber(const PageData *page)
Assert(PointerIsAligned(start, uint64))
static void ItemPointerSetInvalid(ItemPointerData *pointer)
void MemoryContextReset(MemoryContext context)
void pfree(void *pointer)
void * palloc0(Size size)
MemoryContext CurrentMemoryContext
void MemoryContextDelete(MemoryContext context)
#define AllocSetContextCreate
#define ALLOCSET_DEFAULT_SIZES
#define InvalidOffsetNumber
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
void spgPageIndexMultiDelete(SpGistState *state, Page page, OffsetNumber *itemnos, int nitems, int firststate, int reststate, BlockNumber blkno, OffsetNumber offnum)
void spgUpdateNodeLink(SpGistInnerTuple tup, int nodeN, BlockNumber blkno, OffsetNumber offset)
SpGistDeadTupleData * SpGistDeadTuple
SpGistInnerTupleData * SpGistInnerTuple
#define SGLT_GET_NEXTOFFSET(spgLeafTuple)
#define SPGIST_PLACEHOLDER
#define SGLT_SET_NEXTOFFSET(spgLeafTuple, offsetNumber)
struct SpGistLeafTupleData * SpGistLeafTuple
#define SpGistPageGetOpaque(page)
SpGistDeadTuple spgFormDeadTuple(SpGistState *state, int tupstate, BlockNumber blkno, OffsetNumber offnum)
void SpGistInitBuffer(Buffer b, uint16 f)
static void addOrReplaceTuple(Page page, Item tuple, int size, OffsetNumber offset)
void spg_redo(XLogReaderState *record)
static void spgRedoVacuumRoot(XLogReaderState *record)
static void spgRedoSplitTuple(XLogReaderState *record)
static void spgRedoVacuumRedirect(XLogReaderState *record)
void spg_xlog_cleanup(void)
void spg_mask(char *pagedata, BlockNumber blkno)
static void spgRedoMoveLeafs(XLogReaderState *record)
static void fillFakeState(SpGistState *state, spgxlogState stateSrc)
void spg_xlog_startup(void)
static void spgRedoAddNode(XLogReaderState *record)
static MemoryContext opCtx
static void spgRedoVacuumLeaf(XLogReaderState *record)
static void spgRedoPickSplit(XLogReaderState *record)
static void spgRedoAddLeaf(XLogReaderState *record)
struct spgxlogSplitTuple spgxlogSplitTuple
#define XLOG_SPGIST_SPLIT_TUPLE
#define SizeOfSpgxlogPickSplit
#define XLOG_SPGIST_VACUUM_ROOT
struct spgxlogAddLeaf spgxlogAddLeaf
#define SizeOfSpgxlogVacuumLeaf
#define SizeOfSpgxlogMoveLeafs
#define XLOG_SPGIST_VACUUM_LEAF
#define XLOG_SPGIST_ADD_NODE
#define XLOG_SPGIST_ADD_LEAF
struct spgxlogAddNode spgxlogAddNode
#define XLOG_SPGIST_MOVE_LEAFS
#define XLOG_SPGIST_PICKSPLIT
#define XLOG_SPGIST_VACUUM_REDIRECT
void ResolveRecoveryConflictWithSnapshot(TransactionId snapshotConflictHorizon, bool isCatalogRel, RelFileLocator locator)
OffsetNumber offnumHeadLeaf
OffsetNumber offnumParent
OffsetNumber offnumParent
OffsetNumber offnumParent
OffsetNumber offnumParent
OffsetNumber offnumPostfix
OffsetNumber offnumPrefix
TransactionId redirectXid
OffsetNumber firstPlaceholder
TransactionId snapshotConflictHorizon
OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER]
OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER]
void XLogRecGetBlockTag(XLogReaderState *record, uint8 block_id, RelFileLocator *rlocator, ForkNumber *forknum, BlockNumber *blknum)
#define XLogRecGetInfo(decoder)
#define XLogRecGetData(decoder)
#define XLogRecHasBlockRef(decoder, block_id)
XLogRedoAction XLogReadBufferForRedo(XLogReaderState *record, uint8 block_id, Buffer *buf)
Buffer XLogInitBufferForRedo(XLogReaderState *record, uint8 block_id)