*** ./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 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 ExclusionConstraintList ExclusionConstraintElem %type func_arg_list %type func_arg_expr --- 403,409 ---- %type 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 ExclusionConstraintList ExclusionConstraintElem %type func_arg_list %type 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;