diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/backend/access/gist/gistutil.c | 14 | 
1 files changed, 11 insertions, 3 deletions
| diff --git a/src/backend/access/gist/gistutil.c b/src/backend/access/gist/gistutil.c index a23047642fd..48c44157be0 100644 --- a/src/backend/access/gist/gistutil.c +++ b/src/backend/access/gist/gistutil.c @@ -13,6 +13,8 @@   */  #include "postgres.h" +#include <math.h> +  #include "access/gist_private.h"  #include "access/reloptions.h"  #include "storage/freespace.h" @@ -532,16 +534,22 @@ gistpenalty(GISTSTATE *giststate, int attno,  {  	float		penalty = 0.0; -	if (giststate->penaltyFn[attno].fn_strict == FALSE || (isNullOrig == FALSE && isNullAdd == FALSE)) +	if (giststate->penaltyFn[attno].fn_strict == FALSE || +		(isNullOrig == FALSE && isNullAdd == FALSE)) +	{  		FunctionCall3(&giststate->penaltyFn[attno],  					  PointerGetDatum(orig),  					  PointerGetDatum(add),  					  PointerGetDatum(&penalty)); +		/* disallow negative or NaN penalty */ +		if (isnan(penalty) || penalty < 0.0) +			penalty = 0.0; +	}  	else if (isNullOrig && isNullAdd)  		penalty = 0.0;  	else -		penalty = 1e10;			/* try to prevent to mix null and non-null -								 * value */ +		penalty = 1e10;			/* try to prevent mixing null and non-null +								 * values */  	return penalty;  } | 
