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

235 for (i = 0; i < *n; i++)

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)