@@ -86,6 +86,7 @@ brin_doupdate(Relation idxrel, BlockNumber pagesPerRange,
8686{
8787LockBuffer (oldbuf ,BUFFER_LOCK_EXCLUSIVE );
8888newbuf = InvalidBuffer ;
89+ extended = false;
8990}
9091oldpage = BufferGetPage (oldbuf );
9192oldlp = PageGetItemId (oldpage ,oldoff );
@@ -335,9 +336,8 @@ brin_doinsert(Relation idxrel, BlockNumber pagesPerRange,
335336brinRevmapExtend (revmap ,heapBlk );
336337
337338/*
338- * Obtain a locked buffer to insert the new tuple. Note
339- * brin_getinsertbuffer ensures there's enough space in the returned
340- * buffer.
339+ * Acquire lock on buffer supplied by caller, if any. If it doesn't have
340+ * enough space, unpin it to obtain a new one below.
341341 */
342342if (BufferIsValid (* buffer ))
343343{
@@ -354,19 +354,26 @@ brin_doinsert(Relation idxrel, BlockNumber pagesPerRange,
354354}
355355}
356356
357+ /*
358+ * If we still don't have a usable buffer, have brin_getinsertbuffer
359+ * obtain one for us.
360+ */
357361if (!BufferIsValid (* buffer ))
358362{
359363* buffer = brin_getinsertbuffer (idxrel ,InvalidBuffer ,itemsz ,& extended );
360364Assert (BufferIsValid (* buffer ));
361365Assert (extended || br_page_get_freespace (BufferGetPage (* buffer )) >=itemsz );
362366}
367+ else
368+ extended = false;
363369
364370/* Now obtain lock on revmap buffer */
365371revmapbuf = brinLockRevmapPageForUpdate (revmap ,heapBlk );
366372
367373page = BufferGetPage (* buffer );
368374blk = BufferGetBlockNumber (* buffer );
369375
376+ /* Execute the actual insertion */
370377START_CRIT_SECTION ();
371378if (extended )
372379brin_page_init (BufferGetPage (* buffer ),BRIN_PAGETYPE_REGULAR );