diff -ur -x '*.o' ../cvs-pgsql/src/backend/parser/gram.y src/backend/parser/gram.y --- ../cvs-pgsql/src/backend/parser/gram.y 2008-10-15 14:19:39.000000000 +0300 +++ src/backend/parser/gram.y 2008-10-20 11:39:31.000000000 +0300 @@ -308,6 +308,8 @@ %type reindex_type drop_type comment_type %type fetch_direction select_limit_value select_offset_value + select_offset_value2 opt_select_fetch_first_value +%type row_or_rows first_or_next %type OptSeqOptList SeqOptList %type SeqOptElem @@ -6575,6 +6577,13 @@ errhint("Use separate LIMIT and OFFSET clauses."), scanner_errposition(@1))); } + /* SQL:2008 syntax variants */ + | OFFSET select_offset_value2 row_or_rows + { $$ = list_make2($2, NULL); } + | FETCH first_or_next opt_select_fetch_first_value row_or_rows ONLY + { $$ = list_make2(NULL, $3); } + | OFFSET select_offset_value2 row_or_rows FETCH first_or_next opt_select_fetch_first_value row_or_rows ONLY + { $$ = list_make2($2, $6); } ; opt_select_limit: @@ -6592,10 +6601,28 @@ } ; +opt_select_fetch_first_value: + SignedIconst { $$ = makeIntConst($1, @1); } + | '(' a_expr ')' { $$ = $2; } + | /*EMPTY*/ { $$ = makeIntConst(1, @$); } + ; + select_offset_value: a_expr { $$ = $1; } ; +select_offset_value2: + c_expr { $$ = $1; } + ; + +row_or_rows: + ROW { $$ = 0; } + | ROWS { $$ = 0; } + +first_or_next: + FIRST_P { $$ = 0; } + | NEXT { $$ = 0; } + group_clause: GROUP_P BY expr_list { $$ = $3; } | /*EMPTY*/ { $$ = NIL; } @@ -9214,6 +9241,7 @@ RoleId: ColId { $$ = $1; }; SignedIconst: ICONST { $$ = $1; } + | '+' ICONST { $$ = + $2; } | '-' ICONST { $$ = - $2; } ; @@ -9346,7 +9374,6 @@ | EXPLAIN | EXTERNAL | FAMILY - | FETCH | FIRST_P | FORCE | FORWARD @@ -9636,6 +9663,7 @@ | END_P | EXCEPT | FALSE_P + | FETCH | FOR | FOREIGN | FROM diff -ur -x '*.o' ../cvs-pgsql/src/backend/parser/keywords.c src/backend/parser/keywords.c --- ../cvs-pgsql/src/backend/parser/keywords.c 2008-10-15 14:19:39.000000000 +0300 +++ src/backend/parser/keywords.c 2008-10-19 22:27:28.000000000 +0300 @@ -165,7 +165,7 @@ {"extract", EXTRACT, COL_NAME_KEYWORD}, {"false", FALSE_P, RESERVED_KEYWORD}, {"family", FAMILY, UNRESERVED_KEYWORD}, - {"fetch", FETCH, UNRESERVED_KEYWORD}, + {"fetch", FETCH, RESERVED_KEYWORD}, {"first", FIRST_P, UNRESERVED_KEYWORD}, {"float", FLOAT_P, COL_NAME_KEYWORD}, {"for", FOR, RESERVED_KEYWORD},