*** a/src/backend/access/gist/gistutil.c --- b/src/backend/access/gist/gistutil.c *************** *** 372,387 **** gistchoose(Relation r, Page p, IndexTuple it, /* it has compressed entry */ OffsetNumber maxoff; OffsetNumber i; OffsetNumber which; ! float sum_grow, ! which_grow[INDEX_MAX_KEYS]; GISTENTRY entry, identry[INDEX_MAX_KEYS]; bool isnull[INDEX_MAX_KEYS]; maxoff = PageGetMaxOffsetNumber(p); *which_grow = -1.0; which = InvalidOffsetNumber; - sum_grow = 1; gistDeCompressAtt(giststate, r, it, NULL, (OffsetNumber) 0, identry, isnull); --- 372,386 ---- OffsetNumber maxoff; OffsetNumber i; OffsetNumber which; ! float which_grow[INDEX_MAX_KEYS]; GISTENTRY entry, identry[INDEX_MAX_KEYS]; bool isnull[INDEX_MAX_KEYS]; + int same_count = 1; maxoff = PageGetMaxOffsetNumber(p); *which_grow = -1.0; which = InvalidOffsetNumber; gistDeCompressAtt(giststate, r, it, NULL, (OffsetNumber) 0, identry, isnull); *************** *** 389,400 **** gistchoose(Relation r, Page p, IndexTuple it, /* it has compressed entry */ Assert(maxoff >= FirstOffsetNumber); Assert(!GistPageIsLeaf(p)); ! for (i = FirstOffsetNumber; i <= maxoff && sum_grow; i = OffsetNumberNext(i)) { int j; IndexTuple itup = (IndexTuple) PageGetItem(p, PageGetItemId(p, i)); - sum_grow = 0; for (j = 0; j < r->rd_att->natts; j++) { Datum datum; --- 388,398 ---- Assert(maxoff >= FirstOffsetNumber); Assert(!GistPageIsLeaf(p)); ! for (i = FirstOffsetNumber; i <= maxoff; i = OffsetNumberNext(i)) { int j; IndexTuple itup = (IndexTuple) PageGetItem(p, PageGetItemId(p, i)); for (j = 0; j < r->rd_att->natts; j++) { Datum datum; *************** *** 411,425 **** gistchoose(Relation r, Page p, IndexTuple it, /* it has compressed entry */ { which = i; which_grow[j] = usize; ! if (j < r->rd_att->natts - 1 && i == FirstOffsetNumber) which_grow[j + 1] = -1; - sum_grow += which_grow[j]; } else if (which_grow[j] == usize) ! sum_grow += usize; else { - sum_grow = 1; break; } } --- 409,429 ---- { which = i; which_grow[j] = usize; ! same_count = 1; ! if (j < r->rd_att->natts - 1) which_grow[j + 1] = -1; } else if (which_grow[j] == usize) ! { ! if (j == r->rd_att->natts - 1) ! { ! same_count++; ! if ((rand() % same_count) == 0) ! which = i; ! } ! } else { break; } }