*** ./src/include/parser/kwlist.h.orig	2013-06-23 13:40:32.000000000 +0100
--- ./src/include/parser/kwlist.h	2013-06-23 13:41:29.000000000 +0100
***************
*** 155,161 ****
  PG_KEYWORD("false", FALSE_P, RESERVED_KEYWORD)
  PG_KEYWORD("family", FAMILY, UNRESERVED_KEYWORD)
  PG_KEYWORD("fetch", FETCH, RESERVED_KEYWORD)
! PG_KEYWORD("filter", FILTER, TYPE_FUNC_NAME_KEYWORD)
  PG_KEYWORD("first", FIRST_P, UNRESERVED_KEYWORD)
  PG_KEYWORD("float", FLOAT_P, COL_NAME_KEYWORD)
  PG_KEYWORD("following", FOLLOWING, UNRESERVED_KEYWORD)
--- 155,161 ----
  PG_KEYWORD("false", FALSE_P, RESERVED_KEYWORD)
  PG_KEYWORD("family", FAMILY, UNRESERVED_KEYWORD)
  PG_KEYWORD("fetch", FETCH, RESERVED_KEYWORD)
! PG_KEYWORD("filter", FILTER, UNRESERVED_KEYWORD)
  PG_KEYWORD("first", FIRST_P, UNRESERVED_KEYWORD)
  PG_KEYWORD("float", FLOAT_P, COL_NAME_KEYWORD)
  PG_KEYWORD("following", FOLLOWING, UNRESERVED_KEYWORD)
***************
*** 271,277 ****
  PG_KEYWORD("order", ORDER, RESERVED_KEYWORD)
  PG_KEYWORD("out", OUT_P, COL_NAME_KEYWORD)
  PG_KEYWORD("outer", OUTER_P, TYPE_FUNC_NAME_KEYWORD)
! PG_KEYWORD("over", OVER, TYPE_FUNC_NAME_KEYWORD)
  PG_KEYWORD("overlaps", OVERLAPS, TYPE_FUNC_NAME_KEYWORD)
  PG_KEYWORD("overlay", OVERLAY, COL_NAME_KEYWORD)
  PG_KEYWORD("owned", OWNED, UNRESERVED_KEYWORD)
--- 271,277 ----
  PG_KEYWORD("order", ORDER, RESERVED_KEYWORD)
  PG_KEYWORD("out", OUT_P, COL_NAME_KEYWORD)
  PG_KEYWORD("outer", OUTER_P, TYPE_FUNC_NAME_KEYWORD)
! PG_KEYWORD("over", OVER, UNRESERVED_KEYWORD)
  PG_KEYWORD("overlaps", OVERLAPS, TYPE_FUNC_NAME_KEYWORD)
  PG_KEYWORD("overlay", OVERLAY, COL_NAME_KEYWORD)
  PG_KEYWORD("owned", OWNED, UNRESERVED_KEYWORD)
*** ./src/test/regress/expected/window.out.orig	2013-06-23 13:30:04.000000000 +0100
--- ./src/test/regress/expected/window.out	2013-06-23 13:47:09.000000000 +0100
***************
*** 989,997 ****
  LINE 1: SELECT rank() OVER (ORDER BY 1), count(*) FROM empsalary GRO...
                 ^
  SELECT * FROM rank() OVER (ORDER BY random());
! ERROR:  window functions are not allowed in functions in FROM
  LINE 1: SELECT * FROM rank() OVER (ORDER BY random());
