Re: SQL feature requests - Mailing list pgsql-hackers

From Michael Glaesemann
Subject Re: SQL feature requests
Date
Msg-id 65CD4426-E228-41EF-A6AF-C67B86AF0948@seespotcode.net
Whole thread Raw
In response to SQL feature requests  ("Ben Tilly" <btilly@gmail.com>)
Responses Re: SQL feature requests  ("Ben Tilly" <btilly@gmail.com>)
Re: SQL feature requests  ("Chuck McDevitt" <cmcdevitt@greenplum.com>)
List pgsql-hackers
On Aug 22, 2007, at 18:45 , Ben Tilly wrote:

> 1. Just a minor annoyance, but why must subqueries in FROM clauses
> have an alias?

It's required by the SQL standard, AIUI. I wonder what EnterpriseDB  
does?

> 2. Why is 'non-integer constant in GROUP BY' an error?

>  This works for now:
>
>   case when true then true end
>
> but I don't know whether some future version of postgres might break
> my code by banning that as well.

The PostgreSQL developers generally tries hard to preserve backwards  
compatibility, so I doubt the case expression as you have it would go  
away (though I'm kind of surprised it's allowed). Am I wrong in  
thinking that Oracle would accept the same format PostgreSQL does? In  
that case, couldn't you use whatever method works in PostgreSQL in  
Oracle? I haven't checked the SQL standard, but it seems unlikely  
it'd allow something like

GROUP BY , , , ;

AIUI, Integers are only allowed because the SQL standard explicitly  
allows you to refer to columns by the order they appear in the SELECT  
list. Otherwise the GROUP BY items need to be column names.

Both 1 and 2 seem to me to be places where Oracle is likely deviating  
from the standard. If you're targeting Oracle, then using Oracle- 
specific syntax might be warranted. If you're hoping to target more  
than one possible backend, I'd think it be better to use more  
portable syntax (e.g., SQL-standard syntax) than expecting other  
DBMSs to follow another's deviations. That's not to say PostgreSQL  
does not have non-standard syntax: in places, it does. But it does  
try to hew very closely to the standard.

Again, I wonder what EnterpriseDB does in this case?

> 3. How hard would it be to have postgres ignore aliases in group by
> clauses?  Per my comments above, I often build complex queries in
> code.  I can't easily use the shortcut of referring to the select
> column by number because the position is hard to determine.  So my
> code has to copy the select terms.  But I can't copy them exactly
> because the select terms include lots of "...as foo" clauses that are
> not allowed in a group by.  So I have to store very similar terms to
> use twice.

Perhaps someone else knows what you're referring to here, but I'm  
having a hard time without an example. Here's what I *think* you're  
trying to say:

test=# select * from observation;
observation_id | record_id | score_id
----------------+-----------+----------           3240 |         1 |        1           3239 |         1 |        1
     3238 |         1 |        2           3237 |         1 |        1           2872 |         2 |        1
2869|         2 |        2           2870 |         2 |        1           2871 |         2 |        1           3218 |
       3 |        2           3217 |         3 |        1
 
(10 rows)

test=# select record_id as foo, count(observation_id) from  
observation group by record_id;
foo | count
-----+-------   3 |     2   2 |     4   1 |     4
(3 rows)

test=# select record_id as foo, count(observation_id) from  
observation group by foo;
foo | count
-----+-------   3 |     2   2 |     4   1 |     4
(3 rows)

test=# select record_id as foo, count(observation_id) as bar from  
observation group by foo;
foo | bar
-----+-----   3 |   2   2 |   4   1 |   4
(3 rows)

test=# select record_id as foo, count(observation_id) as bar from  
observation group by record_id;
foo | bar
-----+-----   3 |   2   2 |   4   1 |   4
(3 rows)

test=# select version();                                                                    
version
------------------------------------------------------------------------ 
----------------------------------------------------------------------
PostgreSQL 8.2.4 on powerpc-apple-darwin8.9.0, compiled by GCC  
powerpc-apple-darwin8-gcc-4.0.1 (GCC) 4.0.1 (Apple Computer, Inc.  
build 5367)
(1 row)

I'm not getting an error in any permutation that I can think of. What  
am I missing?

> Which is to assume that
> a query without a group by clause, but with an aggregate function in
> the select, should have an implicit group by clause where you group by
> all non-aggregate functions in the select.
>
> For example
>
>   SELECT foo, count(*)
>   FROM bar
>
> would be processed as:
>
>   SELECT foo, count(*)
>   FROM bar
>   GROUP BY foo

It's been discussed before. I don't believe it's been rejected out of  
hand (though you can check the archives), just that no one's gotten  
around to it. (Don't know what the SQL-spec says on this point.)

I'm not trying to dismiss your points, just trying to address them.  
I'm interested to hear what others have to say.

Michael Glaesemann
grzm seespotcode net




pgsql-hackers by date:

Previous
From: Josh Berkus
Date:
Subject: Re: SQL feature requests
Next
From: Gregory Stark
Date:
Subject: Re: SQL feature requests