*** a/src/backend/executor/nodeWindow.c
--- b/src/backend/executor/nodeWindow.c
***************
*** 818,824 **** start_frame(WindowState *winstate)
  			case FRAME_CURRENT_RANGE:
  				/* UNSUPPORTED */
  				elog(ERROR, "unknown preceding type %d", node->preceding_type);
! 				break;
  			case FRAME_VALUE_ROWS:
  				if (node->preceding_rows > 0)
  					f_shrinking = 0;
--- 818,824 ----
  			case FRAME_CURRENT_RANGE:
  				/* UNSUPPORTED */
  				elog(ERROR, "unknown preceding type %d", node->preceding_type);
! 				return; /* keep compiler quiet */
  			case FRAME_VALUE_ROWS:
  				if (node->preceding_rows > 0)
  					f_shrinking = 0;
***************
*** 922,928 **** start_frame(WindowState *winstate)
  			case FRAME_CURRENT_RANGE:
  				/* UNSUPPORTED */
  				elog(ERROR, "unknown preceding type %d", node->preceding_type);
! 				break;
  			case FRAME_VALUE_ROWS:
  				if (node->preceding_rows <= winobj->p_currentpos + 1)
  					f_shrinking = 1;
--- 922,928 ----
  			case FRAME_CURRENT_RANGE:
  				/* UNSUPPORTED */
  				elog(ERROR, "unknown preceding type %d", node->preceding_type);
! 				return; /* keep compiler quiet */
  			case FRAME_VALUE_ROWS:
  				if (node->preceding_rows <= winobj->p_currentpos + 1)
  					f_shrinking = 1;
***************
*** 1603,1608 **** ExecCountSlotsWindow(Window *node)
--- 1603,1609 ----
  		ExecCountSlotsNode(innerPlan(node)) +
  		WINDOW_NSLOTS;
  }
+ 
  /* -----------------
   * ExecEndWindow
   * -----------------
*** a/src/backend/optimizer/plan/planner.c
--- b/src/backend/optimizer/plan/planner.c
***************
*** 1361,1367 **** grouping_planner(PlannerInfo *root, double tuple_fraction)
  											   extract_grouping_ops(wc->orderClause),
  											   result_plan);
  		}
- 		current_pathkeys = NIL;
  	}
  
  	/*
--- 1361,1366 ----
***************
*** 2438,2443 **** preprocess_window(List *tlist, Plan *subplan)
--- 2437,2443 ----
  		output_targetlist = lappend(output_targetlist, newtle);
  	}
  
+ 	tlist_resno = list_length(tlist);
  	/*
  	 * finally pulled arguments are appended to the current tlist so that
  	 * each window function can take Var or Const arguments.
***************
*** 2453,2458 **** preprocess_window(List *tlist, Plan *subplan)
--- 2453,2470 ----
  							  NULL,
  							  true);
  		output_targetlist = lappend(output_targetlist, tle);
+ 
+ 		/*
+ 		 * We also need the entry in the middle windows,
+ 		 * so that upper window can take them as arguments.
+ 		 */
+ 		if (!tlist_member((Node *) tle->expr, tlist))
+ 		{
+ 			tle = flatCopyTargetEntry(tle);
+ 			tlist_resno++;
+ 			tle->resno = tlist_resno;
+ 			tlist = lappend(tlist, tle);
+ 		}
  	}
  
  	return output_targetlist;
*** a/src/test/regress/expected/window.out
--- b/src/test/regress/expected/window.out
***************
*** 459,464 **** FROM tenk1 GROUP BY ten, two WINDOW win AS (PARTITION BY two ORDER BY ten);
--- 459,475 ----
     9 |   1 | 54000 | 250000
  (10 rows)
  
+ -- more than a window with GROUP BY
+ SELECT sum(salary),
+ 	row_number() OVER (ORDER BY depname),
+ 	sum(sum(salary)) OVER (ORDER BY depname DESC) FROM empsalary GROUP BY depname;
+   sum  | row_number |  sum  
+ -------+------------+-------
+  14600 |          3 | 14600
+   7400 |          2 | 22000
+  25100 |          1 | 47100
+ (3 rows)
+ 
  -- subplan
  SELECT lead(ten, (SELECT two FROM tenk1 WHERE s.unique2 = unique2)) OVER (PARTITION BY four ORDER BY ten)
  FROM tenk1 s WHERE unique2 < 10;
*** a/src/test/regress/sql/window.sql
--- b/src/test/regress/sql/window.sql
***************
*** 97,102 **** SELECT avg(four) OVER (PARTITION BY four ORDER BY thousand / 100) FROM tenk1 WHE
--- 97,107 ----
  SELECT ten, two, sum(hundred) AS gsum, sum(sum(hundred)) OVER win AS wsum 
  FROM tenk1 GROUP BY ten, two WINDOW win AS (PARTITION BY two ORDER BY ten);
  
+ -- more than a window with GROUP BY
+ SELECT sum(salary),
+ 	row_number() OVER (ORDER BY depname),
+ 	sum(sum(salary)) OVER (ORDER BY depname DESC) FROM empsalary GROUP BY depname;
+ 
  -- subplan
  SELECT lead(ten, (SELECT two FROM tenk1 WHERE s.unique2 = unique2)) OVER (PARTITION BY four ORDER BY ten)
  FROM tenk1 s WHERE unique2 < 10;
