48 Assert(pageSize == BLCKSZ);
56 p->
pd_upper = pageSize - specialSize;
93 bool header_sane =
false;
127 pagebytes = (
size_t *) page;
141 errmsg(
"page verification failed, calculated checksum %u but expected %u",
195 bool needshuffle =
false;
206 errmsg(
"corrupted page pointers: lower = %u, upper = %u, special = %u",
220 if (offsetNumber < limit)
232 if (offsetNumber < limit)
251 offsetNumber < limit;
266 if (offsetNumber >= limit)
275 offsetNumber = limit;
280 if (offsetNumber > limit)
282 elog(
WARNING,
"specified item offset is too large");
289 elog(
WARNING,
"can't put more than MaxHeapTuplesPerPage items in a heap page");
299 if (offsetNumber == limit || needshuffle)
317 memmove(itemId + 1, itemId,
338 memcpy((
char *) page +
upper, item,
size);
379 memcpy(temp, page, pageSize);
418 memcpy((
char *) oldPage, (
char *) tempPage, pageSize);
478#ifdef USE_ASSERT_CHECKING
488 itemidptr = &itemidbase[
i];
512 itemidptr = &itemidbase[
i];
532 itemidptr = &itemidbase[
i];
537 memmove((
char *) page +
upper,
539 copy_tail - copy_head);
551 copy_head = itemidptr->
itemoff;
558 memmove((
char *) page +
upper,
560 copy_tail - copy_head);
565 char *scratchptr = scratch.
data;
585 itemidptr = &itemidbase[
i];
586 memcpy(scratchptr + itemidptr->
itemoff, page + itemidptr->
itemoff,
593 itemidptr = &itemidbase[0];
610 itemidptr = &itemidbase[
i];
636 itemidptr = &itemidbase[
i];
642 memcpy((
char *) page +
upper,
643 scratchptr + copy_head,
644 copy_tail - copy_head);
656 copy_head = itemidptr->
itemoff;
663 memcpy((
char *) page +
upper,
664 scratchptr + copy_head,
665 copy_tail - copy_head);
703 bool presorted =
true;
713 pd_lower > pd_upper ||
714 pd_upper > pd_special ||
715 pd_special > BLCKSZ ||
719 errmsg(
"corrupted page pointers: lower = %u, upper = %u, special = %u",
720 pd_lower, pd_upper, pd_special)));
726 itemidptr = itemidbase;
727 nunused = totallen = 0;
728 last_offset = pd_special;
739 if (last_offset > itemidptr->
itemoff)
740 last_offset = itemidptr->
itemoff;
745 itemidptr->
itemoff >= (
int) pd_special))
748 errmsg(
"corrupted line pointer: %u",
766 nstorage = itemidptr - itemidbase;
775 if (totallen > (
Size) (pd_special - pd_lower))
778 errmsg(
"corrupted item lengths: total %u, available space %u",
779 (
unsigned int) totallen, pd_special - pd_lower)));
784 if (finalusedlp != nline)
787 int nunusedend = nline - finalusedlp;
789 Assert(nunused >= nunusedend && nunusedend > 0);
792 nunused -= nunusedend;
827 bool countdone =
false,
872#ifdef CLOBBER_FREED_MEMORY
873 memset((
char *) page + phdr->
pd_lower, 0x7F,
934 if (space < (
int) (ntups *
sizeof(
ItemIdData)))
1062 errmsg(
"corrupted page pointers: lower = %u, upper = %u, special = %u",
1066 if ((
int) offnum <= 0 || (
int) offnum > nline)
1067 elog(
ERROR,
"invalid index offnum: %u", offnum);
1070 offidx = offnum - 1;
1077 if (offset < phdr->pd_upper || (offset +
size) > phdr->
pd_special ||
1081 errmsg(
"corrupted line pointer: offset = %u, size = %u",
1082 offset, (
unsigned int)
size)));
1094 ((
char *) &phdr->
pd_linp[offidx + 1] - (
char *) phdr);
1097 memmove((
char *) &(phdr->
pd_linp[offidx]),
1098 (
char *) &(phdr->
pd_linp[offidx + 1]),
1109 addr = (
char *) page + phdr->
pd_upper;
1129 for (
i = 1;
i <= nline;
i++)
1168 bool presorted =
true;
1191 pd_lower > pd_upper ||
1192 pd_upper > pd_special ||
1193 pd_special > BLCKSZ ||
1194 pd_special !=
MAXALIGN(pd_special))
1197 errmsg(
"corrupted page pointers: lower = %u, upper = %u, special = %u",
1198 pd_lower, pd_upper, pd_special)));
1206 itemidptr = itemidbase;
1210 last_offset = pd_special;
1217 if (offset < pd_upper ||
1218 (offset +
size) > pd_special ||
1222 errmsg(
"corrupted line pointer: offset = %u, size = %u",
1223 offset, (
unsigned int)
size)));
1225 if (nextitm <
nitems && offnum == itemnos[nextitm])
1235 if (last_offset > itemidptr->
itemoff)
1236 last_offset = itemidptr->
itemoff;
1242 newitemids[nused] = *lp;
1250 elog(
ERROR,
"incorrect index offsets supplied");
1252 if (totallen > (
Size) (pd_special - pd_lower))
1255 errmsg(
"corrupted item lengths: total %u, available space %u",
1256 (
unsigned int) totallen, pd_special - pd_lower)));
1303 errmsg(
"corrupted page pointers: lower = %u, upper = %u, special = %u",
1307 if ((
int) offnum <= 0 || (
int) offnum > nline)
1308 elog(
ERROR,
"invalid index offnum: %u", offnum);
1315 if (offset < phdr->pd_upper || (offset +
size) > phdr->
pd_special ||
1319 errmsg(
"corrupted line pointer: offset = %u, size = %u",
1320 offset, (
unsigned int)
size)));
1330 if ((
int) offnum < nline)
1346 addr = (
char *) page + phdr->
pd_upper;
1364 for (
i = 1;
i <= nline;
i++)
1401 Size alignednewsize;
1415 errmsg(
"corrupted page pointers: lower = %u, upper = %u, special = %u",
1419 if ((
int) offnum <= 0 || (
int) offnum > itemcount)
1420 elog(
ERROR,
"invalid index offnum: %u", offnum);
1427 if (offset < phdr->pd_upper || (offset + oldsize) > phdr->
pd_special ||
1431 errmsg(
"corrupted line pointer: offset = %u, size = %u",
1432 offset, (
unsigned int) oldsize)));
1438 alignednewsize =
MAXALIGN(newsize);
1450 size_diff = oldsize - (int) alignednewsize;
1453 char *addr = (
char *) page + phdr->
pd_upper;
1457 memmove(addr + size_diff, addr, offset - phdr->
pd_upper);
1474 tupid->
lp_off = offset + size_diff;
1478 memcpy(
PageGetItem(page, tupid), newtup, newsize);
1501 static char *pageCopy = NULL;
1505 return (
char *) page;
1513 if (pageCopy == NULL)
1519 memcpy(pageCopy, (
char *) 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)
bool PageIsVerifiedExtended(const PageData *page, BlockNumber blkno, int flags)
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)
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)
static OffsetNumber PageGetMaxOffsetNumber(const PageData *page)
#define unconstify(underlying_type, expr)
#define Assert(condition)
#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,...)
#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
void pgstat_report_checksum_failure(void)
static pg_noinline void Size size
bool DataChecksumsEnabled(void)