Re: [ADMIN] Create index problem ( _bt_sort )

Поиск
Список
Период
Сортировка
От Tom Lane
Тема Re: [ADMIN] Create index problem ( _bt_sort )
Дата
Msg-id 13480.981674270@sss.pgh.pa.us
обсуждение исходный текст
Список pgsql-bugs
"Yasuo Ohgaki" <yasuo_ohgaki@hotmail.com> writes:
> raslog=# create index user2000 on log2000(username);
> FATAL 1:  btree: failed to add item to the page in _bt_sort (2)

Stephen van Egmnond was kind enough to submit a self-contained example,
from which it turns out that this bug is one that was found and fixed
about a month ago (sheesh, my memory is going).  Attached is a patch
that fixes it in 7.0.*.

            regards, tom lane


*** src/backend/access/nbtree/nbtsort.c.orig    Wed Apr 12 13:14:49 2000
--- src/backend/access/nbtree/nbtsort.c    Thu Jan  4 16:51:49 2001
***************
*** 28,34 ****
   * Portions Copyright (c) 1994, Regents of the University of California
   *
   * IDENTIFICATION
!  *      $Header: /home/projects/pgsql/cvsroot/pgsql/src/backend/access/nbtree/nbtsort.c,v 1.52 2000/04/12 17:14:49
momjianExp $ 
   *
   *-------------------------------------------------------------------------
   */
--- 28,34 ----
   * Portions Copyright (c) 1994, Regents of the University of California
   *
   * IDENTIFICATION
!  *      $Header: /home/projects/pgsql/cvsroot/pgsql/src/backend/access/nbtree/nbtsort.c,v 1.52.2.1 2001/01/04
21:51:49tgl Exp $ 
   *
   *-------------------------------------------------------------------------
   */
***************
*** 321,327 ****
               btisz,
               (PageGetPageSize(npage) - sizeof(PageHeaderData) - MAXALIGN(sizeof(BTPageOpaqueData))) /3 -
sizeof(ItemIdData));

!     if (pgspc < btisz)
      {
          Buffer        obuf = nbuf;
          Page        opage = npage;
--- 321,327 ----
               btisz,
               (PageGetPageSize(npage) - sizeof(PageHeaderData) - MAXALIGN(sizeof(BTPageOpaqueData))) /3 -
sizeof(ItemIdData));

!     while (pgspc < btisz)
      {
          Buffer        obuf = nbuf;
          Page        opage = npage;
***************
*** 436,441 ****
--- 436,448 ----
           * we aren't locking).
           */
          _bt_wrtbuf(index, obuf);
+
+         /*
+          * Recompute pgspc and loop back to check free space again.  If
+          * we were forced to split at a bad split point, we might need
+          * to split again.
+          */
+         pgspc = PageGetFreeSpace(npage);
      }

      /*

В списке pgsql-bugs по дате отправления:

Предыдущее
От: Tom Lane
Дата:
Сообщение: Re: Backend crash while indexing large strings
Следующее
От: pgsql-bugs@postgresql.org
Дата:
Сообщение: memory leak while using cursors