Re: pgsql crollable cursor doesn't support one form of postgresql's cu - Mailing list pgsql-hackers

From Pavel Stehule
Subject Re: pgsql crollable cursor doesn't support one form of postgresql's cu
Date
Msg-id BAY20-F252869E03AEC7189F6AEEAF9560@phx.gbl
Whole thread Raw
In response to Re: pgsql crollable cursor doesn't support one form of postgresql's cursors  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: pgsql crollable cursor doesn't support one form of postgresql's cu
List pgsql-hackers
>
>"Pavel Stehule" <pavel.stehule@hotmail.com> writes:
> > I found one unsupported form plpgsql's fetch statement which is  
>supported
> > by postgresql.
>
> > PostgreSQL knows
> > FETCH 3 FROM ....
>
> > but plpgsql needs everytime direction's keyword.
>
>No, I think that's OK, because that form specifies fetching 3 rows,
>which plpgsql's FETCH doesn't support.
>

it's true. There is same question for move statement too. Other difference 
is unsupported keyword IN.

It can be fixed:

*** ./gram.y.orig    2007-04-19 20:27:17.000000000 +0200
--- ./gram.y    2007-04-19 20:41:16.000000000 +0200
***************
*** 2059,2071 ****     else if (pg_strcasecmp(yytext, "absolute") == 0)     {         fetch->direction =
FETCH_ABSOLUTE;
!         fetch->expr = plpgsql_read_expression(K_FROM, "FROM");         check_FROM = false;     }     else if
(pg_strcasecmp(yytext,"relative") == 0)     {         fetch->direction = FETCH_RELATIVE;
 
!         fetch->expr = plpgsql_read_expression(K_FROM, "FROM");         check_FROM = false;     }     else if
(pg_strcasecmp(yytext,"forward") == 0)
 
--- 2059,2071 ----     else if (pg_strcasecmp(yytext, "absolute") == 0)     {         fetch->direction =
FETCH_ABSOLUTE;
!         fetch->expr = read_sql_construct(K_FROM, K_IN, "FROM/IN", "SELECT ", 
true, true, NULL);         check_FROM = false;     }     else if (pg_strcasecmp(yytext, "relative") == 0)     {
fetch->direction= FETCH_RELATIVE;
 
!         fetch->expr = read_sql_construct(K_FROM, K_IN, "FROM/IN", "SELECT ", 
true, true, NULL);         check_FROM = false;     }     else if (pg_strcasecmp(yytext, "forward") == 0)
***************
*** 2076,2081 ****
--- 2076,2087 ----     {         fetch->direction = FETCH_BACKWARD;     }
+     else if (tok != T_SCALAR)
+     {
+         plpgsql_push_back_token(tok);
+         fetch->expr = read_sql_construct(K_FROM, K_IN, "FROM/IN", "SELECT ", 
true, true, NULL);
+         check_FROM = false;
+     }     else     {         /* Assume there's no direction clause */
***************
*** 2083,2091 ****         check_FROM = false;     }

!     /* check FROM keyword after direction's specification */
!     if (check_FROM && yylex() != K_FROM)
!         yyerror("expected \"FROM\"");
     return fetch; }
--- 2089,2097 ----         check_FROM = false;     }

!     /* check FROM or IN keyword after direction's specification */
!     if (check_FROM && (yylex() != K_FROM && yylex() != K_IN))
!         yyerror("expected \"FROM/IN\"");
     return fetch; }

Regards
Pavel Stehule

_________________________________________________________________
Najdete si svou lasku a nove pratele na Match.com. http://www.msn.cz/



pgsql-hackers by date:

Previous
From: Tom Lane
Date:
Subject: Re: pgsql crollable cursor doesn't support one form of postgresql's cursors
Next
From: Koichi Suzuki
Date:
Subject: Re: [PATCHES] Full page writes improvement, code update