Thread: Aggregate Function (AVG) not calculated correctly

Aggregate Function (AVG) not calculated correctly

From
pgsql-bugs@postgresql.org
Date:
Gavin Evans (gavin@consultant.com) reports a bug with a severity of 1
The lower the number the more severe it is.

Short Description
Aggregate Function (AVG) not calculated correctly

Long Description
Using the following code:
SELECT airline_code, AVG(distance) FROM flights GROUP BY airline_code;

The first line of the result set (AI           | -2864) is calculated wrongly.

I have included all code needed to prove the bug, this is a SERIOUS BUG!

G

Sample Code
eg3ab=# select * from flights;
 flight_number | aircraft | distance | airline_code | origin | destination
---------------+----------+----------+--------------+--------+-------------
 AI434         | 310      |     3417 | AI           | BOM    | PER
 AI306         | 747      |     1724 | AI           | BOM    | BKK
 AI410         | 310      |     2012 | AI           | BOM    | KUL
 AI158         | 740      |     2720 | AI           | FRA    | BOM
 AI112         | 744      |     9632 | AI           | JFK    | HKG
 CX254         | 744      |     8736 | CX           | LHR    | HKG
 VS200         | 340      |     8736 | VS           | LHR    | HKG
 VS501         | 744      |    14737 | VS           | LHR    | SYD
 BA009         | 744      |    12882 | BA           | LHR    | SYD
 QF10          | AB3      |    13368 | QF           | LHR    | SYD
 GA881         | M11      |     8035 | GA           | LGW    | BKK
 PR731         | 74E      |     9148 | PR           | LGW    | BKK
 TG915         | 744      |    10905 | TG           | LHR    | BKK
 TG911         | 744      |     9422 | TG           | LHR    | SIN
 BA011         | 744      |     9422 | BA           | LHR    | SIN
 AI180         | 747      |     6422 | AI           | LHR    | SIN
 QF12          | AB3      |     1839 | QF           | MEL    | PER
 BA014         | 767      |      321 | BA           | LHR    | FRA
 AI200         | 747      |     3705 | AI           | JFK    | FRA
 AI181         | 747      |     6422 | AI           | SIN    | LHR
 AI201         | 747      |     3705 | AI           | FRA    | JFK
(21 rows)

eg3ab=# \i ex13.query
 airline_code |  avg
--------------+-------
 AI           | -2864
 BA           |  7541
 CX           |  8736
 GA           |  8035
 PR           |  9148
 QF           |  7603
 TG           | 10163
 VS           | 11736
(8 rows)

No file was uploaded with this report

Re: Aggregate Function (AVG) not calculated correctly

From
Thomas Lockhart
Date:
pgsql-bugs@postgresql.org wrote:
>
> Gavin Evans (gavin@consultant.com) reports a bug with a severity of 1
> The lower the number the more severe it is.
>
> Short Description
> Aggregate Function (AVG) not calculated correctly
>
> Long Description
> Using the following code:
> SELECT airline_code, AVG(distance) FROM flights GROUP BY airline_code;
>
> The first line of the result set (AI           | -2864) is calculated wrongly.
> I have included all code needed to prove the bug, this is a SERIOUS BUG!

You have not included all information required to understand the
problem. In particular, what is the schema? What version of PostgreSQL
are you using? What kind of machine?

Do you happen to be using int2 for the distance fields? In that case you
are likely (silently) overflowing your calculation.

Please post the schema and the data in such a way that we can read it
in! I'd suggest using pg_dump on the relevant table, but other
techniques can be used.

Regards.

                     - Thomas

Re: Aggregate Function (AVG) not calculated correctly

From
Tom Lane
Date:
pgsql-bugs@postgresql.org writes:
> I have included all code needed to prove the bug,

No, you haven't: where are the table declarations?

But I'll take a guess anyway: you declared "distance" as int2, didn't
you?  AVG(int2) currently uses an int2 accumulator, and you're suffering
overflow.  Try "AVG(distance::float8)" instead.

We've changed AVG() to use a numeric accumulator for 7.1, but that
won't help you today.

            regards, tom lane