aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2000-01-08 21:24:49 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2000-01-08 21:24:49 +0000
commitb79e75d66f1b2169ad9552d430f699a4b5c95862 (patch)
tree9193eed29a06dd32804d9312e4da72bdc676033f
parent8da88a6f2b9c20f72abe3f232c32de7c257511f6 (diff)
downloadpostgresql-b79e75d66f1b2169ad9552d430f699a4b5c95862.tar.gz
postgresql-b79e75d66f1b2169ad9552d430f699a4b5c95862.zip
Need defense against oversize index entries in btree CREATE INDEX,
as well as when inserting entries into an existing index.
-rw-r--r--src/backend/access/nbtree/nbtsort.c19
1 files changed, 18 insertions, 1 deletions
diff --git a/src/backend/access/nbtree/nbtsort.c b/src/backend/access/nbtree/nbtsort.c
index 48386c113f0..fff65b7d79d 100644
--- a/src/backend/access/nbtree/nbtsort.c
+++ b/src/backend/access/nbtree/nbtsort.c
@@ -27,7 +27,7 @@
* Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtsort.c,v 1.47 1999/10/17 22:15:04 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtsort.c,v 1.48 2000/01/08 21:24:49 tgl Exp $
*
*-------------------------------------------------------------------------
*/
@@ -301,6 +301,23 @@ _bt_buildadd(Relation index, BTPageState *state, BTItem bti, int flags)
pgspc = PageGetFreeSpace(npage);
btisz = BTITEMSZ(bti);
btisz = MAXALIGN(btisz);
+
+ /*
+ * Check whether the item can fit on a btree page at all.
+ * (Eventually, we ought to try to apply TOAST methods if not.)
+ * We actually need to be able to fit three items on every page,
+ * so restrict any one item to 1/3 the per-page available space.
+ * Note that at this point, btisz doesn't include the ItemId.
+ *
+ * NOTE: similar code appears in _bt_insertonpg() to defend against
+ * oversize items being inserted into an already-existing index.
+ * But during creation of an index, we don't go through there.
+ */
+ if (btisz > (PageGetPageSize(npage)-sizeof(PageHeaderData)-MAXALIGN(sizeof(BTPageOpaqueData)))/3 - sizeof(ItemIdData))
+ elog(ERROR, "btree: index item size %d exceeds maximum %d",
+ btisz,
+ (PageGetPageSize(npage)-sizeof(PageHeaderData)-MAXALIGN(sizeof(BTPageOpaqueData)))/3 - sizeof(ItemIdData));
+
if (pgspc < btisz)
{
Buffer obuf = nbuf;