diff -ruN ../base/src/backend/utils/sort/tuplesort.c src/backend/utils/sort/tuplesort.c --- ../base/src/backend/utils/sort/tuplesort.c 2003-08-17 21:58:06.000000000 +0200 +++ src/backend/utils/sort/tuplesort.c 2003-09-05 10:04:22.000000000 +0200 @@ -2071,6 +2071,33 @@ (errcode(ERRCODE_UNIQUE_VIOLATION), errmsg("could not create unique index"), errdetail("Table contains duplicated values."))); + else + { + /* + * If key values are equal, we sort on ItemPointer. This might help + * for some bad qsort implementation having performance problems + * with many equal items. OTOH I wouldn't trust such a weak qsort + * to handle pre-sorted sequences very well ... + * + * Anyway, this code doesn't hurt much, and it helps produce indices + * with better index correlation which is a good thing per se. + */ + ItemPointer tid1 = &tuple1->t_tid; + ItemPointer tid2 = &tuple2->t_tid; + BlockNumber blk1 = ItemPointerGetBlockNumber(tid1); + BlockNumber blk2 = ItemPointerGetBlockNumber(tid2); + + if (blk1 != blk2) + return (blk1 < blk2) ? -1 : 1; + else + { + OffsetNumber pos1 = ItemPointerGetOffsetNumber(tid1); + OffsetNumber pos2 = ItemPointerGetOffsetNumber(tid2); + + if (pos1 != pos2) + return (pos1 < pos2) ? -1 : 1; + } + } return 0; }