Thread: pgsql crollable cursor doesn't support one form of postgresql's cursors

pgsql crollable cursor doesn't support one form of postgresql's cursors

From
"Pavel Stehule"
Date:
Hello,

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. It's need small fix. I am 
sorry.

Regards
Pavel Stehule

_________________________________________________________________
Chcete sdilet sve obrazky a hudbu s prateli? http://messenger.msn.cz/



"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.
        regards, tom lane


Re: pgsql crollable cursor doesn't support one form of postgresql's cu

From
"Pavel Stehule"
Date:
>
>"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/



Re: pgsql crollable cursor doesn't support one form of postgresql's cu

From
Bruce Momjian
Date:
Your patch has been added to the PostgreSQL unapplied patches list at:
http://momjian.postgresql.org/cgi-bin/pgpatches

It will be applied as soon as one of the PostgreSQL committers reviews
and approves it.

---------------------------------------------------------------------------


Pavel Stehule wrote:
> >
> >"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/
> 
> 
> ---------------------------(end of broadcast)---------------------------
> TIP 1: if posting/reading through Usenet, please send an appropriate
>        subscribe-nomail command to majordomo@postgresql.org so that your
>        message can get through to the mailing list cleanly

--  Bruce Momjian  <bruce@momjian.us>          http://momjian.us EnterpriseDB
http://www.enterprisedb.com
 + If your life is a hard drive, Christ can be your backup. +


Re: pgsql crollable cursor doesn't support one form of postgresql's cu

From
Neil Conway
Date:
I haven't read the rest of the thread yet, but is this hunk not buggy?
yylex() is side-effecting, so the two calls to yylex() do not do what
the comment suggests.

> *** 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;

-Neil




Re: pgsql crollable cursor doesn't support one form ofpostgresql's cu

From
"Pavel Stehule"
Date:
Hello,

it's true. There is bug. I'll send actualised version tomorrow.

Regards
Pavel

>I haven't read the rest of the thread yet, but is this hunk not buggy?
>yylex() is side-effecting, so the two calls to yylex() do not do what
>the comment suggests.
>
> >
> > !     /* check FROM or IN keyword after direction's specification */
> > !     if (check_FROM && (yylex() != K_FROM && yylex() != K_IN))
> > !             yyerror("expected \"FROM/IN\"");
> >
> >       return fetch;
>
>-Neil
>
>

_________________________________________________________________
Emotikony a pozadi programu MSN Messenger ozivi vasi konverzaci. 
http://messenger.msn.cz/



Re: pgsql crollable cursor doesn't support one form ofpostgresql's cu

From
Neil Conway
Date:
On Fri, 2007-04-27 at 07:36 +0200, Pavel Stehule wrote:
> it's true. There is bug. I'll send actualised version tomorrow.

No need: I fixed the bug and applied the patch. Thanks for the patch.

-Neil




Re: pgsql crollable cursor doesn't support one formofpostgresql's cu

From
"Pavel Stehule"
Date:
>
>On Fri, 2007-04-27 at 07:36 +0200, Pavel Stehule wrote:
> > it's true. There is bug. I'll send actualised version tomorrow.
>
>No need: I fixed the bug and applied the patch. Thanks for the patch.
>
>-Neil
>

Thank you

Pavel

_________________________________________________________________
Citite se osamele? Poznejte nekoho vyjmecneho diky Match.com. 
http://www.msn.cz/