diff --git a/src/backend/access/brin/brin.c b/src/backend/access/brin/brin.c index c740952..69bb0d4 100644 --- a/src/backend/access/brin/brin.c +++ b/src/backend/access/brin/brin.c @@ -944,7 +944,7 @@ terminate_brin_buildstate(BrinBuildState *state) page = BufferGetPage(state->bs_currentInsertBuf); RecordPageWithFreeSpace(state->bs_irel, BufferGetBlockNumber(state->bs_currentInsertBuf), - PageGetFreeSpace(page)); + PageGetFreeSpace(page), true); ReleaseBuffer(state->bs_currentInsertBuf); } diff --git a/src/backend/access/brin/brin_pageops.c b/src/backend/access/brin/brin_pageops.c index d0ca485..65564ab 100644 --- a/src/backend/access/brin/brin_pageops.c +++ b/src/backend/access/brin/brin_pageops.c @@ -310,7 +310,7 @@ brin_doupdate(Relation idxrel, BlockNumber pagesPerRange, if (extended) { Assert(BlockNumberIsValid(newblk)); - RecordPageWithFreeSpace(idxrel, newblk, freespace); + RecordPageWithFreeSpace(idxrel, newblk, freespace, true); FreeSpaceMapVacuum(idxrel); } @@ -635,7 +635,8 @@ brin_page_cleanup(Relation idxrel, Buffer buf) freespace = br_page_get_freespace(page); if (freespace > GetRecordedFreeSpace(idxrel, BufferGetBlockNumber(buf))) { - RecordPageWithFreeSpace(idxrel, BufferGetBlockNumber(buf), freespace); + RecordPageWithFreeSpace(idxrel, BufferGetBlockNumber(buf), freespace, + true); return true; } @@ -794,7 +795,7 @@ brin_getinsertbuffer(Relation irel, Buffer oldbuf, Size itemsz, */ if (*extended) RecordPageWithFreeSpace(irel, BufferGetBlockNumber(buf), - freespace); + freespace, true); /* * Lock the old buffer if not locked already. Note that in this @@ -874,7 +875,7 @@ brin_initialize_empty_new_buffer(Relation idxrel, Buffer buffer) * pages whose FSM records were forgotten in a crash. */ RecordPageWithFreeSpace(idxrel, BufferGetBlockNumber(buffer), - br_page_get_freespace(page)); + br_page_get_freespace(page), true); } diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 34ba385..e281ea9 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -3028,7 +3028,7 @@ heap_delete(Relation relation, ItemPointer tid, * the lock. */ if (PageIsAllVisible(page)) - visibilitymap_pin(relation, block, &vmbuffer); + visibilitymap_pin(relation, block, &vmbuffer, true); LockBuffer(buffer, BUFFER_LOCK_EXCLUSIVE); @@ -3041,7 +3041,7 @@ heap_delete(Relation relation, ItemPointer tid, if (vmbuffer == InvalidBuffer && PageIsAllVisible(page)) { LockBuffer(buffer, BUFFER_LOCK_UNLOCK); - visibilitymap_pin(relation, block, &vmbuffer); + visibilitymap_pin(relation, block, &vmbuffer, true); LockBuffer(buffer, BUFFER_LOCK_EXCLUSIVE); } @@ -3518,7 +3518,7 @@ heap_update(Relation relation, ItemPointer otid, HeapTuple newtup, * the lock. */ if (PageIsAllVisible(page)) - visibilitymap_pin(relation, block, &vmbuffer); + visibilitymap_pin(relation, block, &vmbuffer, true); LockBuffer(buffer, BUFFER_LOCK_EXCLUSIVE); @@ -3819,7 +3819,7 @@ l2: if (vmbuffer == InvalidBuffer && PageIsAllVisible(page)) { LockBuffer(buffer, BUFFER_LOCK_UNLOCK); - visibilitymap_pin(relation, block, &vmbuffer); + visibilitymap_pin(relation, block, &vmbuffer, true); LockBuffer(buffer, BUFFER_LOCK_EXCLUSIVE); goto l2; } @@ -7893,7 +7893,7 @@ heap_xlog_visible(XLogReaderState *record) LockBuffer(vmbuffer, BUFFER_LOCK_UNLOCK); reln = CreateFakeRelcacheEntry(rnode); - visibilitymap_pin(reln, blkno, &vmbuffer); + visibilitymap_pin(reln, blkno, &vmbuffer, true); /* * Don't set the bit if replay has already passed this point. @@ -8025,7 +8025,7 @@ heap_xlog_delete(XLogReaderState *record) Relation reln = CreateFakeRelcacheEntry(target_node); Buffer vmbuffer = InvalidBuffer; - visibilitymap_pin(reln, blkno, &vmbuffer); + visibilitymap_pin(reln, blkno, &vmbuffer, true); visibilitymap_clear(reln, blkno, vmbuffer); ReleaseBuffer(vmbuffer); FreeFakeRelcacheEntry(reln); @@ -8103,7 +8103,7 @@ heap_xlog_insert(XLogReaderState *record) Relation reln = CreateFakeRelcacheEntry(target_node); Buffer vmbuffer = InvalidBuffer; - visibilitymap_pin(reln, blkno, &vmbuffer); + visibilitymap_pin(reln, blkno, &vmbuffer, true); visibilitymap_clear(reln, blkno, vmbuffer); ReleaseBuffer(vmbuffer); FreeFakeRelcacheEntry(reln); @@ -8223,7 +8223,7 @@ heap_xlog_multi_insert(XLogReaderState *record) Relation reln = CreateFakeRelcacheEntry(rnode); Buffer vmbuffer = InvalidBuffer; - visibilitymap_pin(reln, blkno, &vmbuffer); + visibilitymap_pin(reln, blkno, &vmbuffer, true); visibilitymap_clear(reln, blkno, vmbuffer); ReleaseBuffer(vmbuffer); FreeFakeRelcacheEntry(reln); @@ -8378,7 +8378,7 @@ heap_xlog_update(XLogReaderState *record, bool hot_update) Relation reln = CreateFakeRelcacheEntry(rnode); Buffer vmbuffer = InvalidBuffer; - visibilitymap_pin(reln, oldblk, &vmbuffer); + visibilitymap_pin(reln, oldblk, &vmbuffer, true); visibilitymap_clear(reln, oldblk, vmbuffer); ReleaseBuffer(vmbuffer); FreeFakeRelcacheEntry(reln); @@ -8462,7 +8462,7 @@ heap_xlog_update(XLogReaderState *record, bool hot_update) Relation reln = CreateFakeRelcacheEntry(rnode); Buffer vmbuffer = InvalidBuffer; - visibilitymap_pin(reln, newblk, &vmbuffer); + visibilitymap_pin(reln, newblk, &vmbuffer, true); visibilitymap_clear(reln, newblk, vmbuffer); ReleaseBuffer(vmbuffer); FreeFakeRelcacheEntry(reln); diff --git a/src/backend/access/heap/hio.c b/src/backend/access/heap/hio.c index 8140418..ed86143 100644 --- a/src/backend/access/heap/hio.c +++ b/src/backend/access/heap/hio.c @@ -147,9 +147,9 @@ GetVisibilityMapPins(Relation relation, Buffer buffer1, Buffer buffer2, /* Get pins. */ if (need_to_pin_buffer1) - visibilitymap_pin(relation, block1, vmbuffer1); + visibilitymap_pin(relation, block1, vmbuffer1, true); if (need_to_pin_buffer2) - visibilitymap_pin(relation, block2, vmbuffer2); + visibilitymap_pin(relation, block2, vmbuffer2, true); /* Relock buffers. */ LockBuffer(buffer1, BUFFER_LOCK_EXCLUSIVE); @@ -328,7 +328,7 @@ RelationGetBufferForTuple(Relation relation, Size len, /* easy case */ buffer = ReadBufferBI(relation, targetBlock, bistate); if (PageIsAllVisible(BufferGetPage(buffer))) - visibilitymap_pin(relation, targetBlock, vmbuffer); + visibilitymap_pin(relation, targetBlock, vmbuffer, true); LockBuffer(buffer, BUFFER_LOCK_EXCLUSIVE); } else if (otherBlock == targetBlock) @@ -336,7 +336,7 @@ RelationGetBufferForTuple(Relation relation, Size len, /* also easy case */ buffer = otherBuffer; if (PageIsAllVisible(BufferGetPage(buffer))) - visibilitymap_pin(relation, targetBlock, vmbuffer); + visibilitymap_pin(relation, targetBlock, vmbuffer, true); LockBuffer(buffer, BUFFER_LOCK_EXCLUSIVE); } else if (otherBlock < targetBlock) @@ -344,7 +344,7 @@ RelationGetBufferForTuple(Relation relation, Size len, /* lock other buffer first */ buffer = ReadBuffer(relation, targetBlock); if (PageIsAllVisible(BufferGetPage(buffer))) - visibilitymap_pin(relation, targetBlock, vmbuffer); + visibilitymap_pin(relation, targetBlock, vmbuffer, true); LockBuffer(otherBuffer, BUFFER_LOCK_EXCLUSIVE); LockBuffer(buffer, BUFFER_LOCK_EXCLUSIVE); } @@ -353,7 +353,7 @@ RelationGetBufferForTuple(Relation relation, Size len, /* lock target buffer first */ buffer = ReadBuffer(relation, targetBlock); if (PageIsAllVisible(BufferGetPage(buffer))) - visibilitymap_pin(relation, targetBlock, vmbuffer); + visibilitymap_pin(relation, targetBlock, vmbuffer, true); LockBuffer(buffer, BUFFER_LOCK_EXCLUSIVE); LockBuffer(otherBuffer, BUFFER_LOCK_EXCLUSIVE); } diff --git a/src/backend/access/heap/visibilitymap.c b/src/backend/access/heap/visibilitymap.c index eaab4be..6c98fa0 100644 --- a/src/backend/access/heap/visibilitymap.c +++ b/src/backend/access/heap/visibilitymap.c @@ -208,7 +208,7 @@ visibilitymap_clear(Relation rel, BlockNumber heapBlk, Buffer buf) * If the page doesn't exist in the map file yet, it is extended. */ void -visibilitymap_pin(Relation rel, BlockNumber heapBlk, Buffer *buf) +visibilitymap_pin(Relation rel, BlockNumber heapBlk, Buffer *buf, bool extend) { BlockNumber mapBlock = HEAPBLK_TO_MAPBLOCK(heapBlk); @@ -220,7 +220,7 @@ visibilitymap_pin(Relation rel, BlockNumber heapBlk, Buffer *buf) ReleaseBuffer(*buf); } - *buf = vm_readbuf(rel, mapBlock, true); + *buf = vm_readbuf(rel, mapBlock, extend); } /* @@ -283,6 +283,10 @@ visibilitymap_set(Relation rel, BlockNumber heapBlk, Buffer heapBuf, if (BufferIsValid(heapBuf) && BufferGetBlockNumber(heapBuf) != heapBlk) elog(ERROR, "wrong heap buffer passed to visibilitymap_set"); + /* In case of invalid buffer just return */ + if(vmBuf == InvalidBuffer) + return; + /* Check that we have the right VM page pinned */ if (!BufferIsValid(vmBuf) || BufferGetBlockNumber(vmBuf) != mapBlock) elog(ERROR, "wrong VM buffer passed to visibilitymap_set"); diff --git a/src/backend/commands/vacuumlazy.c b/src/backend/commands/vacuumlazy.c index 52e19b3..5dbd619 100644 --- a/src/backend/commands/vacuumlazy.c +++ b/src/backend/commands/vacuumlazy.c @@ -134,7 +134,7 @@ static TransactionId FreezeLimit; static MultiXactId MultiXactCutoff; static BufferAccessStrategy vac_strategy; - +static bool Extend_VM_FSM = true; /* non-export function prototypes */ static void lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats, @@ -209,6 +209,8 @@ lazy_vacuum_rel(Relation onerel, int options, VacuumParams *params, else elevel = DEBUG2; + Extend_VM_FSM = (options & VACOPT_EMERGENCY) ? false : true; + pgstat_progress_start_command(PROGRESS_COMMAND_VACUUM, RelationGetRelid(onerel)); @@ -737,7 +739,7 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats, * cycle of index vacuuming. * */ - visibilitymap_pin(onerel, blkno, &vmbuffer); + visibilitymap_pin(onerel, blkno, &vmbuffer, Extend_VM_FSM); buf = ReadBufferExtended(onerel, MAIN_FORKNUM, blkno, RBM_NORMAL, vac_strategy); @@ -843,7 +845,7 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats, MarkBufferDirty(buf); UnlockReleaseBuffer(buf); - RecordPageWithFreeSpace(onerel, blkno, freespace); + RecordPageWithFreeSpace(onerel, blkno, freespace, Extend_VM_FSM); continue; } @@ -882,7 +884,7 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats, } UnlockReleaseBuffer(buf); - RecordPageWithFreeSpace(onerel, blkno, freespace); + RecordPageWithFreeSpace(onerel, blkno, freespace, Extend_VM_FSM); continue; } @@ -1223,7 +1225,7 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats, * taken if there are no indexes.) */ if (vacrelstats->num_dead_tuples == prev_dead_count) - RecordPageWithFreeSpace(onerel, blkno, freespace); + RecordPageWithFreeSpace(onerel, blkno, freespace, Extend_VM_FSM); } /* report that everything is scanned and vacuumed */ @@ -1382,7 +1384,7 @@ lazy_vacuum_heap(Relation onerel, LVRelStats *vacrelstats) freespace = PageGetHeapFreeSpace(page); UnlockReleaseBuffer(buf); - RecordPageWithFreeSpace(onerel, tblk, freespace); + RecordPageWithFreeSpace(onerel, tblk, freespace, Extend_VM_FSM); npages++; } @@ -1657,6 +1659,10 @@ should_attempt_truncation(LVRelStats *vacrelstats) { BlockNumber possibly_freeable; + /* In case of EMERGENCY option always attempt truncate */ + if(!Extend_VM_FSM) + return true; + possibly_freeable = vacrelstats->rel_pages - vacrelstats->nonempty_pages; if (possibly_freeable > 0 && (possibly_freeable >= REL_TRUNCATE_MINIMUM || diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y index b9aeb31..e01077e 100644 --- a/src/backend/parser/gram.y +++ b/src/backend/parser/gram.y @@ -406,7 +406,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); %type overlay_placing substr_from substr_for %type opt_instead -%type opt_unique opt_concurrently opt_verbose opt_full +%type opt_unique opt_concurrently opt_verbose opt_full opt_emergency %type opt_freeze opt_default opt_recheck %type opt_binary opt_oids copy_delimiter @@ -580,8 +580,8 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query); DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS DESC DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P DOUBLE_P DROP - EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT - EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN + EACH ELSE EMERGENCY ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT + EXCEPT EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXTENSION EXTERNAL EXTRACT FALSE_P FAMILY FETCH FILTER FIRST_P FLOAT_P FOLLOWING FOR @@ -9228,7 +9228,7 @@ cluster_index_specification: * *****************************************************************************/ -VacuumStmt: VACUUM opt_full opt_freeze opt_verbose +VacuumStmt: VACUUM opt_full opt_freeze opt_verbose opt_emergency { VacuumStmt *n = makeNode(VacuumStmt); n->options = VACOPT_VACUUM; @@ -9238,11 +9238,13 @@ VacuumStmt: VACUUM opt_full opt_freeze opt_verbose n->options |= VACOPT_FREEZE; if ($4) n->options |= VACOPT_VERBOSE; + if ($5) + n->options |= VACOPT_EMERGENCY; n->relation = NULL; n->va_cols = NIL; $$ = (Node *)n; } - | VACUUM opt_full opt_freeze opt_verbose qualified_name + | VACUUM opt_full opt_freeze opt_verbose opt_emergency qualified_name { VacuumStmt *n = makeNode(VacuumStmt); n->options = VACOPT_VACUUM; @@ -9252,13 +9254,15 @@ VacuumStmt: VACUUM opt_full opt_freeze opt_verbose n->options |= VACOPT_FREEZE; if ($4) n->options |= VACOPT_VERBOSE; - n->relation = $5; + if ($5) + n->options |= VACOPT_EMERGENCY; + n->relation = $6; n->va_cols = NIL; $$ = (Node *)n; } - | VACUUM opt_full opt_freeze opt_verbose AnalyzeStmt + | VACUUM opt_full opt_freeze opt_verbose opt_emergency AnalyzeStmt { - VacuumStmt *n = (VacuumStmt *) $5; + VacuumStmt *n = (VacuumStmt *) $6; n->options |= VACOPT_VACUUM; if ($2) n->options |= VACOPT_FULL; @@ -9266,6 +9270,8 @@ VacuumStmt: VACUUM opt_full opt_freeze opt_verbose n->options |= VACOPT_FREEZE; if ($4) n->options |= VACOPT_VERBOSE; + if ($5) + n->options |= VACOPT_EMERGENCY; $$ = (Node *)n; } | VACUUM '(' vacuum_option_list ')' @@ -9298,6 +9304,7 @@ vacuum_option_elem: | VERBOSE { $$ = VACOPT_VERBOSE; } | FREEZE { $$ = VACOPT_FREEZE; } | FULL { $$ = VACOPT_FULL; } + | EMERGENCY { $$ = VACOPT_EMERGENCY; } ; AnalyzeStmt: @@ -9341,6 +9348,11 @@ opt_freeze: FREEZE { $$ = TRUE; } | /*EMPTY*/ { $$ = FALSE; } ; +opt_emergency: + EMERGENCY { $$ = TRUE; } + | /*EMPTY*/ { $$ = FALSE; } + ; + opt_name_list: '(' name_list ')' { $$ = $2; } | /*EMPTY*/ { $$ = NIL; } @@ -13996,6 +14008,7 @@ type_func_name_keyword: | CONCURRENTLY | CROSS | CURRENT_SCHEMA + | EMERGENCY | FREEZE | FULL | ILIKE diff --git a/src/backend/storage/freespace/freespace.c b/src/backend/storage/freespace/freespace.c index 2631080..cd6af1e 100644 --- a/src/backend/storage/freespace/freespace.c +++ b/src/backend/storage/freespace/freespace.c @@ -106,7 +106,7 @@ static Size fsm_space_cat_to_avail(uint8 cat); /* workhorse functions for various operations */ static int fsm_set_and_search(Relation rel, FSMAddress addr, uint16 slot, - uint8 newValue, uint8 minValue); + uint8 newValue, uint8 minValue, bool extend); static BlockNumber fsm_search(Relation rel, uint8 min_cat); static uint8 fsm_vacuum_page(Relation rel, FSMAddress addr, bool *eof); @@ -156,7 +156,8 @@ RecordAndGetPageWithFreeSpace(Relation rel, BlockNumber oldPage, /* Get the location of the FSM byte representing the heap block */ addr = fsm_get_location(oldPage, &slot); - search_slot = fsm_set_and_search(rel, addr, slot, old_cat, search_cat); + search_slot = fsm_set_and_search(rel, addr, slot, old_cat, search_cat, + true); /* * If fsm_set_and_search found a suitable new block, return that. @@ -176,7 +177,8 @@ RecordAndGetPageWithFreeSpace(Relation rel, BlockNumber oldPage, * FreeSpaceMapVacuum call, which updates the upper level pages. */ void -RecordPageWithFreeSpace(Relation rel, BlockNumber heapBlk, Size spaceAvail) +RecordPageWithFreeSpace(Relation rel, BlockNumber heapBlk, Size spaceAvail, + bool extend) { int new_cat = fsm_space_avail_to_cat(spaceAvail); FSMAddress addr; @@ -185,7 +187,7 @@ RecordPageWithFreeSpace(Relation rel, BlockNumber heapBlk, Size spaceAvail) /* Get the location of the FSM byte representing the heap block */ addr = fsm_get_location(heapBlk, &slot); - fsm_set_and_search(rel, addr, slot, new_cat, 0); + fsm_set_and_search(rel, addr, slot, new_cat, 0, extend); } /* @@ -606,13 +608,16 @@ fsm_extend(Relation rel, BlockNumber fsm_nblocks) */ static int fsm_set_and_search(Relation rel, FSMAddress addr, uint16 slot, - uint8 newValue, uint8 minValue) + uint8 newValue, uint8 minValue, bool extend) { Buffer buf; Page page; int newslot = -1; - buf = fsm_readbuf(rel, addr, true); + buf = fsm_readbuf(rel, addr, extend); + if(buf == InvalidBuffer) + return -1; + LockBuffer(buf, BUFFER_LOCK_EXCLUSIVE); page = BufferGetPage(buf); @@ -702,7 +707,7 @@ fsm_search(Relation rel, uint8 min_cat) * rarely, and will be fixed by the next vacuum. */ parent = fsm_get_parent(addr, &parentslot); - fsm_set_and_search(rel, parent, parentslot, max_avail, 0); + fsm_set_and_search(rel, parent, parentslot, max_avail, 0, true); /* * If the upper pages are badly out of date, we might need to loop diff --git a/src/backend/storage/freespace/indexfsm.c b/src/backend/storage/freespace/indexfsm.c index e060a40..e25e0e1 100644 --- a/src/backend/storage/freespace/indexfsm.c +++ b/src/backend/storage/freespace/indexfsm.c @@ -51,7 +51,7 @@ GetFreeIndexPage(Relation rel) void RecordFreeIndexPage(Relation rel, BlockNumber freeBlock) { - RecordPageWithFreeSpace(rel, freeBlock, BLCKSZ - 1); + RecordPageWithFreeSpace(rel, freeBlock, BLCKSZ - 1, true); } @@ -61,7 +61,7 @@ RecordFreeIndexPage(Relation rel, BlockNumber freeBlock) void RecordUsedIndexPage(Relation rel, BlockNumber usedBlock) { - RecordPageWithFreeSpace(rel, usedBlock, 0); + RecordPageWithFreeSpace(rel, usedBlock, 0, true); } /* diff --git a/src/include/access/visibilitymap.h b/src/include/access/visibilitymap.h index b8dc54c..5cabc7c 100644 --- a/src/include/access/visibilitymap.h +++ b/src/include/access/visibilitymap.h @@ -36,7 +36,7 @@ extern void visibilitymap_clear(Relation rel, BlockNumber heapBlk, Buffer vmbuf); extern void visibilitymap_pin(Relation rel, BlockNumber heapBlk, - Buffer *vmbuf); + Buffer *vmbuf, bool extend); extern bool visibilitymap_pin_ok(BlockNumber heapBlk, Buffer vmbuf); extern void visibilitymap_set(Relation rel, BlockNumber heapBlk, Buffer heapBuf, XLogRecPtr recptr, Buffer vmBuf, TransactionId cutoff_xid, diff --git a/src/include/nodes/parsenodes.h b/src/include/nodes/parsenodes.h index 2fd0629..5f0e52f 100644 --- a/src/include/nodes/parsenodes.h +++ b/src/include/nodes/parsenodes.h @@ -2795,7 +2795,8 @@ typedef enum VacuumOption VACOPT_FREEZE = 1 << 3, /* FREEZE option */ VACOPT_FULL = 1 << 4, /* FULL (non-concurrent) vacuum */ VACOPT_NOWAIT = 1 << 5, /* don't wait to get lock (autovacuum only) */ - VACOPT_SKIPTOAST = 1 << 6 /* don't process the TOAST table, if any */ + VACOPT_SKIPTOAST = 1 << 6, /* don't process the TOAST table, if any */ + VACOPT_EMERGENCY = 1 << 7 /* EMERGENCY option */ } VacuumOption; typedef struct VacuumStmt diff --git a/src/include/parser/kwlist.h b/src/include/parser/kwlist.h index 6e1e820..0773028 100644 --- a/src/include/parser/kwlist.h +++ b/src/include/parser/kwlist.h @@ -137,6 +137,7 @@ PG_KEYWORD("double", DOUBLE_P, UNRESERVED_KEYWORD) PG_KEYWORD("drop", DROP, UNRESERVED_KEYWORD) PG_KEYWORD("each", EACH, UNRESERVED_KEYWORD) PG_KEYWORD("else", ELSE, RESERVED_KEYWORD) +PG_KEYWORD("emergency", EMERGENCY, TYPE_FUNC_NAME_KEYWORD) PG_KEYWORD("enable", ENABLE_P, UNRESERVED_KEYWORD) PG_KEYWORD("encoding", ENCODING, UNRESERVED_KEYWORD) PG_KEYWORD("encrypted", ENCRYPTED, UNRESERVED_KEYWORD) diff --git a/src/include/storage/freespace.h b/src/include/storage/freespace.h index 19dcb8d..54d11f7 100644 --- a/src/include/storage/freespace.h +++ b/src/include/storage/freespace.h @@ -26,7 +26,7 @@ extern BlockNumber RecordAndGetPageWithFreeSpace(Relation rel, Size oldSpaceAvail, Size spaceNeeded); extern void RecordPageWithFreeSpace(Relation rel, BlockNumber heapBlk, - Size spaceAvail); + Size spaceAvail, bool extend); extern void XLogRecordPageWithFreeSpace(RelFileNode rnode, BlockNumber heapBlk, Size spaceAvail);