diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2009-06-06 02:39:40 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2009-06-06 02:39:40 +0000 |
commit | 356eea24ce6f5e0875b85e938230cfd01ed75ae3 (patch) | |
tree | 36d3e14da16b0ef91998fda4587b750308251149 /src/backend/access/gin/gindatapage.c | |
parent | 1978d7f13fc2c46c74bf60ee84a5a8557391e53b (diff) | |
download | postgresql-356eea24ce6f5e0875b85e938230cfd01ed75ae3.tar.gz postgresql-356eea24ce6f5e0875b85e938230cfd01ed75ae3.zip |
Fix a serious bug introduced into GIN in 8.4: now that MergeItemPointers()
is supposed to remove duplicate heap TIDs, we have to be sure to reduce the
tuple size and posting-item count accordingly in addItemPointersToTuple().
Failing to do so resulted in the effective injection of garbage TIDs into the
index contents, ie, whatever happened to be in the memory palloc'd for the
new tuple. I'm not sure that this fully explains the index corruption
reported by Tatsuo Ishii, but the test case I'm using no longer fails.
Diffstat (limited to 'src/backend/access/gin/gindatapage.c')
-rw-r--r-- | src/backend/access/gin/gindatapage.c | 14 |
1 files changed, 10 insertions, 4 deletions
diff --git a/src/backend/access/gin/gindatapage.c b/src/backend/access/gin/gindatapage.c index a872d44880c..22199102ddc 100644 --- a/src/backend/access/gin/gindatapage.c +++ b/src/backend/access/gin/gindatapage.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/gin/gindatapage.c,v 1.14 2009/03/24 20:17:10 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/access/gin/gindatapage.c,v 1.15 2009/06/06 02:39:40 tgl Exp $ *------------------------------------------------------------------------- */ @@ -32,10 +32,14 @@ compareItemPointers(ItemPointer a, ItemPointer b) } /* - * Merge two ordered array of itempointer + * Merge two ordered arrays of itempointers, eliminating any duplicates. + * Returns the number of items in the result. + * Caller is responsible that there is enough space at *dst. */ -void -MergeItemPointers(ItemPointerData *dst, ItemPointerData *a, uint32 na, ItemPointerData *b, uint32 nb) +uint32 +MergeItemPointers(ItemPointerData *dst, + ItemPointerData *a, uint32 na, + ItemPointerData *b, uint32 nb) { ItemPointerData *dptr = dst; ItemPointerData *aptr = a, @@ -62,6 +66,8 @@ MergeItemPointers(ItemPointerData *dst, ItemPointerData *a, uint32 na, ItemPoint while (bptr - b < nb) *dptr++ = *bptr++; + + return dptr - dst; } /* |