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++)
1405 const void *newtup,
Size newsize)
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)
bool PageIndexTupleOverwrite(Page page, OffsetNumber offnum, const void *newtup, Size newsize)
void PageSetChecksumInplace(Page page, BlockNumber blkno)
OffsetNumber PageAddItemExtended(Page page, const void *item, Size size, OffsetNumber offsetNumber, int flags)
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 void * 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)