Thread: pgsql crollable cursor doesn't support one form of postgresql's cursors
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
> >"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/
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. +
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
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/
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
> >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/