X-Original-To: pgsql-sql@postgresql.org Received: from sss.pgh.pa.us (unknown [192.204.191.242]) by postgresql.org (Postfix) with ESMTP id 3B599475D3B for ; Fri, 7 Mar 2003 13:31:57 -0500 (EST) Received: from sss2.sss.pgh.pa.us (tgl@localhost [127.0.0.1]) by sss.pgh.pa.us (8.12.8/8.12.8) with ESMTP id h27IVlx6001594; Fri, 7 Mar 2003 13:31:47 -0500 (EST) To: Josh Berkus Cc: Mathieu Arnold , pgsql-sql@postgresql.org Subject: Re: problem with subselect In-reply-to: <200303070948.45070.josh@agliodbs.com> References: <2063882566.1047045882@andromede.reaumur.absolight.net> <200303070948.45070.josh@agliodbs.com> Comments: In-reply-to Josh Berkus message dated "Fri, 07 Mar 2003 09:48:45 -0800" Date: Fri, 07 Mar 2003 13:31:47 -0500 Message-ID: <1593.1047061907@sss.pgh.pa.us> From: Tom Lane X-Archive-Number: 200303/208 X-Sequence-Number: 12248 Josh Berkus writes: >> "Sub-SELECT uses un-GROUPed attribute f.date_creation from outer query" >> Which is not really true, but some way is... > Hmmm ... this looks like a minor parser bug. No, it's operating as designed. Note the comments in CVS tip parse_agg.c: * NOTE: we recognize grouping expressions in the main query, but only * grouping Vars in subqueries. For example, this will be rejected, * although it could be allowed: * SELECT * (SELECT x FROM bar where y = (foo.a + foo.b)) * FROM foo * GROUP BY a + b; * The difficulty is the need to account for different sublevels_up. * This appears to require a whole custom version of equal(), which is * way more pain than the feature seems worth. Previous versions implemented the check for ungrouped vars a little differently, but the net effect was the same. (Given that SQL99 allows only a simple column reference as a GROUP BY element, this isn't a spec violation, merely a limitation on how far we are willing to extend the spec.) There are a number of straightforward ways to rewrite the query to avoid this, but I can't help wondering whether the basic approach isn't wrong. The subselect seems an ugly and inefficient way to do it, because it's re-executing the entire join for each group ... but I can't quite put my finger on a better way ... regards, tom lane