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

Started by Pavel Stehulealmost 19 years ago8 messageshackers
Jump to latest
#1Pavel Stehule
pavel.stehule@gmail.com

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/

#2Tom Lane
tgl@sss.pgh.pa.us
In reply to: Pavel Stehule (#1)
Re: pgsql crollable cursor doesn't support one form of postgresql's cursors

"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

#3Pavel Stehule
pavel.stehule@gmail.com
In reply to: Tom Lane (#2)
Re: pgsql crollable cursor doesn't support one form of postgresql's cu

"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/

#4Bruce Momjian
bruce@momjian.us
In reply to: Pavel Stehule (#3)
Re: pgsql crollable cursor doesn't support one form of postgresql's cu

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. +

#5Neil Conway
neilc@samurai.com
In reply to: Bruce Momjian (#4)
Re: pgsql crollable cursor doesn't support one form of postgresql's cu

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

#6Pavel Stehule
pavel.stehule@gmail.com
In reply to: Neil Conway (#5)
Re: pgsql crollable cursor doesn't support one form ofpostgresql's cu

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/

#7Neil Conway
neilc@samurai.com
In reply to: Pavel Stehule (#6)
Re: pgsql crollable cursor doesn't support one form ofpostgresql's cu

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

#8Pavel Stehule
pavel.stehule@gmail.com
In reply to: Neil Conway (#7)
Re: pgsql crollable cursor doesn't support one formofpostgresql's cu

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/