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;