!                       ^
  DELETE FROM empsalary WHERE (rank() OVER (ORDER BY random())) > 10;
  ERROR:  window functions are not allowed in WHERE
  LINE 1: DELETE FROM empsalary WHERE (rank() OVER (ORDER BY random())...
--- 989,997 ----
  LINE 1: SELECT rank() OVER (ORDER BY 1), count(*) FROM empsalary GRO...
                 ^
  SELECT * FROM rank() OVER (ORDER BY random());
! ERROR:  syntax error at or near "ORDER"
  LINE 1: SELECT * FROM rank() OVER (ORDER BY random());
!                                    ^
  DELETE FROM empsalary WHERE (rank() OVER (ORDER BY random())) > 10;
  ERROR:  window functions are not allowed in WHERE
  LINE 1: DELETE FROM empsalary WHERE (rank() OVER (ORDER BY random())...
*** ./src/backend/parser/gram.y.orig	2013-06-23 09:29:01.000000000 +0100
--- ./src/backend/parser/gram.y	2013-06-23 13:39:49.000000000 +0100
***************
*** 403,409 ****
  %type <node>	def_arg columnElem where_clause where_or_current_clause
  				a_expr b_expr c_expr func_expr AexprConst indirection_el
  				columnref in_expr having_clause func_table array_expr
! 				ExclusionWhereClause
  %type <list>	ExclusionConstraintList ExclusionConstraintElem
  %type <list>	func_arg_list
  %type <node>	func_arg_expr
--- 403,409 ----
  %type <node>	def_arg columnElem where_clause where_or_current_clause
  				a_expr b_expr c_expr func_expr AexprConst indirection_el
  				columnref in_expr having_clause func_table array_expr
! 				ExclusionWhereClause agg_func_expr func_call builtin_func
  %type <list>	ExclusionConstraintList ExclusionConstraintElem
  %type <list>	func_arg_list
  %type <node>	func_arg_expr
***************
*** 10495,10500 ****
--- 10495,10501 ----
  					n->agg_star = FALSE;
  					n->agg_distinct = FALSE;
  					n->func_variadic = FALSE;
+ 					n->agg_filter = NULL;
  					n->over = NULL;
  					n->location = @2;
  					$$ = (Node *) n;
***************
*** 10556,10561 ****
--- 10557,10563 ----
  					n->agg_star = FALSE;
  					n->agg_distinct = FALSE;
  					n->func_variadic = FALSE;
+ 					n->agg_filter = NULL;
  					n->over = NULL;
  					n->location = @2;
  					$$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~", $1, (Node *) n, @2);
***************
*** 10571,10576 ****
--- 10573,10579 ----
  					n->agg_star = FALSE;
  					n->agg_distinct = FALSE;
  					n->func_variadic = FALSE;
+ 					n->agg_filter = NULL;
  					n->over = NULL;
  					n->location = @2;
  					$$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~", $1, (Node *) n, @2);
***************
*** 10586,10591 ****
--- 10589,10595 ----
  					n->agg_star = FALSE;
  					n->agg_distinct = FALSE;
  					n->func_variadic = FALSE;
+ 					n->agg_filter = NULL;
  					n->over = NULL;
  					n->location = @2;
  					$$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~~*", $1, (Node *) n, @2);
***************
*** 10601,10606 ****
--- 10605,10611 ----
  					n->agg_star = FALSE;
  					n->agg_distinct = FALSE;
  					n->func_variadic = FALSE;
+ 					n->agg_filter = NULL;
  					n->over = NULL;
  					n->location = @2;
  					$$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~~*", $1, (Node *) n, @2);
***************
*** 10615,10620 ****
--- 10620,10626 ----
  					n->agg_star = FALSE;
  					n->agg_distinct = FALSE;
  					n->func_variadic = FALSE;
+ 					n->agg_filter = NULL;
  					n->over = NULL;
  					n->location = @2;
  					$$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~", $1, (Node *) n, @2);
***************
*** 10628,10633 ****
--- 10634,10640 ----
  					n->agg_star = FALSE;
  					n->agg_distinct = FALSE;
  					n->func_variadic = FALSE;
+ 					n->agg_filter = NULL;
  					n->over = NULL;
  					n->location = @2;
  					$$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "~", $1, (Node *) n, @2);
***************
*** 10641,10646 ****
--- 10648,10654 ----
  					n->agg_star = FALSE;
  					n->agg_distinct = FALSE;
  					n->func_variadic = FALSE;
+ 					n->agg_filter = NULL;
  					n->over = NULL;
  					n->location = @2;
  					$$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~", $1, (Node *) n, @2);
***************
*** 10654,10659 ****
--- 10662,10668 ----
  					n->agg_star = FALSE;
  					n->agg_distinct = FALSE;
  					n->func_variadic = FALSE;
+ 					n->agg_filter = NULL;
  					n->over = NULL;
  					n->location = @2;
  					$$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "!~", $1, (Node *) n, @2);
***************
*** 11006,11012 ****
  				}
  			| case_expr
  				{ $$ = $1; }
! 			| func_expr
  				{ $$ = $1; }
  			| select_with_parens			%prec UMINUS
  				{
--- 11015,11021 ----
  				}
  			| case_expr
  				{ $$ = $1; }
