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

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

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)