*** pgstattuple.c.orig	2013-10-11 17:46:00.592666316 +1300
--- pgstattuple.c	2013-10-11 17:46:08.616450284 +1300
***************
*** 100,105 ****
--- 100,123 ----
  				   uint64 *tuple_count, uint64 *tuple_len,
  				   uint64 *dead_tuple_count, uint64 *dead_tuple_len,
  				   uint64 *free_space);
+ static int	compare_blocknumbers(const void *a, const void *b);
+ 
+ /*
+  * compare for qsort
+  */
+ static int
+ compare_blocknumbers(const void *a, const void *b)
+ {
+ 	BlockNumber ba = *(const BlockNumber *)a;
+ 	BlockNumber bb = *(const BlockNumber *)b;
+ 
+ 	if (ba > bb)
+ 		return -1;
+     if (ba < bb)
+ 		return 1;
+     return 0;
+ }
+ 
  
  /*
   * build_pgstattuple_type -- build a pgstattuple_type tuple
***************
*** 686,692 ****
  pgstat_heap_sample(Relation rel, FunctionCallInfo fcinfo)
  {
  	BlockNumber nblocks;
! 	BlockNumber block;
  	pgstattuple_type stat = {0};
  	pgstattuple_block_stats block_stats[SAMPLE_SIZE];
  	int i;
--- 704,710 ----
  pgstat_heap_sample(Relation rel, FunctionCallInfo fcinfo)
  {
  	BlockNumber nblocks;
! 	BlockNumber sample_block[SAMPLE_SIZE];
  	pgstattuple_type stat = {0};
  	pgstattuple_block_stats block_stats[SAMPLE_SIZE];
  	int i;
***************
*** 695,700 ****
--- 713,725 ----
  
  	for (i=0 ; i<SAMPLE_SIZE ; i++)
  	{
+ 		sample_block[i] = (double)random() / RAND_MAX * nblocks;
+ 	}
+ 
+ 	qsort(sample_block, SAMPLE_SIZE, sizeof(BlockNumber), compare_blocknumbers);
+ 
+ 	for (i=0 ; i<SAMPLE_SIZE ; i++)
+ 	{
  		Buffer		buffer;
  		Page		page;
  		OffsetNumber pageoff;
***************
*** 702,713 ****
  		/*
  		 * sample random blocks
  		 */
- 		block = (double)random() / RAND_MAX * nblocks;
- 
  		CHECK_FOR_INTERRUPTS();
  
  		/* Read and lock buffer */
! 		buffer = ReadBuffer(rel, block);
  		LockBuffer(buffer, BUFFER_LOCK_SHARE);
  		page = BufferGetPage(buffer);
  
--- 727,736 ----
  		/*
  		 * sample random blocks
  		 */
  		CHECK_FOR_INTERRUPTS();
  
  		/* Read and lock buffer */
! 		buffer = ReadBuffer(rel, sample_block[i]);
  		LockBuffer(buffer, BUFFER_LOCK_SHARE);
  		page = BufferGetPage(buffer);
  