! 			| agg_func_expr
  				{ $$ = $1; }
  			| select_with_parens			%prec UMINUS
  				{
***************
*** 11087,11147 ****
   * legal in the backwards-compatible functional-index syntax for CREATE INDEX.
   * (Note that many of the special SQL functions wouldn't actually make any
   * sense as functional index entries, but we ignore that consideration here.)
!  */
! func_expr:	func_name '(' ')' filter_clause over_clause
! 				{
! 					FuncCall *n = makeNode(FuncCall);
! 					n->funcname = $1;
! 					n->args = NIL;
! 					n->agg_order = NIL;
! 					n->agg_star = FALSE;
! 					n->agg_distinct = FALSE;
! 					n->func_variadic = FALSE;
! 					n->agg_filter = $4;
! 					n->over = $5;
! 					n->location = @1;
! 					$$ = (Node *)n;
! 				}
! 			| func_name '(' func_arg_list ')' filter_clause over_clause
! 				{
! 					FuncCall *n = makeNode(FuncCall);
! 					n->funcname = $1;
! 					n->args = $3;
! 					n->agg_order = NIL;
! 					n->agg_star = FALSE;
! 					n->agg_distinct = FALSE;
! 					n->func_variadic = FALSE;
! 					n->agg_filter = $5;
! 					n->over = $6;
! 					n->location = @1;
! 					$$ = (Node *)n;
! 				}
! 			| func_name '(' VARIADIC func_arg_expr ')' filter_clause over_clause
! 				{
! 					FuncCall *n = makeNode(FuncCall);
! 					n->funcname = $1;
! 					n->args = list_make1($4);
! 					n->agg_order = NIL;
! 					n->agg_star = FALSE;
! 					n->agg_distinct = FALSE;
! 					n->func_variadic = TRUE;
! 					n->agg_filter = $6;
! 					n->over = $7;
! 					n->location = @1;
! 					$$ = (Node *)n;
! 				}
! 			| func_name '(' func_arg_list ',' VARIADIC func_arg_expr ')' filter_clause over_clause
! 				{
! 					FuncCall *n = makeNode(FuncCall);
! 					n->funcname = $1;
! 					n->args = lappend($3, $6);
! 					n->agg_order = NIL;
! 					n->agg_star = FALSE;
! 					n->agg_distinct = FALSE;
! 					n->func_variadic = TRUE;
! 					n->agg_filter = $8;
! 					n->over = $9;
! 					n->location = @1;
  					$$ = (Node *)n;
  				}
  			| func_name '(' func_arg_list sort_clause ')' filter_clause over_clause
--- 11096,11120 ----
   * legal in the backwards-compatible functional-index syntax for CREATE INDEX.
   * (Note that many of the special SQL functions wouldn't actually make any
   * sense as functional index entries, but we ignore that consideration here.)
!  *
!  * agg_func_expr is a superset of func_expr that includes all supported
!  * aggregate and window function syntaxes.  We allow that in c_expr, but not
!  * in index_elem or func_table, since aggregates and window functions aren't
!  * allowed in index expressions or in the FROM or USING clause of a query.
!  * This separation allows us to keep FILTER and OVER as unreserved keywords
!  * without shift/reduce conflicts that would otherwise result from subsequent
!  * alias clauses.
!  */
! func_expr:	func_call			{ $$ = $1; }
! 			| builtin_func		{ $$ = $1; }
! 		;
! 
! agg_func_expr:
! 			func_call filter_clause over_clause
! 				{
! 					FuncCall *n = (FuncCall *)$1;
! 					n->agg_filter = $2;
! 					n->over = $3;
  					$$ = (Node *)n;
  				}
  			| func_name '(' func_arg_list sort_clause ')' filter_clause over_clause
***************
*** 11214,11220 ****
  					n->location = @1;
  					$$ = (Node *)n;
  				}
! 			| COLLATION FOR '(' a_expr ')'
  				{
  					FuncCall *n = makeNode(FuncCall);
  					n->funcname = SystemFuncName("pg_collation_for");
--- 11187,11255 ----
  					n->location = @1;
  					$$ = (Node *)n;
  				}
