1
0
mirror of https://github.com/postgres/postgres.git synced 2025-07-03 20:02:46 +03:00

Fix possible duplicate tuples while GiST scan. Now page is processed

at once and ItemPointers are collected in memory.

Remove tuple's killing by killtuple() if tuple was moved to another
page - it could produce unaceptable overhead.

Backpatch up to 8.1 because the bug was introduced by GiST's concurrency support.
This commit is contained in:
Teodor Sigaev
2008-08-23 10:37:24 +00:00
parent 42d313f546
commit 1dcf6fdf1b
3 changed files with 127 additions and 90 deletions

View File

@ -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.70 2008/06/19 00:46:03 alvherre Exp $
* $PostgreSQL: pgsql/src/backend/access/gist/gistscan.c,v 1.71 2008/08/23 10:37:24 teodor Exp $
*
*-------------------------------------------------------------------------
*/
@ -63,6 +63,7 @@ gistrescan(PG_FUNCTION_ARGS)
ReleaseBuffer(so->markbuf);
so->markbuf = InvalidBuffer;
}
}
else
{
@ -83,6 +84,7 @@ gistrescan(PG_FUNCTION_ARGS)
*/
ItemPointerSetInvalid(&so->curpos);
ItemPointerSetInvalid(&so->markpos);
so->nPageData = so->curPageData = 0;
/* Update scan key, if a new one is given */
if (key && scan->numberOfKeys > 0)
@ -150,6 +152,11 @@ gistmarkpos(PG_FUNCTION_ARGS)
so->markbuf = so->curbuf;
}
so->markNPageData = so->nPageData;
so->markCurPageData = so->curPageData;
if ( so->markNPageData > 0 )
memcpy( so->markPageData, so->pageData, sizeof(ItemResult) * so->markNPageData );
PG_RETURN_VOID();
}
@ -199,6 +206,11 @@ gistrestrpos(PG_FUNCTION_ARGS)
so->curbuf = so->markbuf;
}
so->nPageData = so->markNPageData;
so->curPageData = so->markNPageData;
if ( so->markNPageData > 0 )
memcpy( so->pageData, so->markPageData, sizeof(ItemResult) * so->markNPageData );
PG_RETURN_VOID();
}