48 Assert(pageSize == BLCKSZ);
56 p->
pd_upper = pageSize - specialSize;
99 bool header_sane =
false;
102 if (checksum_failure_p)
103 *checksum_failure_p =
false;
117 if (checksum_failure_p)
118 *checksum_failure_p =
true;
140 pagebytes = (
size_t *) page;
154 errmsg(
"page verification failed, calculated checksum %u but expected %u",
205 bool needshuffle =
false;
216 errmsg(
"corrupted page pointers: lower = %u, upper = %u, special = %u",
230 if (offsetNumber < limit)
242 if (offsetNumber < limit)
261 offsetNumber < limit;
276 if (offsetNumber >= limit)
285 offsetNumber = limit;
290 if (offsetNumber > limit)
292 elog(
WARNING,
"specified item offset is too large");
299 elog(
WARNING,
"can't put more than MaxHeapTuplesPerPage items in a heap page");
309 if (offsetNumber == limit || needshuffle)
327 memmove(itemId + 1, itemId,
348 memcpy((
char *) page +
upper, item, size);
389 memcpy(temp, page, pageSize);
428 memcpy(oldPage, tempPage, pageSize);
488#ifdef USE_ASSERT_CHECKING
498 itemidptr = &itemidbase[
i];
522 itemidptr = &itemidbase[
i];
542 itemidptr = &itemidbase[
i];
547 memmove((
char *) page +
upper,
549 copy_tail - copy_head);
561 copy_head = itemidptr->
itemoff;
568 memmove((
char *) page +
upper,
570 copy_tail - copy_head);
575 char *scratchptr = scratch.
data;
595 itemidptr = &itemidbase[
i];
596 memcpy(scratchptr + itemidptr->
itemoff, page + itemidptr->
itemoff,
603 itemidptr = &itemidbase[0];
620 itemidptr = &itemidbase[
i];
646 itemidptr = &itemidbase[
i];
652 memcpy((
char *) page +
upper,
653 scratchptr + copy_head,
654 copy_tail - copy_head);
666 copy_head = itemidptr->
itemoff;
673 memcpy((
char *) page +
upper,
674 scratchptr + copy_head,
675 copy_tail - copy_head);
713 bool presorted =
true;
723 pd_lower > pd_upper ||
724 pd_upper > pd_special ||
725 pd_special > BLCKSZ ||
729 errmsg(
"corrupted page pointers: lower = %u, upper = %u, special = %u",
730 pd_lower, pd_upper, pd_special)));
736 itemidptr = itemidbase;
737 nunused = totallen = 0;
738 last_offset = pd_special;
749 if (last_offset > itemidptr->
itemoff)
750 last_offset = itemidptr->
itemoff;
755 itemidptr->
itemoff >= (
int) pd_special))
758 errmsg(
"corrupted line pointer: %u",
776 nstorage = itemidptr - itemidbase;
785 if (totallen > (
Size) (pd_special - pd_lower))
788 errmsg(
"corrupted item lengths: total %u, available space %u",
789 (
unsigned int) totallen, pd_special - pd_lower)));
794 if (finalusedlp != nline)
797 int nunusedend = nline - finalusedlp;
799 Assert(nunused >= nunusedend && nunusedend > 0);
802 nunused -= nunusedend;
837 bool countdone =
false,
882#ifdef CLOBBER_FREED_MEMORY
883 memset((
char *) page + phdr->
pd_lower, 0x7F,
944 if (space < (
int) (ntups *
sizeof(
ItemIdData)))
1072 errmsg(
"corrupted page pointers: lower = %u, upper = %u, special = %u",
1076 if ((
int) offnum <= 0 || (
int) offnum > nline)
1077 elog(
ERROR,
"invalid index offnum: %u", offnum);
1080 offidx = offnum - 1;
1087 if (offset < phdr->pd_upper || (offset + size) > phdr->
pd_special ||
1091 errmsg(
"corrupted line pointer: offset = %u, size = %u",
1092 offset, (
unsigned int) size)));
1104 ((
char *) &phdr->
pd_linp[offidx + 1] - (
char *) phdr);
1107 memmove(&(phdr->
pd_linp[offidx]),
1119 addr = (
char *) page + phdr->
pd_upper;
1122 memmove(addr + size, addr, offset - phdr->
pd_upper);
1139 for (
i = 1;
i <= nline;
i++)
1178 bool presorted =
true;
1201 pd_lower > pd_upper ||
1202 pd_upper > pd_special ||
1203 pd_special > BLCKSZ ||
1204 pd_special !=
MAXALIGN(pd_special))
1207 errmsg(
"corrupted page pointers: lower = %u, upper = %u, special = %u",
1208 pd_lower, pd_upper, pd_special)));
1216 itemidptr = itemidbase;
1220 last_offset = pd_special;
1227 if (offset < pd_upper ||
1228 (offset + size) > pd_special ||
1232 errmsg(
"corrupted line pointer: offset = %u, size = %u",
1233 offset, (
unsigned int) size)));
1235 if (nextitm <
nitems && offnum == itemnos[nextitm])
1245 if (last_offset > itemidptr->
itemoff)
1246 last_offset = itemidptr->
itemoff;
1252 newitemids[nused] = *lp;
1260 elog(
ERROR,
"incorrect index offsets supplied");
1262 if (totallen > (
Size) (pd_special - pd_lower))
1265 errmsg(
"corrupted item lengths: total %u, available space %u",
1266 (
unsigned int) totallen, pd_special - pd_lower)));
1313 errmsg(
"corrupted page pointers: lower = %u, upper = %u, special = %u",
1317 if ((
int) offnum <= 0 || (
int) offnum > nline)
1318 elog(
ERROR,
"invalid index offnum: %u", offnum);
1325 if (offset < phdr->pd_upper || (offset + size) > phdr->
pd_special ||
1329 errmsg(
"corrupted line pointer: offset = %u, size = %u",
1330 offset, (
unsigned int) size)));
1340 if ((
int) offnum < nline)
1356 addr = (
char *) page + phdr->
pd_upper;
1359 memmove(addr + size, addr, offset - phdr->
pd_upper);
1374 for (
i = 1;
i <= nline;
i++)
1411 Size alignednewsize;
1425 errmsg(
"corrupted page pointers: lower = %u, upper = %u, special = %u",
1429 if ((
int) offnum <= 0 || (
int) offnum > itemcount)
1430 elog(
ERROR,
"invalid index offnum: %u", offnum);
1437 if (offset < phdr->pd_upper || (offset + oldsize) > phdr->
pd_special ||
1441 errmsg(
"corrupted line pointer: offset = %u, size = %u",
1442 offset, (
unsigned int) oldsize)));
1448 alignednewsize =
MAXALIGN(newsize);
1460 size_diff = oldsize - (int) alignednewsize;
1463 char *addr = (
char *) page + phdr->
pd_upper;
1467 memmove(addr + size_diff, addr, offset - phdr->
pd_upper);
1484 tupid->
lp_off = offset + size_diff;
1488 memcpy(
PageGetItem(page, tupid), newtup, newsize);
1511 static char *pageCopy = NULL;
1523 if (pageCopy == NULL)
1529 memcpy(pageCopy, page, BLCKSZ);
struct itemIdCompactData itemIdCompactData
Size PageGetFreeSpace(const PageData *page)
static void compactify_tuples(itemIdCompact itemidbase, int nitems, Page page, bool presorted)
bool ignore_checksum_failure
void PageRestoreTempPage(Page tempPage, Page oldPage)
Size PageGetFreeSpaceForMultipleTuples(const PageData *page, int ntups)
Size PageGetHeapFreeSpace(const PageData *page)
itemIdCompactData * itemIdCompact
Page PageGetTempPage(const PageData *page)
Page PageGetTempPageCopy(const PageData *page)
void PageIndexMultiDelete(Page page, OffsetNumber *itemnos, int nitems)
OffsetNumber PageAddItemExtended(Page page, Item item, Size size, OffsetNumber offsetNumber, int flags)
bool PageIndexTupleOverwrite(Page page, OffsetNumber offnum, Item newtup, Size newsize)
void PageSetChecksumInplace(Page page, BlockNumber blkno)
void PageIndexTupleDelete(Page page, OffsetNumber offnum)
char * PageSetChecksumCopy(Page page, BlockNumber blkno)
void PageRepairFragmentation(Page page)
Size PageGetExactFreeSpace(const PageData *page)
void PageTruncateLinePointerArray(Page page)
void PageInit(Page page, Size pageSize, Size specialSize)
bool PageIsVerified(PageData *page, BlockNumber blkno, int flags, bool *checksum_failure_p)
Page PageGetTempPageCopySpecial(const PageData *page)
void PageIndexTupleDeleteNoCompact(Page page, OffsetNumber offnum)
#define PD_VALID_FLAG_BITS
static bool PageIsEmpty(const PageData *page)
PageHeaderData * PageHeader
static void PageSetHasFreeLinePointers(Page page)
static uint16 PageGetSpecialSize(const PageData *page)
#define PageGetSpecialPointer(page)
static Size PageGetPageSize(const PageData *page)
static Item PageGetItem(const PageData *page, const ItemIdData *itemId)
static bool PageIsNew(const PageData *page)
#define SizeOfPageHeaderData
static ItemId PageGetItemId(Page page, OffsetNumber offsetNumber)
static bool PageHasFreeLinePointers(const PageData *page)
#define PG_PAGE_LAYOUT_VERSION
static void PageClearHasFreeLinePointers(Page page)
static void PageSetPageSizeAndVersion(Page page, Size size, uint8 version)
#define PIV_IGNORE_CHECKSUM_FAILURE
static OffsetNumber PageGetMaxOffsetNumber(const PageData *page)
#define unconstify(underlying_type, expr)
#define MemSet(start, val, len)
uint16 pg_checksum_page(char *page, BlockNumber blkno)
int errcode(int sqlerrcode)
int errmsg(const char *fmt,...)
#define ereport(elevel,...)
Assert(PointerIsAligned(start, uint64))
#define MaxHeapTuplesPerPage
if(TABLE==NULL||TABLE_index==NULL)
#define ItemIdGetLength(itemId)
#define ItemIdGetOffset(itemId)
struct ItemIdData ItemIdData
#define ItemIdSetNormal(itemId, off, len)
#define ItemIdIsUsed(itemId)
#define ItemIdSetUnused(itemId)
#define ItemIdHasStorage(itemId)
#define MaxIndexTuplesPerPage
void pfree(void *pointer)
void * MemoryContextAllocAligned(MemoryContext context, Size size, Size alignto, int flags)
MemoryContext TopMemoryContext
#define VALGRIND_CHECK_MEM_IS_DEFINED(addr, size)
static bool pg_memory_is_all_zeros(const void *ptr, size_t len)
#define InvalidOffsetNumber
#define OffsetNumberIsValid(offsetNumber)
#define OffsetNumberNext(offsetNumber)
#define FirstOffsetNumber
Datum lower(PG_FUNCTION_ARGS)
Datum upper(PG_FUNCTION_ARGS)
static bool checksum_failure
#define ERRCODE_DATA_CORRUPTED
bool DataChecksumsEnabled(void)