From: | Bruce Momjian <pgman(at)candle(dot)pha(dot)pa(dot)us> |
---|---|
To: | Dmitry Tkach <dmitry(at)openratings(dot)com> |
Cc: | PostgreSQL-development <pgsql-hackers(at)postgreSQL(dot)org> |
Subject: | Re: [SQL] A bug in gistPageAddItem()/gist_tuple_replacekey() ??? |
Date: | 2002-04-17 21:58:31 |
Message-ID: | 200204172158.g3HLwVZ07919@candle.pha.pa.us |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-general pgsql-hackers pgsql-sql |
[ Cc to hackers.]
I haven't see any comment on this. If no one replies, would you send
over a patch of fixes? Thanks.
---------------------------------------------------------------------------
Dmitry Tkach wrote:
> I was trying to write a gist index extension, and, after some debugging,
> it looks like I found a bug somewhere in the gist.c code ...
> I can't be quite sure, because I am not familiar with the postgres
> code... but, here is what I see happenning (this is 7.1, but I compared
> the sources to 7.2, and did not see this fixed - although, I did not
> inspect it too carefully)...
>
> First of all, gistPageAddItem () calls gistdentryinit() with a pointer
> to what's stored in the tuple, so, 'by-value' types do not work (because
> gistcentryinit () would be passed the value itself, when called from
> gistinsert(), and then, in gistPageAddItem (), it is passed a pointer,
> coming from gistdentryinit () - so, it just doesn't know really how to
> treat the argument)...
>
> Secondly, gist_tuple_replacekey() seems to have incorrect logic figuring
> out if there is enough space in the tuple (it checks for '<', instead of
> '<=') - this causes a new tuple to get always created (this one, seems
> to be fixed in 7.2)
>
> Thirdly, gist_tuple_replace_key () sends a pointer to entry.pred (which
> is already a pointer to the actual value) to index_formtuple (), that
> looks at the tuple, sees that the type is 'pass-by-value', and puts that
> pointer directly into the tuple, so that, the resulting tuple now
> contains a pointer to a pointer to the actual value...
>
> Now, if more then one split is required, this sequence is repeated again
> and again and again, so that, by the time the tuple gets actually
> written, it contains something like a pointer to a pointer to a pointer
> to a pointer to the actual data :-(
>
> Once again, I've seen some comments in the 7.2 branch about gists and
> pass-by-value types, but brief looking at the differences in the source
> did not make me conveinced that it was indeed fixed...
>
> Anyone knows otherwise?
>
> Thanks a lot!
>
> Dima
>
>
> ---------------------------(end of broadcast)---------------------------
> TIP 4: Don't 'kill -9' the postmaster
>
--
Bruce Momjian | http://candle.pha.pa.us
pgman(at)candle(dot)pha(dot)pa(dot)us | (610) 853-3000
+ If your life is a hard drive, | 830 Blythe Avenue
+ Christ can be your backup. | Drexel Hill, Pennsylvania 19026
From | Date | Subject | |
---|---|---|---|
Next Message | Ed Loehr | 2002-04-17 22:15:01 | Questions on 7.2.1 query plan choices |
Previous Message | Bruce Momjian | 2002-04-17 20:33:31 | Re: select users in a group? |
From | Date | Subject | |
---|---|---|---|
Next Message | mlw | 2002-04-17 22:01:09 | Re: Index Scans become Seq Scans after VACUUM ANALYSE |
Previous Message | Bruce Momjian | 2002-04-17 21:57:13 | Re: regexp character class locale awareness patch |
From | Date | Subject | |
---|---|---|---|
Next Message | Bruce Momjian | 2002-04-17 22:07:04 | Re: call the same pl/pgsql procedure twice in the same connection |
Previous Message | Stephan Szabo | 2002-04-17 16:27:29 | Re: My is degraded after two weeks |