diff --git a/src/backend/utils/adt/float.c b/src/backend/utils/adt/float.c index f74367d64c4a86cd8cd982742493531811c8e1b1..6ad06788fc4da12533dae6daeed65b81ea547fe5 100644 --- a/src/backend/utils/adt/float.c +++ b/src/backend/utils/adt/float.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/adt/float.c,v 1.159 2009/01/01 17:23:49 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/utils/adt/float.c,v 1.160 2009/02/18 19:23:26 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -576,9 +576,7 @@ float4um(PG_FUNCTION_ARGS) float4 arg1 = PG_GETARG_FLOAT4(0); float4 result; - result = ((arg1 != 0) ? -(arg1) : arg1); - - CHECKFLOATVAL(result, isinf(arg1), true); + result = -arg1; PG_RETURN_FLOAT4(result); } @@ -645,9 +643,7 @@ float8um(PG_FUNCTION_ARGS) float8 arg1 = PG_GETARG_FLOAT8(0); float8 result; - result = ((arg1 != 0) ? -(arg1) : arg1); - - CHECKFLOATVAL(result, isinf(arg1), true); + result = -arg1; PG_RETURN_FLOAT8(result); } @@ -703,16 +699,16 @@ float8smaller(PG_FUNCTION_ARGS) Datum float4pl(PG_FUNCTION_ARGS) { - float8 arg1 = PG_GETARG_FLOAT4(0); - float8 arg2 = PG_GETARG_FLOAT4(1); + float4 arg1 = PG_GETARG_FLOAT4(0); + float4 arg2 = PG_GETARG_FLOAT4(1); float4 result; result = arg1 + arg2; /* * There isn't any way to check for underflow of addition/subtraction - * because numbers near the underflow value have been already been to the - * point where we can't detect the that the two values were originally + * because numbers near the underflow value have already been rounded to + * the point where we can't detect that the two values were originally * different, e.g. on x86, '1e-45'::float4 == '2e-45'::float4 == * 1.4013e-45. */ @@ -757,7 +753,6 @@ float4div(PG_FUNCTION_ARGS) (errcode(ERRCODE_DIVISION_BY_ZERO), errmsg("division by zero"))); - /* Do division in float8, then check for overflow */ result = arg1 / arg2; CHECKFLOATVAL(result, isinf(arg1) || isinf(arg2), arg1 == 0); @@ -2693,7 +2688,7 @@ width_bucket_float8(PG_FUNCTION_ARGS) errmsg("operand, lower bound and upper bound cannot be NaN"))); /* Note that we allow "operand" to be infinite */ - if (is_infinite(bound1) || is_infinite(bound2)) + if (isinf(bound1) || isinf(bound2)) ereport(ERROR, (errcode(ERRCODE_INVALID_ARGUMENT_FOR_WIDTH_BUCKET_FUNCTION), errmsg("lower and upper bounds must be finite"))); diff --git a/src/test/regress/expected/numerology.out b/src/test/regress/expected/numerology.out index d404d9db68121049455a14ab3a97abfbed467187..0a2e66e91992b6015c11cf488954cd4abcfd5f53 100644 --- a/src/test/regress/expected/numerology.out +++ b/src/test/regress/expected/numerology.out @@ -92,7 +92,7 @@ SELECT f1 AS two, max(f3) AS max_float, min(f3) as min_float ORDER BY two, max_float, min_float; two | max_float | min_float -----+----------------------+----------------------- - 1 | 1.2345678901234e+200 | 0 + 1 | 1.2345678901234e+200 | -0 2 | 0 | -1.2345678901234e+200 (2 rows) @@ -104,7 +104,7 @@ SELECT f1 AS two, max(f3) AS max_float, min(f3) AS min_float ORDER BY two, max_float, min_float; two | max_float | min_float -----+----------------------+----------------------- - 1 | 1.2345678901234e+200 | 0 + 1 | 1.2345678901234e+200 | -0 2 | 0 | -1.2345678901234e+200 (2 rows) diff --git a/src/test/regress/expected/numerology_1.out b/src/test/regress/expected/numerology_1.out new file mode 100644 index 0000000000000000000000000000000000000000..d404d9db68121049455a14ab3a97abfbed467187 --- /dev/null +++ b/src/test/regress/expected/numerology_1.out @@ -0,0 +1,136 @@ +-- +-- NUMEROLOGY +-- Test various combinations of numeric types and functions. +-- +-- +-- Test implicit type conversions +-- This fails for Postgres v6.1 (and earlier?) +-- so let's try explicit conversions for now - tgl 97/05/07 +-- +CREATE TABLE TEMP_FLOAT (f1 FLOAT8); +INSERT INTO TEMP_FLOAT (f1) + SELECT float8(f1) FROM INT4_TBL; +INSERT INTO TEMP_FLOAT (f1) + SELECT float8(f1) FROM INT2_TBL; +SELECT '' AS ten, f1 FROM TEMP_FLOAT + ORDER BY f1; + ten | f1 +-----+------------- + | -2147483647 + | -123456 + | -32767 + | -1234 + | 0 + | 0 + | 1234 + | 32767 + | 123456 + | 2147483647 +(10 rows) + +-- int4 +CREATE TABLE TEMP_INT4 (f1 INT4); +INSERT INTO TEMP_INT4 (f1) + SELECT int4(f1) FROM FLOAT8_TBL + WHERE (f1 > -2147483647) AND (f1 < 2147483647); +INSERT INTO TEMP_INT4 (f1) + SELECT int4(f1) FROM INT2_TBL; +SELECT '' AS nine, f1 FROM TEMP_INT4 + ORDER BY f1; + nine | f1 +------+-------- + | -32767 + | -1234 + | -1004 + | -35 + | 0 + | 0 + | 0 + | 1234 + | 32767 +(9 rows) + +-- int2 +CREATE TABLE TEMP_INT2 (f1 INT2); +INSERT INTO TEMP_INT2 (f1) + SELECT int2(f1) FROM FLOAT8_TBL + WHERE (f1 >= -32767) AND (f1 <= 32767); +INSERT INTO TEMP_INT2 (f1) + SELECT int2(f1) FROM INT4_TBL + WHERE (f1 >= -32767) AND (f1 <= 32767); +SELECT '' AS five, f1 FROM TEMP_INT2 + ORDER BY f1; + five | f1 +------+------- + | -1004 + | -35 + | 0 + | 0 + | 0 +(5 rows) + +-- +-- Group-by combinations +-- +CREATE TABLE TEMP_GROUP (f1 INT4, f2 INT4, f3 FLOAT8); +INSERT INTO TEMP_GROUP + SELECT 1, (- i.f1), (- f.f1) + FROM INT4_TBL i, FLOAT8_TBL f; +INSERT INTO TEMP_GROUP + SELECT 2, i.f1, f.f1 + FROM INT4_TBL i, FLOAT8_TBL f; +SELECT DISTINCT f1 AS two FROM TEMP_GROUP ORDER BY 1; + two +----- + 1 + 2 +(2 rows) + +SELECT f1 AS two, max(f3) AS max_float, min(f3) as min_float + FROM TEMP_GROUP + GROUP BY f1 + ORDER BY two, max_float, min_float; + two | max_float | min_float +-----+----------------------+----------------------- + 1 | 1.2345678901234e+200 | 0 + 2 | 0 | -1.2345678901234e+200 +(2 rows) + +-- GROUP BY a result column name is not legal per SQL92, but we accept it +-- anyway (if the name is not the name of any column exposed by FROM). +SELECT f1 AS two, max(f3) AS max_float, min(f3) AS min_float + FROM TEMP_GROUP + GROUP BY two + ORDER BY two, max_float, min_float; + two | max_float | min_float +-----+----------------------+----------------------- + 1 | 1.2345678901234e+200 | 0 + 2 | 0 | -1.2345678901234e+200 +(2 rows) + +SELECT f1 AS two, (max(f3) + 1) AS max_plus_1, (min(f3) - 1) AS min_minus_1 + FROM TEMP_GROUP + GROUP BY f1 + ORDER BY two, min_minus_1; + two | max_plus_1 | min_minus_1 +-----+----------------------+----------------------- + 1 | 1.2345678901234e+200 | -1 + 2 | 1 | -1.2345678901234e+200 +(2 rows) + +SELECT f1 AS two, + max(f2) + min(f2) AS max_plus_min, + min(f3) - 1 AS min_minus_1 + FROM TEMP_GROUP + GROUP BY f1 + ORDER BY two, min_minus_1; + two | max_plus_min | min_minus_1 +-----+--------------+----------------------- + 1 | 0 | -1 + 2 | 0 | -1.2345678901234e+200 +(2 rows) + +DROP TABLE TEMP_INT2; +DROP TABLE TEMP_INT4; +DROP TABLE TEMP_FLOAT; +DROP TABLE TEMP_GROUP;