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.

Reply via email to