diff --git a/src/backend/utils/adt/float.c b/src/backend/utils/adt/float.c index ac3fb2d149a79a7292a1587b62f278d89685fd80..9ef2e80da760204e3af535e5a5ddc6dd6190c2af 100644 --- a/src/backend/utils/adt/float.c +++ b/src/backend/utils/adt/float.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.90 2003/07/27 04:53:05 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.91 2003/07/30 19:48:38 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -109,6 +109,8 @@ int extra_float_digits = 0; /* Added to DBL_DIG or FLT_DIG */ static void CheckFloat4Val(double val); static void CheckFloat8Val(double val); +static int float4_cmp_internal(float4 a, float4 b); +static int float8_cmp_internal(float8 a, float8 b); /* @@ -413,7 +415,10 @@ float4larger(PG_FUNCTION_ARGS) float4 arg2 = PG_GETARG_FLOAT4(1); float4 result; - result = ((arg1 > arg2) ? arg1 : arg2); + if (float4_cmp_internal(arg1, arg2) > 0) + result = arg1; + else + result = arg2; PG_RETURN_FLOAT4(result); } @@ -424,7 +429,10 @@ float4smaller(PG_FUNCTION_ARGS) float4 arg2 = PG_GETARG_FLOAT4(1); float4 result; - result = ((arg1 < arg2) ? arg1 : arg2); + if (float4_cmp_internal(arg1, arg2) < 0) + result = arg1; + else + result = arg2; PG_RETURN_FLOAT4(result); } @@ -480,8 +488,10 @@ float8larger(PG_FUNCTION_ARGS) float8 arg2 = PG_GETARG_FLOAT8(1); float8 result; - result = ((arg1 > arg2) ? arg1 : arg2); - + if (float8_cmp_internal(arg1, arg2) > 0) + result = arg1; + else + result = arg2; PG_RETURN_FLOAT8(result); } @@ -492,8 +502,10 @@ float8smaller(PG_FUNCTION_ARGS) float8 arg2 = PG_GETARG_FLOAT8(1); float8 result; - result = ((arg1 < arg2) ? arg1 : arg2); - + if (float8_cmp_internal(arg1, arg2) < 0) + result = arg1; + else + result = arg2; PG_RETURN_FLOAT8(result); } diff --git a/src/backend/utils/adt/numeric.c b/src/backend/utils/adt/numeric.c index 476d3d5b5ce5f84bfdd5e31c87a2734380b91e4c..4f5029a26c1b32d406d92b7e6fbfc1a606700dcf 100644 --- a/src/backend/utils/adt/numeric.c +++ b/src/backend/utils/adt/numeric.c @@ -14,7 +14,7 @@ * Copyright (c) 1998-2003, PostgreSQL Global Development Group * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/utils/adt/numeric.c,v 1.63 2003/07/27 04:53:07 tgl Exp $ + * $Header: /cvsroot/pgsql/src/backend/utils/adt/numeric.c,v 1.64 2003/07/30 19:48:41 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -316,7 +316,7 @@ numeric_in(PG_FUNCTION_ARGS) /* * Check for NaN */ - if (strcmp(str, "NaN") == 0) + if (strcasecmp(str, "NaN") == 0) PG_RETURN_NUMERIC(make_result(&const_nan)); /* @@ -1239,34 +1239,15 @@ numeric_smaller(PG_FUNCTION_ARGS) { Numeric num1 = PG_GETARG_NUMERIC(0); Numeric num2 = PG_GETARG_NUMERIC(1); - NumericVar arg1; - NumericVar arg2; - Numeric res; - - /* - * Handle NaN - */ - if (NUMERIC_IS_NAN(num1) || NUMERIC_IS_NAN(num2)) - PG_RETURN_NUMERIC(make_result(&const_nan)); /* - * Unpack the values, and decide which is the smaller one + * Use cmp_numerics so that this will agree with the comparison + * operators, particularly as regards comparisons involving NaN. */ - init_var(&arg1); - init_var(&arg2); - - set_var_from_num(num1, &arg1); - set_var_from_num(num2, &arg2); - - if (cmp_var(&arg1, &arg2) <= 0) - res = make_result(&arg1); + if (cmp_numerics(num1, num2) < 0) + PG_RETURN_NUMERIC(num1); else - res = make_result(&arg2); - - free_var(&arg1); - free_var(&arg2); - - PG_RETURN_NUMERIC(res); + PG_RETURN_NUMERIC(num2); } @@ -1280,34 +1261,15 @@ numeric_larger(PG_FUNCTION_ARGS) { Numeric num1 = PG_GETARG_NUMERIC(0); Numeric num2 = PG_GETARG_NUMERIC(1); - NumericVar arg1; - NumericVar arg2; - Numeric res; - - /* - * Handle NaN - */ - if (NUMERIC_IS_NAN(num1) || NUMERIC_IS_NAN(num2)) - PG_RETURN_NUMERIC(make_result(&const_nan)); /* - * Unpack the values, and decide which is the larger one + * Use cmp_numerics so that this will agree with the comparison + * operators, particularly as regards comparisons involving NaN. */ - init_var(&arg1); - init_var(&arg2); - - set_var_from_num(num1, &arg1); - set_var_from_num(num2, &arg2); - - if (cmp_var(&arg1, &arg2) >= 0) - res = make_result(&arg1); + if (cmp_numerics(num1, num2) > 0) + PG_RETURN_NUMERIC(num1); else - res = make_result(&arg2); - - free_var(&arg1); - free_var(&arg2); - - PG_RETURN_NUMERIC(res); + PG_RETURN_NUMERIC(num2); }