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/