@@ -236,21 +236,12 @@ typedef struct BTBuildState
236236/*
237237 * Status record for a btree page being built. We have one of these
238238 * for each active tree level.
239- *
240- * The reason we need to store a copy of the minimum key is that we'll
241- * need to propagate it to the parent node when this page is linked
242- * into its parent. However, if the page is not a leaf page, the first
243- * entry on the page doesn't need to contain a key, so we will not have
244- * stored the key itself on the page. (You might think we could skip
245- * copying the minimum key on leaf pages, but actually we must have a
246- * writable copy anyway because we'll poke the page's address into it
247- * before passing it up to the parent...)
248239 */
249240typedef struct BTPageState
250241{
251242Page btps_page ;/* workspace for page building */
252243BlockNumber btps_blkno ;/* block # to write this page at */
253- IndexTuple btps_minkey ;/*copy of minimum key (first item) on page */
244+ IndexTuple btps_lowkey ;/*page's strict lower bound pivot tuple */
254245OffsetNumber btps_lastoff ;/* last item offset loaded */
255246uint32 btps_level ;/* tree level (0 = leaf) */
256247Size btps_full ;/* "full" if less than this much free space */
@@ -717,7 +708,7 @@ _bt_pagestate(BTWriteState *wstate, uint32 level)
717708/* and assign it a page position */
718709state -> btps_blkno = wstate -> btws_pages_alloced ++ ;
719710
720- state -> btps_minkey = NULL ;
711+ state -> btps_lowkey = NULL ;
721712/* initialize lastoff so first item goes into P_FIRSTKEY */
722713state -> btps_lastoff = P_HIKEY ;
723714state -> btps_level = level ;
@@ -980,28 +971,27 @@ _bt_buildadd(BTWriteState *wstate, BTPageState *state, IndexTuple itup)
980971}
981972
982973/*
983- * Link the old page into its parent, using its minimum key. If we
984- * don't have a parent, we have to create one; this adds a new btree
985- * level.
974+ * Link the old page into its parent, using its low key. If we don't
975+ * have a parent, we have to create one; this adds a new btree level.
986976 */
987977if (state -> btps_next == NULL )
988978state -> btps_next = _bt_pagestate (wstate ,state -> btps_level + 1 );
989979
990- Assert ((BTreeTupleGetNAtts (state -> btps_minkey ,wstate -> index ) <=
980+ Assert ((BTreeTupleGetNAtts (state -> btps_lowkey ,wstate -> index ) <=
991981IndexRelationGetNumberOfKeyAttributes (wstate -> index )&&
992- BTreeTupleGetNAtts (state -> btps_minkey ,wstate -> index )> 0 )||
982+ BTreeTupleGetNAtts (state -> btps_lowkey ,wstate -> index )> 0 )||
993983P_LEFTMOST ((BTPageOpaque )PageGetSpecialPointer (opage )));
994- Assert (BTreeTupleGetNAtts (state -> btps_minkey ,wstate -> index )== 0 ||
984+ Assert (BTreeTupleGetNAtts (state -> btps_lowkey ,wstate -> index )== 0 ||
995985 !P_LEFTMOST ((BTPageOpaque )PageGetSpecialPointer (opage )));
996- BTreeInnerTupleSetDownLink (state -> btps_minkey ,oblkno );
997- _bt_buildadd (wstate ,state -> btps_next ,state -> btps_minkey );
998- pfree (state -> btps_minkey );
986+ BTreeInnerTupleSetDownLink (state -> btps_lowkey ,oblkno );
987+ _bt_buildadd (wstate ,state -> btps_next ,state -> btps_lowkey );
988+ pfree (state -> btps_lowkey );
999989
1000990/*
1001- * Save a copy of the high key from the old page. It is alsoused as
1002- *the minimum key for the new page.
991+ * Save a copy of the high key from the old page. It is alsothe low
992+ * key for the new page.
1003993 */
1004- state -> btps_minkey = CopyIndexTuple (oitup );
994+ state -> btps_lowkey = CopyIndexTuple (oitup );
1005995
1006996/*
1007997 * Set the sibling links for both pages.
@@ -1032,18 +1022,17 @@ _bt_buildadd(BTWriteState *wstate, BTPageState *state, IndexTuple itup)
10321022 * was created that became the current page. Either way, the current page
10331023 * definitely has space for new item.
10341024 *
1035- * If the new item is the first for its page, stash a copy for later. Note
1036- * this will only happen for the first item on a level; on later pages,
1037- * the first item for a page is copied from the prior page in the code
1038- * above. The minimum key for an entire level is nothing more than a
1039- * minus infinity (downlink only) pivot tuple placeholder.
1025+ * If the new item is the first for its page, it must also be the first
1026+ * item on its entire level. On later same-level pages, a low key for a
1027+ * page will be copied from the prior page in the code above. Generate a
1028+ * minus infinity low key here instead.
10401029 */
10411030if (last_off == P_HIKEY )
10421031{
1043- Assert (state -> btps_minkey == NULL );
1044- state -> btps_minkey = CopyIndexTuple ( itup );
1045- /* _bt_sortaddtup() will perform full truncation later */
1046- BTreeTupleSetNAtts (state -> btps_minkey ,0 );
1032+ Assert (state -> btps_lowkey == NULL );
1033+ state -> btps_lowkey = palloc0 ( sizeof ( IndexTupleData ) );
1034+ state -> btps_lowkey -> t_info = sizeof ( IndexTupleData );
1035+ BTreeTupleSetNAtts (state -> btps_lowkey ,0 );
10471036}
10481037
10491038/*
@@ -1083,7 +1072,7 @@ _bt_uppershutdown(BTWriteState *wstate, BTPageState *state)
10831072 * We have to link the last page on this level to somewhere.
10841073 *
10851074 * If we're at the top, it's the root, so attach it to the metapage.
1086- * Otherwise, add an entry for it to its parent using itsminimum key.
1075+ * Otherwise, add an entry for it to its parent using itslow key.
10871076 * This may cause the last page of the parent level to split, but
10881077 * that's not a problem -- we haven't gotten to it yet.
10891078 */
@@ -1095,16 +1084,16 @@ _bt_uppershutdown(BTWriteState *wstate, BTPageState *state)
10951084}
10961085else
10971086{
1098- Assert ((BTreeTupleGetNAtts (s -> btps_minkey ,wstate -> index ) <=
1087+ Assert ((BTreeTupleGetNAtts (s -> btps_lowkey ,wstate -> index ) <=
10991088IndexRelationGetNumberOfKeyAttributes (wstate -> index )&&
1100- BTreeTupleGetNAtts (s -> btps_minkey ,wstate -> index )> 0 )||
1089+ BTreeTupleGetNAtts (s -> btps_lowkey ,wstate -> index )> 0 )||
11011090P_LEFTMOST (opaque ));
1102- Assert (BTreeTupleGetNAtts (s -> btps_minkey ,wstate -> index )== 0 ||
1091+ Assert (BTreeTupleGetNAtts (s -> btps_lowkey ,wstate -> index )== 0 ||
11031092 !P_LEFTMOST (opaque ));
1104- BTreeInnerTupleSetDownLink (s -> btps_minkey ,blkno );
1105- _bt_buildadd (wstate ,s -> btps_next ,s -> btps_minkey );
1106- pfree (s -> btps_minkey );
1107- s -> btps_minkey = NULL ;
1093+ BTreeInnerTupleSetDownLink (s -> btps_lowkey ,blkno );
1094+ _bt_buildadd (wstate ,s -> btps_next ,s -> btps_lowkey );
1095+ pfree (s -> btps_lowkey );
1096+ s -> btps_lowkey = NULL ;
11081097}
11091098
11101099/*