PostgreSQL Source Code: src/backend/access/gist/gistxlog.c Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13
15
25
27
28
29
30
31
32
33
34
35
36
37
38
39static void
41{
46
47
48
49
50
53 {
55
58
61 }
64}
65
66
67
68
69static void
71{
76
78 {
79 char *begin;
83
85
87
89 {
90
91
92
93
96 Size itupsize;
97
102 elog(ERROR, "failed to add item to GiST index page, size %d bytes",
103 (int) itupsize);
104 data += itupsize;
105
107
108 ninserted++;
109 }
111 {
112
114
116
120 }
121
122
123 if (data - begin < datalen)
124 {
127
128 while (data - begin < datalen)
129 {
133
135
136 l = PageAddItem(page, (Item) itup, sz, off, false, false);
138 elog(ERROR, "failed to add item to GiST index page, size %d bytes",
139 (int) sz);
140 off++;
141 ninserted++;
142 }
143 }
144
145
147
150 }
151
152
153
154
155
156
157
158
161
164}
165
166
167
168
169
170
171static void
173{
179
180
181
182
183
184
185
186
187
188
189
190
192 {
194
196
199 rlocator);
200 }
201
203 {
205
207
210
213 }
214
217}
218
219
220
221
224{
225 char *ptr;
226 int i = 0;
228
229
230 memcpy(n, begin, sizeof(int));
231 ptr = begin + sizeof(int);
232
234
236 {
240 }
242
243 return tuples;
244}
245
246static void
248{
254 int i;
255 bool isrootsplit = false;
256
257
258
259
260
261
262
263
264
265
266 for (i = 0; i < xldata->npage; i++)
267 {
268 int flags;
270 Size datalen;
271 int num;
274
277 {
279 isrootsplit = true;
280 }
281
285
287
288
291 else
292 flags = 0;
294
295
297
299 {
303 }
304 else
305 {
306 if (i < xldata->npage - 1)
307 {
309
312 }
313 else
316 if (i < xldata->npage - 1 && !isrootsplit &&
319 else
321 }
322
325
326 if (i == 0)
327 firstbuffer = buffer;
328 else
330 }
331
332
335
336
338}
339
340
341static void
343{
348
350 {
352
354
357 }
358
360 {
362
364
367 }
368
373}
374
375static void
377{
379
380
381
382
383
384
385
386
387
388
389
394}
395
396void
398{
401
402
403
404
405
406
407
409 switch (info)
410 {
413 break;
416 break;
419 break;
422 break;
425 break;
427
428 break;
429 default:
430 elog(PANIC, "gist_redo: unknown op code %u", info);
431 }
432
435}
436
437void
439{
441}
442
443void
445{
447}
448
449
450
451
452void
454{
456
458
461
462
463
464
465
467
468
469
470
471
473
475 {
476
477
478
479
480
482 }
483
484
485
486
487
489}
490
491
492
493
498 Buffer leftchildbuf, bool markfollowright)
499{
502 int npage = 0;
504 int i;
505
506 for (ptr = dist; ptr; ptr = ptr->next)
507 npage++;
508
511 xlrec.origleaf = page_is_leaf;
514
516
517
518
519
520
523
524
525
526
527
528
529
530
532
533 i = 1;
534 for (ptr = dist; ptr; ptr = ptr->next)
535 {
539 i++;
540 }
541
543
544 return recptr;
545}
546
547
548
549
550
554{
557
560
563
566
568
569 return recptr;
570}
571
572
573
574
577{
578 int dummy = 0;
579
580
581
582
583
588}
589
590
591
592
593void
596{
598
599
600
601
602
603
604
605
608 xlrec_reuse.block = blkno;
610
613
615}
616
617
618
619
620
621
622
623
624
625
626
627
633{
635 int i;
637
640
643
646
647
648 for (i = 0; i < ituplen; i++)
650
651
652
653
654
657
659
660 return recptr;
661}
662
663
664
665
666
667
668
672{
675
679
682
683
684
685
686
687
689
691
693
694 return recptr;
695}
#define InvalidBlockNumber
void mask_lp_flags(Page page)
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)
bool PageIndexTupleOverwrite(Page page, OffsetNumber offnum, Item newtup, Size newsize)
void PageIndexTupleDelete(Page page, OffsetNumber offnum)
static bool PageIsEmpty(const PageData *page)
static void PageSetLSN(Page page, XLogRecPtr lsn)
#define PageAddItem(page, item, size, offsetNumber, overwrite, is_heap)
static OffsetNumber PageGetMaxOffsetNumber(const PageData *page)
#define PG_USED_FOR_ASSERTS_ONLY
MemoryContext createTempGistContext(void)
#define GistMarkFollowRight(page)
#define GistClearFollowRight(page)
#define GistClearPageHasGarbage(page)
#define GistPageIsLeaf(page)
static void GistPageSetDeleted(Page page, FullTransactionId deletexid)
#define GistMarkTuplesDeleted(page)
#define GistPageSetNSN(page, val)
#define GistPageGetOpaque(page)
void gistfillbuffer(Page page, IndexTuple *itup, int len, OffsetNumber off)
void GISTInitBuffer(Buffer b, uint32 f)
static void gistRedoPageReuse(XLogReaderState *record)
void gist_xlog_startup(void)
static void gistRedoPageUpdateRecord(XLogReaderState *record)
static void gistRedoPageSplitRecord(XLogReaderState *record)
void gist_redo(XLogReaderState *record)
XLogRecPtr gistXLogAssignLSN(void)
static void gistRedoPageDelete(XLogReaderState *record)
XLogRecPtr gistXLogSplit(bool page_is_leaf, SplitPageLayout *dist, BlockNumber origrlink, GistNSN orignsn, Buffer leftchildbuf, bool markfollowright)
XLogRecPtr gistXLogPageDelete(Buffer buffer, FullTransactionId xid, Buffer parentBuffer, OffsetNumber downlinkOffset)
XLogRecPtr gistXLogDelete(Buffer buffer, OffsetNumber *todelete, int ntodelete, TransactionId snapshotConflictHorizon, Relation heaprel)
static IndexTuple * decodePageSplitRecord(char *begin, int len, int *n)
static void gistRedoDeleteRecord(XLogReaderState *record)
void gistXLogPageReuse(Relation rel, Relation heaprel, BlockNumber blkno, FullTransactionId deleteXid)
XLogRecPtr gistXLogUpdate(Buffer buffer, OffsetNumber *todelete, int ntodelete, IndexTuple *itup, int ituplen, Buffer leftchildbuf)
void gist_xlog_cleanup(void)
static void gistRedoClearFollowRight(XLogReaderState *record, uint8 block_id)
static MemoryContext opCtx
void gist_mask(char *pagedata, BlockNumber blkno)
#define SizeOfGistxlogPageDelete
#define XLOG_GIST_ASSIGN_LSN
#define SizeOfGistxlogDelete
#define XLOG_GIST_PAGE_REUSE
#define XLOG_GIST_PAGE_DELETE
#define SizeOfGistxlogPageReuse
#define XLOG_GIST_PAGE_SPLIT
#define XLOG_GIST_PAGE_UPDATE
Assert(PointerIsAligned(start, uint64))
IndexTupleData * IndexTuple
static Size IndexTupleSize(const IndexTupleData *itup)
void MemoryContextReset(MemoryContext context)
void MemoryContextDelete(MemoryContext context)
#define InvalidOffsetNumber
#define OffsetNumberNext(offsetNumber)
#define FirstOffsetNumber
static MemoryContext MemoryContextSwitchTo(MemoryContext context)
#define RelationIsAccessibleInLogicalDecoding(relation)
void ResolveRecoveryConflictWithSnapshotFullXid(FullTransactionId snapshotConflictHorizon, bool isCatalogRel, RelFileLocator locator)
void ResolveRecoveryConflictWithSnapshot(TransactionId snapshotConflictHorizon, bool isCatalogRel, RelFileLocator locator)
RelFileLocator rd_locator
struct SplitPageLayout * next
TransactionId snapshotConflictHorizon
OffsetNumber offsets[FLEXIBLE_ARRAY_MEMBER]
FullTransactionId deleteXid
OffsetNumber downlinkOffset
#define XLOG_MARK_UNIMPORTANT
XLogRecPtr XLogInsert(RmgrId rmid, uint8 info)
void XLogRegisterBufData(uint8 block_id, const void *data, uint32 len)
void XLogRegisterData(const void *data, uint32 len)
void XLogSetRecordFlags(uint8 flags)
void XLogRegisterBuffer(uint8 block_id, Buffer buffer, uint8 flags)
void XLogBeginInsert(void)
char * XLogRecGetBlockData(XLogReaderState *record, uint8 block_id, Size *len)
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)