Re: Small patch for GiST: move childoffnum to child

From: Heikki Linnakangas <heikki(dot)linnakangas(at)enterprisedb(dot)com>
To: pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>
Cc: Alexander Korotkov <aekorotkov(at)gmail(dot)com>, Jeff Janes <jeff(dot)janes(at)gmail(dot)com>
Subject: Re: Small patch for GiST: move childoffnum to child
Date: 2011-07-14 08:56:58
Message-ID: 4E1EAF5A.1010108@enterprisedb.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

I think there's two bugs in the existing gistFindPath code:

> 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;
> ptr->next = NULL;
> tail->next = ptr;
> tail = ptr;
> }

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".

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.

--
Heikki Linnakangas
EnterpriseDB http://www.enterprisedb.com

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Fujii Masao 2011-07-14 08:57:34 Re: Reduced power consumption in WAL Writer process
Previous Message Heikki Linnakangas 2011-07-14 08:42:01 Re: WIP: Fast GiST index build