aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorPeter Geoghegan <pg@bowt.ie>2020-03-10 14:15:41 -0700
committerPeter Geoghegan <pg@bowt.ie>2020-03-10 14:15:41 -0700
commitd1e241c22602a5369b54e29b7430553445f6a52b (patch)
tree5e071dc20aee38a28f18db15d1e734c098add02f /src
parentcacef172237fd3426b578f81b7414c0de56cbaaf (diff)
downloadpostgresql-d1e241c22602a5369b54e29b7430553445f6a52b.tar.gz
postgresql-d1e241c22602a5369b54e29b7430553445f6a52b.zip
nbtree: Demote minus infinity "can't happen" error.
Only a very basic logic bug in a _bt_insertonpg() caller could lead to a violation of this invariant. Besides, any newitemoff used for an internal page is sanitized using other "can't happen" errors in _bt_getstackbuf() or its callers, before _bt_insertonpg() even gets called. Also, move the error/assertion from the insert-without-split path of _bt_insertonpg() to the top of the same function. There is no reason why this invariant only applies to insertions that happen to not result in a page split; cover every insertion. The assertion naturally belongs next to the existing generic assertions that document relatively high-level invariants for the item being inserted.
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/nbtree/nbtinsert.c20
1 files changed, 8 insertions, 12 deletions
diff --git a/src/backend/access/nbtree/nbtinsert.c b/src/backend/access/nbtree/nbtinsert.c
index 03b7e45293a..fb814ef722b 100644
--- a/src/backend/access/nbtree/nbtinsert.c
+++ b/src/backend/access/nbtree/nbtinsert.c
@@ -1082,6 +1082,14 @@ _bt_insertonpg(Relation rel,
IndexRelationGetNumberOfKeyAttributes(rel));
Assert(!BTreeTupleIsPosting(itup));
+ /*
+ * Every internal page should have exactly one negative infinity item at
+ * all times. Only _bt_split() and _bt_newroot() should add items that
+ * become negative infinity items through truncation, since they're the
+ * only routines that allocate new internal pages.
+ */
+ Assert(P_ISLEAF(lpageop) || newitemoff > P_FIRSTDATAKEY(lpageop));
+
/* The caller should've finished any incomplete splits already. */
if (P_INCOMPLETE_SPLIT(lpageop))
elog(ERROR, "cannot insert to incompletely split page %u",
@@ -1212,18 +1220,6 @@ _bt_insertonpg(Relation rel,
}
}
- /*
- * Every internal page should have exactly one negative infinity item
- * at all times. Only _bt_split() and _bt_newroot() should add items
- * that become negative infinity items through truncation, since
- * they're the only routines that allocate new internal pages. Do not
- * allow a retail insertion of a new item at the negative infinity
- * offset.
- */
- if (!P_ISLEAF(lpageop) && newitemoff == P_FIRSTDATAKEY(lpageop))
- elog(ERROR, "cannot insert second negative infinity item in block %u of index \"%s\"",
- itup_blkno, RelationGetRelationName(rel));
-
/* Do the update. No ereport(ERROR) until changes are logged */
START_CRIT_SECTION();