X-Original-To: pgsql-patches-postgresql.org@localhost.postgresql.org Received: from localhost (unknown [200.46.204.144]) by svr1.postgresql.org (Postfix) with ESMTP id 76B86329E7E for ; Mon, 20 Sep 2004 22:39:51 +0100 (BST) Received: from svr1.postgresql.org ([200.46.204.71]) by localhost (av.hub.org [200.46.204.144]) (amavisd-new, port 10024) with ESMTP id 26764-08 for ; Mon, 20 Sep 2004 21:39:44 +0000 (GMT) Received: from stark.xeocode.com (gsstark.mtl.istop.com [66.11.160.162]) by svr1.postgresql.org (Postfix) with ESMTP id E8256329E50 for ; Mon, 20 Sep 2004 22:39:45 +0100 (BST) Received: from localhost ([127.0.0.1] helo=stark.xeocode.com) by stark.xeocode.com with smtp (Exim 3.36 #1 (Debian)) id 1C9Vsq-0003yc-00; Mon, 20 Sep 2004 17:39:40 -0400 To: mailreg@numerixtechnology.de, pgsql-patches@postgresql.org Cc: Greg Stark Subject: Re: [SQL] COUNT(*) to find records which have a certain number of dependencies ? References: <414EF3E6.9040202@numerixtechnology.de> <87llf4hjv2.fsf@stark.xeocode.com> <414F348A.2020608@numerixtechnology.de> <877jqohdoj.fsf@stark.xeocode.com> <414F43A8.8000101@numerixtechnology.de> In-Reply-To: <414F43A8.8000101@numerixtechnology.de> From: Greg Stark Organization: The Emacs Conspiracy; member since 1992 Date: 20 Sep 2004 17:39:40 -0400 Message-ID: <87y8j4fwmb.fsf@stark.xeocode.com> Lines: 108 User-Agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.3 MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Virus-Scanned: by amavisd-new at hub.org X-Spam-Status: No, hits=0.0 tagged_above=0.0 required=5.0 tests= X-Spam-Level: X-Archive-Number: 200409/214 X-Sequence-Number: 13076 T E Schmitz writes: > There's a German saying "Go and find a parking-meter", i.e. suggesting to pop a > coin in the parking-meter and talk to it as nobody else wants to listen. ;-) Yes well I anticipated such a response. So I tried my hand at it myself. Well I finally found a problem tractable enough for me to get all the way from start to end in a single sitting. Here's a simple solution to my complaint. This patch allows subqueries without aliases. This is SQL-non-spec-compliant syntax that Oracle supports and many users expect to work. It's also just damned convenient, especially for simple ad-hoc queries. There was a comment saying an alias name would have to be constructed so I took that approach. It seems like it would have been cleaner to just ensure that the code doesn't fail when no alias is present. But I have no idea how much work would be involved in that, so I just took advice from the anonymous author of the comment. Incidentally, It seems weird to me that the counter doesn't reset for every query. Perhaps I should change that? Index: src/backend/parser/gram.y =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/backend/parser/gram.y,v retrieving revision 2.475 diff -u -p -c -r2.475 gram.y cvs diff: conflicting specifications of output style *** src/backend/parser/gram.y 29 Aug 2004 04:12:35 -0000 2.475 --- src/backend/parser/gram.y 20 Sep 2004 21:34:13 -0000 *************** table_ref: relation_expr *** 5158,5177 **** { /* * The SQL spec does not permit a subselect ! * () without an alias clause, ! * so we don't either. This avoids the problem ! * of needing to invent a unique refname for it. ! * That could be surmounted if there's sufficient ! * popular demand, but for now let's just implement ! * the spec and see if anyone complains. ! * However, it does seem like a good idea to emit ! * an error message that's better than "syntax error". */ ! ereport(ERROR, ! (errcode(ERRCODE_SYNTAX_ERROR), ! errmsg("subquery in FROM must have an alias"), ! errhint("For example, FROM (SELECT ...) [AS] foo."))); ! $$ = NULL; } | select_with_parens alias_clause { --- 5158,5172 ---- { /* * The SQL spec does not permit a subselect ! * () without an alias clause, We surmount ! * this because of popular demand by gining up a fake name ! * in transformRangeSubselect */ ! ! RangeSubselect *n = makeNode(RangeSubselect); ! n->subquery = $1; ! n->alias = NULL; ! $$ = (Node *) n; } | select_with_parens alias_clause { Index: src/backend/parser/parse_clause.c =================================================================== RCS file: /projects/cvsroot/pgsql-server/src/backend/parser/parse_clause.c,v retrieving revision 1.136 diff -u -p -c -r1.136 parse_clause.c cvs diff: conflicting specifications of output style *** src/backend/parser/parse_clause.c 29 Aug 2004 05:06:44 -0000 1.136 --- src/backend/parser/parse_clause.c 20 Sep 2004 21:34:14 -0000 *************** transformRangeSubselect(ParseState *psta *** 418,426 **** * an unlabeled subselect. */ if (r->alias == NULL) ! ereport(ERROR, ! (errcode(ERRCODE_SYNTAX_ERROR), ! errmsg("subquery in FROM must have an alias"))); /* * Analyze and transform the subquery. --- 418,434 ---- * an unlabeled subselect. */ if (r->alias == NULL) ! { ! static int subquery_counter = 1; ! static char buf[30]; ! ! sprintf(buf, "*SUBQUERY*%d*", subquery_counter++); ! ! r->alias = makeNode(Alias); ! r->alias->aliasname = pstrdup(buf); ! r->alias->colnames = NULL; ! } ! /* * Analyze and transform the subquery.