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 %zu bytes", itupsize);
103 data += itupsize;
104
106
107 ninserted++;
108 }
110 {
111
113
115
119 }
120
121
122 if (data - begin < datalen)
123 {
126
127 while (data - begin < datalen)
128 {
132
134
135 l = PageAddItem(page, itup, sz, off, false, false);
137 elog(ERROR, "failed to add item to GiST index page, size %zu bytes", sz);
138 off++;
139 ninserted++;
140 }
141 }
142
143
145
148 }
149
150
151
152
153
154
155
156
159
162}
163
164
165
166
167
168
169static void
171{
177
178
179
180
181
182
183
184
185
186
187
188
190 {
192
194
197 rlocator);
198 }
199
201 {
203
205
208
211 }
212
215}
216
217
218
219
222{
223 char *ptr;
224 int i = 0;
226
227
228 memcpy(n, begin, sizeof(int));
229 ptr = begin + sizeof(int);
230
232
234 {
238 }
240
241 return tuples;
242}
243
244static void
246{
252 int i;
253 bool isrootsplit = false;
254
255
256
257
258
259
260
261
262
263
264 for (i = 0; i < xldata->npage; i++)
265 {
266 int flags;
268 Size datalen;
269 int num;
272
275 {
277 isrootsplit = true;
278 }
279
283
285
286
289 else
290 flags = 0;
292
293
295
297 {
301 }
302 else
303 {
304 if (i < xldata->npage - 1)
305 {
307
310 }
311 else
314 if (i < xldata->npage - 1 && !isrootsplit &&
317 else
319 }
320
323
324 if (i == 0)
325 firstbuffer = buffer;
326 else
328 }
329
330
333
334
336}
337
338
339static void
341{
346
348 {
350
352
355 }
356
358 {
360
362
365 }
366
371}
372
373static void
375{
377
378
379
380
381
382
383
384
385
386
387
392}
393
394void
396{
399
400
401
402
403
404
405
407 switch (info)
408 {
411 break;
414 break;
417 break;
420 break;
423 break;
425
426 break;
427 default:
428 elog(PANIC, "gist_redo: unknown op code %u", info);
429 }
430
433}
434
435void
437{
439}
440
441void
443{
445}
446
447
448
449
450void
452{
454
456
459
460
461
462
463
465
466
467
468
469
471
473 {
474
475
476
477
478
480 }
481
482
483
484
485
487}
488
489
490
491
496 Buffer leftchildbuf, bool markfollowright)
497{
500 int npage = 0;
502 int i;
503
504 for (ptr = dist; ptr; ptr = ptr->next)
505 npage++;
506
509 xlrec.origleaf = page_is_leaf;
512
514
515
516
517
518
521
522
523
524
525
526
527
528
530
531 i = 1;
532 for (ptr = dist; ptr; ptr = ptr->next)
533 {
537 i++;
538 }
539
541
542 return recptr;
543}
544
545
546
547
548
552{
555
558
561
564
566
567 return recptr;
568}
569
570
571
572
575{
576 int dummy = 0;
577
578
579
580
581
586}
587
588
589
590
591void
594{
596
597
598
599
600
601
602
603
606 xlrec_reuse.block = blkno;
608
611
613}
614
615
616
617
618
619
620
621
622
623
624
625
631{
633 int i;
635
638
641
644
645
646 for (i = 0; i < ituplen; i++)
648
649
650
651
652
655
657
658 return recptr;
659}
660
661
662
663
664
665
666
670{
673
677
680
681
682
683
684
685
687
689
691
692 return recptr;
693}
#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, const void *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)