mirror of
				https://github.com/postgres/postgres.git
				synced 2025-10-31 00:03:57 -04:00 
			
		
		
		
	Avoid misbehavior when hash_table_bytes < bucket_size.
It's possible to reach this case when work_mem is very small and tupsize is (relatively) very large. In that case ExecChooseHashTableSize would get an assertion failure, or with asserts off it'd compute nbuckets = 0, which'd likely cause misbehavior later (I've not checked). To fix, clamp the number of buckets to be at least 1. This is due to faulty conversion of old my_log2() coding in 28d936031. Back-patch to v13, as that was. Zhang Mingli Discussion: https://postgr.es/m/beb64ca0-91e2-44ac-bf4a-7ea36275ec02@Spark
This commit is contained in:
		
							parent
							
								
									f558088285
								
							
						
					
					
						commit
						55d9cd46f6
					
				| @ -832,7 +832,10 @@ ExecChooseHashTableSize(double ntuples, int tupwidth, bool useskew, | ||||
| 		 * overhead for the hash code, pointer to the next tuple, etc. | ||||
| 		 */ | ||||
| 		bucket_size = (tupsize * NTUP_PER_BUCKET + sizeof(HashJoinTuple)); | ||||
| 		sbuckets = pg_nextpower2_size_t(hash_table_bytes / bucket_size); | ||||
| 		if (hash_table_bytes <= bucket_size) | ||||
| 			sbuckets = 1;		/* avoid pg_nextpower2_size_t(0) */ | ||||
| 		else | ||||
| 			sbuckets = pg_nextpower2_size_t(hash_table_bytes / bucket_size); | ||||
| 		sbuckets = Min(sbuckets, max_pointers); | ||||
| 		nbuckets = (int) sbuckets; | ||||
| 		nbuckets = pg_nextpower2_32(nbuckets); | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user