mirror of
				https://github.com/postgres/postgres.git
				synced 2025-11-03 09:13:20 +03:00 
			
		
		
		
	Fix numeric_power() when the exponent is INT_MIN.
In power_var_int(), the computation of the number of significant
digits to use in the computation used log(Abs(exp)), which isn't safe
because Abs(exp) returns INT_MIN when exp is INT_MIN. Use fabs()
instead of Abs(), so that the exponent is cast to a double before the
absolute value is taken.
Back-patch to 9.6, where this was introduced (by 7d9a4737c2).
Discussion: https://postgr.es/m/CAEZATCVd6pMkz=BrZEgBKyqqJrt2xghr=fNc8+Z=5xC6cgWrWA@mail.gmail.com
			
			
This commit is contained in:
		@@ -8265,7 +8265,7 @@ power_var_int(NumericVar *base, int exp, NumericVar *result, int rscale)
 | 
			
		||||
	 * to around log10(abs(exp)) digits, so work with this many extra digits
 | 
			
		||||
	 * of precision (plus a few more for good measure).
 | 
			
		||||
	 */
 | 
			
		||||
	sig_digits += (int) log(Abs(exp)) + 8;
 | 
			
		||||
	sig_digits += (int) log(fabs(exp)) + 8;
 | 
			
		||||
 | 
			
		||||
	/*
 | 
			
		||||
	 * Now we can proceed with the multiplications.
 | 
			
		||||
 
 | 
			
		||||
@@ -1506,6 +1506,12 @@ select 0.12 ^ (-20);
 | 
			
		||||
 2608405330458882702.5529619561355838
 | 
			
		||||
(1 row)
 | 
			
		||||
 | 
			
		||||
select 1.000000000123 ^ (-2147483648);
 | 
			
		||||
      ?column?      
 | 
			
		||||
--------------------
 | 
			
		||||
 0.7678656556403084
 | 
			
		||||
(1 row)
 | 
			
		||||
 | 
			
		||||
-- cases that used to error out
 | 
			
		||||
select 0.12 ^ (-25);
 | 
			
		||||
                 ?column?                  
 | 
			
		||||
 
 | 
			
		||||
@@ -873,6 +873,7 @@ select 3.789 ^ 21;
 | 
			
		||||
select 3.789 ^ 35;
 | 
			
		||||
select 1.2 ^ 345;
 | 
			
		||||
select 0.12 ^ (-20);
 | 
			
		||||
select 1.000000000123 ^ (-2147483648);
 | 
			
		||||
 | 
			
		||||
-- cases that used to error out
 | 
			
		||||
select 0.12 ^ (-25);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user