Thread: RE: [GENERAL] changing between 6.4.1 and 6.5

RE: [GENERAL] changing between 6.4.1 and 6.5

From
Daniel Péder
Date:
have You set any triggers, rules, listens or defaults for tablex?

-----Original Message-----
From:    Jens Felber [SMTP:jfe@gek-online.de]
Sent:    Wednesday, August 25, 1999 5:40 PM
To:    Stuart Rison; pgsql-general@postgreSQL.org
Subject:    Re: [GENERAL] changing between 6.4.1 and 6.5

At 13:02 25.08.99 +0100, Stuart Rison wrote:
>Hi,
>
>>realized the same error:
>>ERROR: illegal use of aggregate or non-group column in target list
>>(aggregates are not existing in my database)
>>
>>Statement:  select x1, x2, x3, x4 on tablex order by x1, x2;
                                                       ^^^^^^
sorry, there was a mistake : it must be from not on
But the problem is the same.

by Jens

************


RE: [GENERAL] changing between 6.4.1 and 6.5

From
Jens Felber
Date:
At 18:02 25.08.99 +0200, you wrote:
>have You set any triggers, rules, listens or defaults for tablex?
>


Nothing is set. I create a new table for tests.

 --> create table test1 (x1 int2, x2 int2, tx char);

then I've inserted some values:

--> insert into test1 values (1,2, 'a');
--> insert into test1 values (1,2, 'b');
--> insert into test1 values (1,3, 'b');
--> insert into test1 values (1,4, 'b');
--> insert into test1 values (2,2, 'b');
--> insert into test1 values (2,3, 'b');

after that I want a select with group by:

--> select * from test1 group by x1, x2;

ERROR: illegal use of aggregate or non-group column in target list

I believe, that all fields are in group column, but what means target list:
is it the native table test1 or is mean  the output list, which is seen on
screen
after the statement?

And another part is: the same table and the same statement bring out the
correct values in a postgreql v6.4.x . Why not in v6.5?

Jens

RE: [GENERAL] changing between 6.4.1 and 6.5

From
Stuart Rison
Date:
At 8:38 am +0200 26/8/99, Jens Felber wrote:
>At 18:02 25.08.99 +0200, dpeder wrote:
>>have You set any triggers, rules, listens or defaults for tablex?
>>
>
>
>Nothing is set. I create a new table for tests.
>
> --> create table test1 (x1 int2, x2 int2, tx char);
>
>then I've inserted some values:
>
>--> insert into test1 values (1,2, 'a');
>--> insert into test1 values (1,2, 'b');
>--> insert into test1 values (1,3, 'b');
>--> insert into test1 values (1,4, 'b');
>--> insert into test1 values (2,2, 'b');
>--> insert into test1 values (2,3, 'b');
>
>after that I want a select with group by:
>
>--> select * from test1 group by x1, x2;
>
>ERROR: illegal use of aggregate or non-group column in target list

OK, in your original posting you had: select x1, x2, x3, x4 on tablex order
by x1, x2.

...which has little to do with the statement you are now posting; (the
former has a syntax error and uses ORDER BY, the second has an SQL error
and uses GROUP BY).

>I believe, that all fields are in group column, but what means target list:
>is it the native table test1 or is mean  the output list, which is seen on
>screen
>after the statement?

The target list is the list of fields that you SELECT statement will
return, in your select * statement, these fields are: x1,x2 and tx.

>And another part is: the same table and the same statement bring out the
>correct values in a postgreql v6.4.x . Why not in v6.5?

I've tried your SELECTs under postgres 6.4.0 and I'm begining to see where
the confusion might have arose.

PG6.5 is perfectly correct to flag up an error with the statement "select *
from test1 group by x1, x2;"

Think of it this way: you are asking it to form distinct groups on the
basis of having a unique combination of x1 and x2; then you ask, for each
such group, for the values of x1, x2 and tx.  The problem is, for the group
where the value of x1 is 1 and the value of x2 is 2, there are two valid
values of tx ('a' and 'b').

Postgres can't -and indeed shouldn't have to- resolve this ambiguity so it
flags an error in version 6.5.  Unfortunately it does not in version 6.4
which I would consider a bug!

You get the appropriate error message under PG 6.4 if you try the following:

SELECT *,count(tx) FROM test1 GROUP BY x1, x2;

To get your statement to work under PG6.5 you must either include the tx
field into your GROUP BY list:

SELECT * FROM test1 GROUP BY x1, x2,tx;

or drop it from your target list:

SELECT x1, x2 FROM test1 GROUP BY x1, x2,tx;

Personally, I think that you need to rethink exactly what you are trying to
do with your select and chose the appropriate solution.

The good news is that PG6.5 probably saved you from many silent errors
(because your select statement under PG6.4 could not be guaranteed to
always return the same value for tx!).

Hope this helps.

Regards,

Stuart.

+--------------------------+--------------------------------------+
| Stuart C. G. Rison       | Ludwig Institute for Cancer Research |
+--------------------------+ 91 Riding House Street               |
| N.B. new phone code!!    | London, W1P 8BT                      |
| Tel. +44 (0)207 878 4041 | UNITED KINGDOM                       |
| Fax. +44 (0)207 878 4040 | stuart@ludwig.ucl.ac.uk              |
+--------------------------+--------------------------------------+