*** postgresql-7.1.2/src/backend/commands/vacuum.c.orig Mon Mar 26 08:23:58 2001 --- postgresql-7.1.2/src/backend/commands/vacuum.c Wed Aug 1 13:10:42 2001 *************** *** 8,14 **** * * * IDENTIFICATION ! * $Header: /home/projects/pgsql/cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.189 2001/03/25 23:23:58 tgl Exp $ * *------------------------------------------------------------------------- */ --- 8,14 ---- * * * IDENTIFICATION ! * $Header: /home/projects/pgsql/cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.189.2.1 2001/06/29 16:34:49 tgl Exp $ * *------------------------------------------------------------------------- */ *************** *** 577,583 **** maxoff; bool pgchanged, tupgone, - dobufrel, notup; char *relname; VacPage vacpage, --- 577,582 ---- *************** *** 876,890 **** } } - if (pgchanged) - { - WriteBuffer(buf); - dobufrel = false; - changed_pages++; - } - else - dobufrel = true; - if (tempPage != (Page) NULL) { /* Some tuples are gone */ PageRepairFragmentation(tempPage, NULL); --- 875,880 ---- *************** *** 900,907 **** free_size += vacpage->free; reap_page(vacuum_pages, vacpage); } ! if (dobufrel) ReleaseBuffer(buf); if (notup) empty_end_pages++; else --- 890,904 ---- free_size += vacpage->free; reap_page(vacuum_pages, vacpage); } ! ! if (pgchanged) ! { ! WriteBuffer(buf); ! changed_pages++; ! } ! else ReleaseBuffer(buf); + if (notup) empty_end_pages++; else *** postgresql-7.1.2/src/backend/optimizer/path/allpaths.c.orig Thu Mar 22 12:59:34 2001 --- postgresql-7.1.2/src/backend/optimizer/path/allpaths.c Wed Aug 1 13:10:42 2001 *************** *** 125,135 **** * Non-pushed-down clauses will get evaluated as qpquals of * the SubqueryScan node. * * XXX Are there any cases where we want to make a policy * decision not to push down, because it'd result in a worse * plan? */ ! if (rte->subquery->setOperations == NULL) { /* OK to consider pushing down individual quals */ List *upperrestrictlist = NIL; --- 125,141 ---- * Non-pushed-down clauses will get evaluated as qpquals of * the SubqueryScan node. * + * We can't push down into subqueries with LIMIT or DISTINCT ON + * clauses, either. + * * XXX Are there any cases where we want to make a policy * decision not to push down, because it'd result in a worse * plan? */ ! if (rte->subquery->setOperations == NULL && ! rte->subquery->limitOffset == NULL && ! rte->subquery->limitCount == NULL && ! !has_distinct_on_clause(rte->subquery)) { /* OK to consider pushing down individual quals */ List *upperrestrictlist = NIL; *** postgresql-7.1.2/src/backend/optimizer/util/clauses.c.orig Wed Mar 28 02:12:34 2001 --- postgresql-7.1.2/src/backend/optimizer/util/clauses.c Wed Aug 1 13:10:42 2001 *************** *** 730,742 **** /***************************************************************************** * * * General clause-manipulating routines * * * *****************************************************************************/ /* ! * clause_relids_vars * Retrieves distinct relids and vars appearing within a clause. * * '*relids' is set to an integer list of all distinct "varno"s appearing --- 730,794 ---- /***************************************************************************** + * Tests on clauses of queries + * + * Possibly this code should go someplace else, since this isn't quite the + * same meaning of "clause" as is used elsewhere in this module. But I can't + * think of a better place for it... + *****************************************************************************/ + + /* + * Test whether a query uses DISTINCT ON, ie, has a distinct-list that is + * just a subset of the output columns. + */ + bool + has_distinct_on_clause(Query *query) + { + List *targetList; + + /* Is there a DISTINCT clause at all? */ + if (query->distinctClause == NIL) + return false; + /* + * If the DISTINCT list contains all the nonjunk targetlist items, + * then it's a simple DISTINCT, else it's DISTINCT ON. We do not + * require the lists to be in the same order (since the parser may + * have adjusted the DISTINCT clause ordering to agree with ORDER BY). + */ + foreach(targetList, query->targetList) + { + TargetEntry *tle = (TargetEntry *) lfirst(targetList); + Index ressortgroupref; + List *distinctClause; + + if (tle->resdom->resjunk) + continue; + ressortgroupref = tle->resdom->ressortgroupref; + if (ressortgroupref == 0) + return true; /* definitely not in DISTINCT list */ + foreach(distinctClause, query->distinctClause) + { + SortClause *scl = (SortClause *) lfirst(distinctClause); + + if (scl->tleSortGroupRef == ressortgroupref) + break; /* found TLE in DISTINCT */ + } + if (distinctClause == NIL) + return true; /* this TLE is not in DISTINCT list */ + } + /* It's a simple DISTINCT */ + return false; + } + + + /***************************************************************************** * * * General clause-manipulating routines * * * *****************************************************************************/ /* ! * clause_get_relids_vars * Retrieves distinct relids and vars appearing within a clause. * * '*relids' is set to an integer list of all distinct "varno"s appearing *** postgresql-7.1.2/src/backend/utils/adt/ruleutils.c.orig Thu Apr 19 02:04:24 2001 --- postgresql-7.1.2/src/backend/utils/adt/ruleutils.c Wed Aug 1 13:10:42 2001 *************** *** 119,125 **** static void get_basic_select_query(Query *query, deparse_context *context); static void get_setop_query(Node *setOp, Query *query, deparse_context *context, bool toplevel); - static bool simple_distinct(List *distinctClause, List *targetList); static void get_rule_sortgroupclause(SortClause *srt, List *tlist, bool force_colno, deparse_context *context); --- 119,124 ---- *************** *** 1006,1014 **** /* Add the DISTINCT clause if given */ if (query->distinctClause != NIL) { ! if (simple_distinct(query->distinctClause, query->targetList)) ! appendStringInfo(buf, " DISTINCT"); ! else { appendStringInfo(buf, " DISTINCT ON ("); sep = ""; --- 1005,1011 ---- /* Add the DISTINCT clause if given */ if (query->distinctClause != NIL) { ! if (has_distinct_on_clause(query)) { appendStringInfo(buf, " DISTINCT ON ("); sep = ""; *************** *** 1023,1028 **** --- 1020,1027 ---- } appendStringInfo(buf, ")"); } + else + appendStringInfo(buf, " DISTINCT"); } /* Then we tell what to select (the targetlist) */ *************** *** 1150,1183 **** } /* - * Detect whether a DISTINCT list can be represented as just DISTINCT - * or needs DISTINCT ON. It's simple if it contains exactly the nonjunk - * targetlist items. - */ - static bool - simple_distinct(List *distinctClause, List *targetList) - { - while (targetList) - { - TargetEntry *tle = (TargetEntry *) lfirst(targetList); - - if (!tle->resdom->resjunk) - { - if (distinctClause == NIL) - return false; - if (((SortClause *) lfirst(distinctClause))->tleSortGroupRef != - tle->resdom->ressortgroupref) - return false; - distinctClause = lnext(distinctClause); - } - targetList = lnext(targetList); - } - if (distinctClause != NIL) - return false; - return true; - } - - /* * Display a sort/group clause. */ static void --- 1149,1154 ---- *** postgresql-7.1.2/src/include/optimizer/clauses.h.orig Thu Mar 22 13:00:53 2001 --- postgresql-7.1.2/src/include/optimizer/clauses.h Wed Aug 1 13:10:42 2001 *************** *** 59,64 **** --- 59,66 ---- extern bool is_pseudo_constant_clause(Node *clause); extern List *pull_constant_clauses(List *quals, List **constantQual); + extern bool has_distinct_on_clause(Query *query); + extern void clause_get_relids_vars(Node *clause, Relids *relids, List **vars); extern int NumRelids(Node *clause); extern void get_relattval(Node *clause, int targetrelid, *** postgresql-7.1.2/src/test/regress/expected/abstime-solaris-1947.out.orig Fri May 4 04:00:37 2001 --- postgresql-7.1.2/src/test/regress/expected/abstime-solaris-1947.out Wed Aug 1 13:10:42 2001 *************** *** 47,56 **** | Sun Jan 14 03:14:21 1973 PST | Mon May 01 00:30:30 1995 PDT | epoch - | current | -infinity | Sat May 10 23:59:12 1947 PDT ! (6 rows) SELECT '' AS six, ABSTIME_TBL.* WHERE ABSTIME_TBL.f1 > abstime '-infinity'; --- 47,55 ---- | Sun Jan 14 03:14:21 1973 PST | Mon May 01 00:30:30 1995 PDT | epoch | -infinity | Sat May 10 23:59:12 1947 PDT ! (5 rows) SELECT '' AS six, ABSTIME_TBL.* WHERE ABSTIME_TBL.f1 > abstime '-infinity'; *** postgresql-7.1.2/src/test/regress/expected/abstime.out.orig Fri May 4 04:00:37 2001 --- postgresql-7.1.2/src/test/regress/expected/abstime.out Wed Aug 1 13:10:42 2001 *************** *** 47,56 **** | Sun Jan 14 03:14:21 1973 PST | Mon May 01 00:30:30 1995 PDT | epoch - | current | -infinity | Sat May 10 23:59:12 1947 PST ! (6 rows) SELECT '' AS six, ABSTIME_TBL.* WHERE ABSTIME_TBL.f1 > abstime '-infinity'; --- 47,55 ---- | Sun Jan 14 03:14:21 1973 PST | Mon May 01 00:30:30 1995 PDT | epoch | -infinity | Sat May 10 23:59:12 1947 PST ! (5 rows) SELECT '' AS six, ABSTIME_TBL.* WHERE ABSTIME_TBL.f1 > abstime '-infinity';