stddev() and variance() should return NULL when there is just one input

value, per recent discussion on pgsql-general.
This commit is contained in:
Tom Lane 2003-04-21 00:22:24 +00:00
parent f9ba0a7fe5
commit 1dc3a62ec7
2 changed files with 18 additions and 34 deletions

View File

@ -8,7 +8,7 @@
* *
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.84 2003/03/11 21:01:33 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/float.c,v 1.85 2003/04/21 00:22:24 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -1649,12 +1649,9 @@ float8_variance(PG_FUNCTION_ARGS)
sumX = transvalues[1]; sumX = transvalues[1];
sumX2 = transvalues[2]; sumX2 = transvalues[2];
/* We define VARIANCE of no values to be NULL, of 1 value to be 0 */ /* Sample variance is undefined when N is 0 or 1, so return NULL */
if (N == 0.0)
PG_RETURN_NULL();
if (N <= 1.0) if (N <= 1.0)
PG_RETURN_FLOAT8(0.0); PG_RETURN_NULL();
numerator = N * sumX2 - sumX * sumX; numerator = N * sumX2 - sumX * sumX;
@ -1680,12 +1677,9 @@ float8_stddev(PG_FUNCTION_ARGS)
sumX = transvalues[1]; sumX = transvalues[1];
sumX2 = transvalues[2]; sumX2 = transvalues[2];
/* We define STDDEV of no values to be NULL, of 1 value to be 0 */ /* Sample stddev is undefined when N is 0 or 1, so return NULL */
if (N == 0.0)
PG_RETURN_NULL();
if (N <= 1.0) if (N <= 1.0)
PG_RETURN_FLOAT8(0.0); PG_RETURN_NULL();
numerator = N * sumX2 - sumX * sumX; numerator = N * sumX2 - sumX * sumX;

View File

@ -14,7 +14,7 @@
* Copyright (c) 1998-2003, PostgreSQL Global Development Group * Copyright (c) 1998-2003, PostgreSQL Global Development Group
* *
* IDENTIFICATION * IDENTIFICATION
* $Header: /cvsroot/pgsql/src/backend/utils/adt/numeric.c,v 1.59 2003/03/21 01:58:04 tgl Exp $ * $Header: /cvsroot/pgsql/src/backend/utils/adt/numeric.c,v 1.60 2003/04/21 00:22:24 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
@ -1964,24 +1964,19 @@ numeric_variance(PG_FUNCTION_ARGS)
if (NUMERIC_IS_NAN(N) || NUMERIC_IS_NAN(sumX) || NUMERIC_IS_NAN(sumX2)) if (NUMERIC_IS_NAN(N) || NUMERIC_IS_NAN(sumX) || NUMERIC_IS_NAN(sumX2))
PG_RETURN_NUMERIC(make_result(&const_nan)); PG_RETURN_NUMERIC(make_result(&const_nan));
/* We define VARIANCE of no values to be NULL, of 1 value to be 0 */ /* Sample variance is undefined when N is 0 or 1, so return NULL */
/* N is zero iff no digits (cf. numeric_uminus) */
if (N->varlen == NUMERIC_HDRSZ)
PG_RETURN_NULL();
init_var(&vN); init_var(&vN);
set_var_from_num(N, &vN); set_var_from_num(N, &vN);
init_var(&vNminus1); if (cmp_var(&vN, &const_one) <= 0)
sub_var(&vN, &const_one, &vNminus1);
if (cmp_var(&vNminus1, &const_zero) <= 0)
{ {
free_var(&vN); free_var(&vN);
free_var(&vNminus1); PG_RETURN_NULL();
PG_RETURN_NUMERIC(make_result(&const_zero));
} }
init_var(&vNminus1);
sub_var(&vN, &const_one, &vNminus1);
init_var(&vsumX); init_var(&vsumX);
set_var_from_num(sumX, &vsumX); set_var_from_num(sumX, &vsumX);
init_var(&vsumX2); init_var(&vsumX2);
@ -2045,24 +2040,19 @@ numeric_stddev(PG_FUNCTION_ARGS)
if (NUMERIC_IS_NAN(N) || NUMERIC_IS_NAN(sumX) || NUMERIC_IS_NAN(sumX2)) if (NUMERIC_IS_NAN(N) || NUMERIC_IS_NAN(sumX) || NUMERIC_IS_NAN(sumX2))
PG_RETURN_NUMERIC(make_result(&const_nan)); PG_RETURN_NUMERIC(make_result(&const_nan));
/* We define STDDEV of no values to be NULL, of 1 value to be 0 */ /* Sample stddev is undefined when N is 0 or 1, so return NULL */
/* N is zero iff no digits (cf. numeric_uminus) */
if (N->varlen == NUMERIC_HDRSZ)
PG_RETURN_NULL();
init_var(&vN); init_var(&vN);
set_var_from_num(N, &vN); set_var_from_num(N, &vN);
init_var(&vNminus1); if (cmp_var(&vN, &const_one) <= 0)
sub_var(&vN, &const_one, &vNminus1);
if (cmp_var(&vNminus1, &const_zero) <= 0)
{ {
free_var(&vN); free_var(&vN);
free_var(&vNminus1); PG_RETURN_NULL();
PG_RETURN_NUMERIC(make_result(&const_zero));
} }
init_var(&vNminus1);
sub_var(&vN, &const_one, &vNminus1);
init_var(&vsumX); init_var(&vsumX);
set_var_from_num(sumX, &vsumX); set_var_from_num(sumX, &vsumX);
init_var(&vsumX2); init_var(&vsumX2);