Index: planagg.c
===================================================================
RCS file: /cvsroot/pgsql/src/backend/optimizer/plan/planagg.c,v
retrieving revision 1.25
diff -c -r1.25 planagg.c
*** planagg.c	9 Jan 2007 02:14:13 -0000	1.25
--- planagg.c	6 Feb 2007 06:30:23 -0000
***************
*** 70,75 ****
--- 70,76 ----
  optimize_minmax_aggregates(PlannerInfo *root, List *tlist, Path *best_path)
  {
  	Query	   *parse = root->parse;
+ 	FromExpr   *jtnode;
  	RangeTblRef *rtr;
  	RangeTblEntry *rte;
  	RelOptInfo *rel;
***************
*** 102,115 ****
  	 * We also restrict the query to reference exactly one table, since join
  	 * conditions can't be handled reasonably.  (We could perhaps handle a
  	 * query containing cartesian-product joins, but it hardly seems worth the
! 	 * trouble.)
  	 */
! 	Assert(parse->jointree != NULL && IsA(parse->jointree, FromExpr));
! 	if (list_length(parse->jointree->fromlist) != 1)
! 		return NULL;
! 	rtr = (RangeTblRef *) linitial(parse->jointree->fromlist);
! 	if (!IsA(rtr, RangeTblRef))
  		return NULL;
  	rte = rt_fetch(rtr->rtindex, parse->rtable);
  	if (rte->rtekind != RTE_RELATION || rte->inh)
  		return NULL;
--- 103,121 ----
  	 * We also restrict the query to reference exactly one table, since join
  	 * conditions can't be handled reasonably.  (We could perhaps handle a
  	 * query containing cartesian-product joins, but it hardly seems worth the
! 	 * trouble.)  However, the single real table could be buried in several
! 	 * levels of FromExpr.
  	 */
! 	jtnode = parse->jointree;
! 	while (IsA(jtnode, FromExpr))
! 	{
! 		if (list_length(jtnode->fromlist) != 1)
! 			return NULL;
! 		jtnode = linitial(jtnode->fromlist);
! 	}
! 	if (!IsA(jtnode, RangeTblRef))
  		return NULL;
+ 	rtr = (RangeTblRef *) jtnode;
  	rte = rt_fetch(rtr->rtindex, parse->rtable);
  	if (rte->rtekind != RTE_RELATION || rte->inh)
  		return NULL;
