* This also saves the binary search bounds in insertstate.  We use them
         * in the fastpath below, but also in the _bt_findinsertloc() call later.
         */
+       Assert(!insertstate->bounds_valid);
        offset = _bt_binsrch_insert(rel, insertstate);
 
        /*
                                         * check, then don't bother checking if the tuple is being
                                         * updated in another transaction. Just return the fact
                                         * that it is a potential conflict and leave the full
-                                        * check till later.
+                                        * check till later. Don't invalidate binary search
+                                        * bounds.
                                         */
                                        if (checkUnique == UNIQUE_CHECK_PARTIAL)
                                        {
                                                        _bt_relbuf(rel, nbuf);
                                                /* Tell _bt_doinsert to wait... */
                                                *speculativeToken = SnapshotDirty.speculativeToken;
+                                               /* Caller releases lock on buf immediately */
+                                               insertstate->bounds_valid = false;
                                                return xwait;
                                        }
 
                                                _bt_relbuf(rel, nbuf);
                                        _bt_relbuf(rel, insertstate->buf);
                                        insertstate->buf = InvalidBuffer;
+                                       insertstate->bounds_valid = false;
 
                                        {
                                                Datum           values[INDEX_MAX_KEYS];
                        }
                        maxoff = PageGetMaxOffsetNumber(page);
                        offset = P_FIRSTDATAKEY(opaque);
+                       /* Don't invalidate binary search bounds */
                }
        }