Hello,
this small patch allows using updatable cursors in plpgsql.
Regards
Pavel Stehule
*** ./gram.y.orig 2007-06-11 10:43:09.000000000 +0200
--- ./gram.y 2007-06-11 11:48:03.000000000 +0200
***************
*** 44,49 ****
--- 44,50 ----
static void plpgsql_sql_error_callback(void *arg);
static void check_labels(const char *start_label,
const char *end_label);
+ static void check_cursor_variable(void);
%}
***************
*** 155,160 ****
--- 156,162 ----
%token K_CLOSE
%token K_CONSTANT
%token K_CONTINUE
+ %token K_CURRENTOF
%token K_CURSOR
%token K_DEBUG
%token K_DECLARE
***************
*** 1527,1543 ****
cursor_variable : T_SCALAR
{
! if (yylval.scalar->dtype != PLPGSQL_DTYPE_VAR)
! yyerror("cursor variable must be a simple variable");
!
! if (((PLpgSQL_var *) yylval.scalar)->datatype->typoid != REFCURSOROID)
! {
! plpgsql_error_lineno = plpgsql_scanner_lineno();
! ereport(ERROR,
! (errcode(ERRCODE_DATATYPE_MISMATCH),
! errmsg("\"%s\" must be of type cursor or refcursor",
! ((PLpgSQL_var *) yylval.scalar)->refname)));
! }
$$ = (PLpgSQL_var *) yylval.scalar;
}
;
--- 1529,1535 ----
cursor_variable : T_SCALAR
{
! check_cursor_variable();
$$ = (PLpgSQL_var *) yylval.scalar;
}
;
***************
*** 1923,1928 ****
--- 1915,1937 ----
return result;
}
+
+ static void
+ check_cursor_variable(void)
+ {
+ if (yylval.scalar->dtype != PLPGSQL_DTYPE_VAR)
+ yyerror("cursor variable must be a simple variable");
+
+ if (((PLpgSQL_var *) yylval.scalar)->datatype->typoid != REFCURSOROID)
+ {
+ plpgsql_error_lineno = plpgsql_scanner_lineno();
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("\"%s\" must be of type cursor or refcursor",
+ ((PLpgSQL_var *) yylval.scalar)->refname)));
+ }
+ }
+
static PLpgSQL_stmt *
make_execsql_stmt(const char *sqlstart, int lineno)
{
***************
*** 1982,1987 ****
--- 1991,2004 ----
params, &nparams));
plpgsql_dstring_append(&ds, buf);
break;
+
+ case K_CURRENTOF:
+ if (yylex() != T_SCALAR)
+ yyerror("missing cursor variable");
+ check_cursor_variable();
+ plpgsql_dstring_append(&ds, " CURRENT OF ");
+ plpgsql_dstring_append(&ds, yytext);
+ break;
default:
plpgsql_dstring_append(&ds, yytext);
*** ./scan.l.orig 2007-06-11 10:43:05.000000000 +0200
--- ./scan.l 2007-06-11 11:48:40.000000000 +0200
***************
*** 119,124 ****
--- 119,125 ----
constant { return K_CONSTANT; }
continue { return K_CONTINUE; }
cursor { return K_CURSOR; }
+ current{space}+of { return K_CURRENTOF; }
debug { return K_DEBUG; }
declare { return K_DECLARE; }
default { return K_DEFAULT; }
---------------------------(end of broadcast)---------------------------
TIP 7: You can help support the PostgreSQL project by donating at
http://www.postgresql.org/about/donate