On Thu, Jul 14, 2011 at 12:56 PM, Heikki Linnakangas < heikki.linnakan...@enterprisedb.com> wrote:
> First, notice that we're setting "ptr->parent = top". 'top' is the current > node we're processing, and ptr represents the node to the right of the > current node. The current node is *not* the parent of the node to the right. > I believe that line should be "ptr->parent = top->parent". > I think same. > Second, we're adding the entry for the right sibling to the end of the list > of nodes to visit. But when we process entries from the list, we exit > immediately when we see a leaf page. That means that the right sibling can > get queued up behind leaf pages, and thus never visited. I think possible solution is to save right sibling immediatly after current page . Thus, this code fragment should looks like this: > if (top->parent && XLByteLT(top->parent->lsn, > GistPageGetOpaque(page)->nsn) && > GistPageGetOpaque(page)->**rightlink != > InvalidBlockNumber /* sanity check */ ) > { > /* page splited while we thinking of... */ > ptr = (GISTInsertStack *) palloc0(sizeof(** > GISTInsertStack)); > ptr->blkno = GistPageGetOpaque(page)->**rightlink; > ptr->childoffnum = InvalidOffsetNumber; > ptr->parent = top->parent; > ptr->next = top->next; > top->next = ptr; > if (tail == top); > tail = ptr; } > ------ With best regards, Alexander Korotkov.