@@ -86,6 +86,7 @@ brin_doupdate(Relation idxrel, BlockNumber pagesPerRange,
8686 {
8787 LockBuffer (oldbuf , BUFFER_LOCK_EXCLUSIVE );
8888 newbuf = InvalidBuffer ;
89+ extended = false;
8990 }
9091 oldpage = BufferGetPage (oldbuf );
9192 oldlp = PageGetItemId (oldpage , oldoff );
@@ -335,9 +336,8 @@ brin_doinsert(Relation idxrel, BlockNumber pagesPerRange,
335336 brinRevmapExtend (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 */
342342 if (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+ */
357361 if (!BufferIsValid (* buffer ))
358362 {
359363 * buffer = brin_getinsertbuffer (idxrel , InvalidBuffer , itemsz , & extended );
360364 Assert (BufferIsValid (* buffer ));
361365 Assert (extended || br_page_get_freespace (BufferGetPage (* buffer )) >= itemsz );
362366 }
367+ else
368+ extended = false;
363369
364370 /* Now obtain lock on revmap buffer */
365371 revmapbuf = brinLockRevmapPageForUpdate (revmap , heapBlk );
366372
367373 page = BufferGetPage (* buffer );
368374 blk = BufferGetBlockNumber (* buffer );
369375
376+ /* Execute the actual insertion */
370377 START_CRIT_SECTION ();
371378 if (extended )
372379 brin_page_init (BufferGetPage (* buffer ), BRIN_PAGETYPE_REGULAR );
0 commit comments