! 			| builtin_func		{ $$ = $1; }
! 		;
! 
! func_call:	func_name '(' ')'
! 				{
! 					FuncCall *n = makeNode(FuncCall);
! 					n->funcname = $1;
! 					n->args = NIL;
! 					n->agg_order = NIL;
! 					n->agg_star = FALSE;
! 					n->agg_distinct = FALSE;
! 					n->func_variadic = FALSE;
! 					n->agg_filter = NULL;
! 					n->over = NULL;
! 					n->location = @1;
! 					$$ = (Node *)n;
! 				}
! 			| func_name '(' func_arg_list ')'
! 				{
! 					FuncCall *n = makeNode(FuncCall);
! 					n->funcname = $1;
! 					n->args = $3;
! 					n->agg_order = NIL;
! 					n->agg_star = FALSE;
! 					n->agg_distinct = FALSE;
! 					n->func_variadic = FALSE;
! 					n->agg_filter = NULL;
! 					n->over = NULL;
! 					n->location = @1;
! 					$$ = (Node *)n;
! 				}
! 			| func_name '(' VARIADIC func_arg_expr ')'
! 				{
! 					FuncCall *n = makeNode(FuncCall);
! 					n->funcname = $1;
! 					n->args = list_make1($4);
! 					n->agg_order = NIL;
! 					n->agg_star = FALSE;
! 					n->agg_distinct = FALSE;
! 					n->func_variadic = TRUE;
! 					n->agg_filter = NULL;
! 					n->over = NULL;
! 					n->location = @1;
! 					$$ = (Node *)n;
! 				}
! 			| func_name '(' func_arg_list ',' VARIADIC func_arg_expr ')'
! 				{
! 					FuncCall *n = makeNode(FuncCall);
! 					n->funcname = $1;
! 					n->args = lappend($3, $6);
! 					n->agg_order = NIL;
! 					n->agg_star = FALSE;
! 					n->agg_distinct = FALSE;
! 					n->func_variadic = TRUE;
! 					n->agg_filter = NULL;
! 					n->over = NULL;
! 					n->location = @1;
! 					$$ = (Node *)n;
! 				}
! 		;
! 
! builtin_func:
! 			COLLATION FOR '(' a_expr ')'
  				{
  					FuncCall *n = makeNode(FuncCall);
  					n->funcname = SystemFuncName("pg_collation_for");
***************
*** 11223,11228 ****
--- 11258,11264 ----
  					n->agg_star = FALSE;
  					n->agg_distinct = FALSE;
  					n->func_variadic = FALSE;
+ 					n->agg_filter = NULL;
  					n->over = NULL;
  					n->location = @1;
  					$$ = (Node *)n;
***************
*** 11284,11289 ****
--- 11320,11326 ----
  					n->agg_star = FALSE;
  					n->agg_distinct = FALSE;
  					n->func_variadic = FALSE;
+ 					n->agg_filter = NULL;
  					n->over = NULL;
  					n->location = @1;
  					$$ = (Node *)n;
***************
*** 11356,11361 ****
--- 11393,11399 ----
  					n->agg_star = FALSE;
  					n->agg_distinct = FALSE;
  					n->func_variadic = FALSE;
+ 					n->agg_filter = NULL;
  					n->over = NULL;
  					n->location = @1;
  					$$ = (Node *)n;
***************
*** 11369,11374 ****
--- 11407,11413 ----
  					n->agg_star = FALSE;
  					n->agg_distinct = FALSE;
  					n->func_variadic = FALSE;
+ 					n->agg_filter = NULL;
  					n->over = NULL;
  					n->location = @1;
  					$$ = (Node *)n;
***************
*** 11382,11387 ****
--- 11421,11427 ----
  					n->agg_star = FALSE;
  					n->agg_distinct = FALSE;
  					n->func_variadic = FALSE;
+ 					n->agg_filter = NULL;
  					n->over = NULL;
  					n->location = @1;
  					$$ = (Node *)n;
***************
*** 11395,11400 ****
--- 11435,11441 ----
  					n->agg_star = FALSE;
  					n->agg_distinct = FALSE;
  					n->func_variadic = FALSE;
+ 					n->agg_filter = NULL;
  					n->over = NULL;
  					n->location = @1;
  					$$ = (Node *)n;
***************
*** 11408,11413 ****
--- 11449,11455 ----
  					n->agg_star = FALSE;
  					n->agg_distinct = FALSE;
  					n->func_variadic = FALSE;
+ 					n->agg_filter = NULL;
  					n->over = NULL;
  					n->location = @1;
  					$$ = (Node *)n;
***************
*** 11421,11426 ****
--- 11463,11469 ----
  					n->agg_star = FALSE;
  					n->agg_distinct = FALSE;
  					n->func_variadic = FALSE;
+ 					n->agg_filter = NULL;
  					n->over = NULL;
  					n->location = @1;
  					$$ = (Node *)n;
***************
*** 11436,11441 ****
--- 11479,11485 ----
  					n->agg_star = FALSE;
  					n->agg_distinct = FALSE;
  					n->func_variadic = FALSE;
+ 					n->agg_filter = NULL;
  					n->over = NULL;
  					n->location = @1;
  					$$ = (Node *)n;
***************
*** 11454,11459 ****
--- 11498,11504 ----
  					n->agg_star = FALSE;
  					n->agg_distinct = FALSE;
  					n->func_variadic = FALSE;
+ 					n->agg_filter = NULL;
  					n->over = NULL;
  					n->location = @1;
  					$$ = (Node *)n;
***************
*** 11468,11473 ****
--- 11513,11519 ----
  					n->agg_star = FALSE;
  					n->agg_distinct = FALSE;
  					n->func_variadic = FALSE;
+ 					n->agg_filter = NULL;
  					n->over = NULL;
  					n->location = @1;
  					$$ = (Node *)n;
***************
*** 11484,11489 ****
--- 11530,11536 ----
  					n->agg_star = FALSE;
  					n->agg_distinct = FALSE;
  					n->func_variadic = FALSE;
+ 					n->agg_filter = NULL;
  					n->over = NULL;
  					n->location = @1;
  					$$ = (Node *)n;
***************
*** 11506,11511 ****
--- 11553,11559 ----
  					n->agg_star = FALSE;
  					n->agg_distinct = FALSE;
  					n->func_variadic = FALSE;
+ 					n->agg_filter = NULL;
  					n->over = NULL;
  					n->location = @1;
  					$$ = (Node *)n;
***************
*** 11522,11527 ****
--- 11570,11576 ----
  					n->agg_star = FALSE;
  					n->agg_distinct = FALSE;
  					n->func_variadic = FALSE;
+ 					n->agg_filter = NULL;
  					n->over = NULL;
  					n->location = @1;
  					$$ = (Node *)n;
***************
*** 11535,11540 ****
--- 11584,11590 ----
  					n->agg_star = FALSE;
  					n->agg_distinct = FALSE;
  					n->func_variadic = FALSE;
+ 					n->agg_filter = NULL;
  					n->over = NULL;
  					n->location = @1;
  					$$ = (Node *)n;
***************
*** 11548,11553 ****
--- 11598,11604 ----
  					n->agg_star = FALSE;
  					n->agg_distinct = FALSE;
  					n->func_variadic = FALSE;
+ 					n->agg_filter = NULL;
  					n->over = NULL;
  					n->location = @1;
  					$$ = (Node *)n;
***************
*** 11561,11566 ****
--- 11612,11618 ----
  					n->agg_star = FALSE;
  					n->agg_distinct = FALSE;
  					n->func_variadic = FALSE;
+ 					n->agg_filter = NULL;
  					n->over = NULL;
  					n->location = @1;
  					$$ = (Node *)n;
***************
*** 11623,11628 ****
--- 11675,11681 ----
  					n->agg_star = FALSE;
  					n->agg_distinct = FALSE;
  					n->func_variadic = FALSE;
+ 					n->agg_filter = NULL;
  					n->over = NULL;
  					n->location = @1;
  					$$ = (Node *)n;
***************
*** 12740,12745 ****
--- 12793,12799 ----
  			| EXTENSION
  			| EXTERNAL
  			| FAMILY
+ 			| FILTER
  			| FIRST_P
  			| FOLLOWING
  			| FORCE
***************
*** 12808,12813 ****
--- 12862,12868 ----
  			| OPERATOR
  			| OPTION
  			| OPTIONS
+ 			| OVER
  			| OWNED
  			| OWNER
  			| PARSER
***************
*** 12994,13000 ****
  			| CONCURRENTLY
  			| CROSS
  			| CURRENT_SCHEMA
- 			| FILTER
  			| FREEZE
  			| FULL
  			| ILIKE
--- 13049,13054 ----
***************
*** 13007,13013 ****
  			| NATURAL
  			| NOTNULL
  			| OUTER_P
- 			| OVER
  			| OVERLAPS
  			| RIGHT
  			| SIMILAR
--- 13061,13066 ----
***************
*** 13309,13314 ****
--- 13362,13368 ----
  	n->agg_star = FALSE;
  	n->agg_distinct = FALSE;
  	n->func_variadic = FALSE;
+ 	n->agg_filter = NULL;
  	n->over = NULL;
  	n->location = location;
  	return n;
