aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access/gist/gistscan.c
diff options
context:
space:
mode:
authorTeodor Sigaev <teodor@sigaev.ru>2005-08-30 07:57:48 +0000
committerTeodor Sigaev <teodor@sigaev.ru>2005-08-30 07:57:48 +0000
commit13ff51baf282ee4bd49036c82625a36007e0f233 (patch)
treea90d22e42dd7d84487ec4935cdc3dbe7c4ff6f50 /src/backend/access/gist/gistscan.c
parent846ed05de63712fed24fd51043bc308bcd3c2478 (diff)
downloadpostgresql-13ff51baf282ee4bd49036c82625a36007e0f233.tar.gz
postgresql-13ff51baf282ee4bd49036c82625a36007e0f233.zip
Fix missing rows in query
update a=.. where a... with GiST index on column 'a'
Diffstat (limited to 'src/backend/access/gist/gistscan.c')
-rw-r--r--src/backend/access/gist/gistscan.c34
1 files changed, 24 insertions, 10 deletions
diff --git a/src/backend/access/gist/gistscan.c b/src/backend/access/gist/gistscan.c
index 0746340df45..c39957c974a 100644
--- a/src/backend/access/gist/gistscan.c
+++ b/src/backend/access/gist/gistscan.c
@@ -8,7 +8,7 @@
* Portions Copyright (c) 1994, Regents of the University of California
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/access/gist/gistscan.c,v 1.56 2004/12/31 21:59:10 pgsql Exp $
+ * $PostgreSQL: pgsql/src/backend/access/gist/gistscan.c,v 1.56.4.1 2005/08/30 07:57:48 teodor Exp $
*
*-------------------------------------------------------------------------
*/
@@ -25,7 +25,7 @@ static void gistregscan(IndexScanDesc s);
static void gistdropscan(IndexScanDesc s);
static void gistadjone(IndexScanDesc s, int op, BlockNumber blkno,
OffsetNumber offnum);
-static void adjuststack(GISTSTACK *stk, BlockNumber blkno);
+static void adjuststack(GISTSTACK *stk, int op,BlockNumber blkno, OffsetNumber offnum);
static void adjustiptr(IndexScanDesc s, ItemPointer iptr,
int op, BlockNumber blkno, OffsetNumber offnum);
@@ -325,11 +325,8 @@ gistadjone(IndexScanDesc s,
so = (GISTScanOpaque) s->opaque;
- if (op == GISTOP_SPLIT)
- {
- adjuststack(so->s_stack, blkno);
- adjuststack(so->s_markstk, blkno);
- }
+ adjuststack(so->s_stack, op, blkno, offnum);
+ adjuststack(so->s_markstk, op, blkno, offnum);
}
/*
@@ -411,14 +408,31 @@ adjustiptr(IndexScanDesc s,
* access method update code for heaps; if we've modified the tuple we
* are looking at already in this transaction, we ignore the update
* request.
+ * If index tuple on our parent stack has been deleted, we need
+ * to make step back to avoid miss.
*/
static void
-adjuststack(GISTSTACK *stk, BlockNumber blkno)
+adjuststack(GISTSTACK *stk, int op, BlockNumber blkno, OffsetNumber offnum)
{
while (stk != NULL)
{
- if (stk->gs_blk == blkno)
- stk->gs_child = FirstOffsetNumber;
+ if (stk->gs_blk == blkno) {
+ switch (op) {
+ case GISTOP_DEL:
+ if ( stk->gs_child >= offnum ) {
+ if ( stk->gs_child > FirstOffsetNumber )
+ stk->gs_child = OffsetNumberPrev( stk->gs_child );
+ else
+ stk->gs_child = InvalidOffsetNumber;
+ }
+ break;
+ case GISTOP_SPLIT:
+ stk->gs_child = InvalidOffsetNumber;
+ break;
+ default:
+ elog(ERROR, "Bad operation in GiST scan adjust: %d", op);
+ }
+ }
stk = stk->gs_parent;
}