Re: [BUGS] BUG #4516: FOUND variable does not work after RETURN QUERY

2009-02-05 Thread Bruce Momjian
Pavel Stehule wrote:
> I am sending patch, that adds FOUND and GET DIAGNOSTICS support for
> RETURN QUERY statement

Updated patch attached and applied.  Thanks.

---


> 
> Regards
> Pavel Stehule
> 
> 
> 
> 2008/11/10 Andrew Gierth :
> >> "Pavel" == "Pavel Stehule"  writes:
> >
> >  >> Well, changing the semantics of an already-released statement
> >  >> carries a risk of breaking existing apps that aren't expecting it
> >  >> to change FOUND.  So I'd want to see a pretty strong case why this
> >  >> is important --- not just that it didn't meet someone's
> >  >> didn't-read-the-manual expectation.
> >
> >  Pavel> It's should do some problems, but I belive much less than
> >  Pavel> change of casting or tsearch2 integration. And actually it's
> >  Pavel> not ortogonal.  Every not dynamic statement change FOUND
> >  Pavel> variable.
> >
> > Regardless of what you think of FOUND, a more serious problem is this:
> >
> > postgres=# create function test(n integer) returns setof integer language 
> > plpgsql
> >  as $f$
> >declare
> >  rc bigint;
> >begin
> >  return query (select i from generate_series(1,n) i);
> >  get diagnostics rc = row_count;
> >  raise notice 'rc = %',rc;
> >end;
> > $f$;
> > CREATE FUNCTION
> > postgres=# select test(3);
> > NOTICE:  rc = 0
> >  test
> > --
> >1
> >2
> >3
> > (3 rows)
> >
> > Since GET DIAGNOSTICS is documented as working for every SQL query
> > executed in the function, rather than for a specific list of
> > constructs, this is clearly a bug.
> >
> > --
> > Andrew (irc:RhodiumToad)
> >
> > --
> > Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
> > To make changes to your subscription:
> > http://www.postgresql.org/mailpref/pgsql-bugs
> >

[ Attachment, skipping... ]

> 
> -- 
> Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-bugs

-- 
  Bruce Momjian  http://momjian.us
  EnterpriseDB http://enterprisedb.com

  + If your life is a hard drive, Christ can be your backup. +
Index: doc/src/sgml/plpgsql.sgml
===
RCS file: /cvsroot/pgsql/doc/src/sgml/plpgsql.sgml,v
retrieving revision 1.137
diff -c -c -r1.137 plpgsql.sgml
*** doc/src/sgml/plpgsql.sgml	4 Feb 2009 21:30:41 -	1.137
--- doc/src/sgml/plpgsql.sgml	5 Feb 2009 15:15:03 -
***
*** 1356,1361 
--- 1356,1369 
  execution of other statements within the loop body.
 

+   
+
+ A RETURN QUERY and RETURN QUERY
+ EXECUTE statements set FOUND
+ true if the query returns at least one row, false if no row
+ is returned.
+
+   
   
  
   FOUND is a local variable within each
Index: src/pl/plpgsql/src/pl_exec.c
===
RCS file: /cvsroot/pgsql/src/pl/plpgsql/src/pl_exec.c,v
retrieving revision 1.231
diff -c -c -r1.231 pl_exec.c
*** src/pl/plpgsql/src/pl_exec.c	21 Jan 2009 11:13:14 -	1.231
--- src/pl/plpgsql/src/pl_exec.c	5 Feb 2009 15:15:03 -
***
*** 2286,2291 
--- 2286,2292 
  	   PLpgSQL_stmt_return_query *stmt)
  {
  	Portal		portal;
+ 	uint32			processed = 0;
  
  	if (!estate->retisset)
  		ereport(ERROR,
***
*** 2327,2332 
--- 2328,2334 
  			HeapTuple	tuple = SPI_tuptable->vals[i];
  
  			tuplestore_puttuple(estate->tuple_store, tuple);
+ 			processed++;
  		}
  		MemoryContextSwitchTo(old_cxt);
  
***
*** 2336,2341 
--- 2338,2346 
  	SPI_freetuptable(SPI_tuptable);
  	SPI_cursor_close(portal);
  
+ 	estate->eval_processed = processed;
+ 	exec_set_found(estate, processed != 0);
+ 
  	return PLPGSQL_RC_OK;
  }
  
Index: src/test/regress/expected/plpgsql.out
===
RCS file: /cvsroot/pgsql/src/test/regress/expected/plpgsql.out,v
retrieving revision 1.66
diff -c -c -r1.66 plpgsql.out
*** src/test/regress/expected/plpgsql.out	18 Jul 2008 03:32:53 -	1.66
--- src/test/regress/expected/plpgsql.out	5 Feb 2009 15:15:03 -
***
*** 3666,3668 
--- 3666,3700 
  (2 rows)
  
  drop function tftest(int);
+ create or replace function rttest()
+ returns setof int as $$
+ declare rc int;
+ begin
+   return query values(10),(20);
+   get diagnostics rc = row_count;
+   raise notice '% %', found, rc;
+   return query select * from (values(10),(20)) f(a) where false;
+   get diagnostics rc = row_count;
+   raise notice '% %', found, rc;
+   return query execute 'values(10),(20)';
+   get diagnostics rc = row_count;
+   raise notice '% %', found, rc;
+   return query execute 'select * from (values(10),(20)) f(a) where false';
+   get diagnostics r

Re: [BUGS] BUG #4516: FOUND variable does not work after RETURN QUERY

2008-11-13 Thread Pavel Stehule
I am sending patch, that adds FOUND and GET DIAGNOSTICS support for
RETURN QUERY statement

Regards
Pavel Stehule



2008/11/10 Andrew Gierth <[EMAIL PROTECTED]>:
>> "Pavel" == "Pavel Stehule" <[EMAIL PROTECTED]> writes:
>
>  >> Well, changing the semantics of an already-released statement
>  >> carries a risk of breaking existing apps that aren't expecting it
>  >> to change FOUND.  So I'd want to see a pretty strong case why this
>  >> is important --- not just that it didn't meet someone's
>  >> didn't-read-the-manual expectation.
>
>  Pavel> It's should do some problems, but I belive much less than
>  Pavel> change of casting or tsearch2 integration. And actually it's
>  Pavel> not ortogonal.  Every not dynamic statement change FOUND
>  Pavel> variable.
>
> Regardless of what you think of FOUND, a more serious problem is this:
>
> postgres=# create function test(n integer) returns setof integer language 
> plpgsql
>  as $f$
>declare
>  rc bigint;
>begin
>  return query (select i from generate_series(1,n) i);
>  get diagnostics rc = row_count;
>  raise notice 'rc = %',rc;
>end;
> $f$;
> CREATE FUNCTION
> postgres=# select test(3);
> NOTICE:  rc = 0
>  test
> --
>1
>2
>3
> (3 rows)
>
> Since GET DIAGNOSTICS is documented as working for every SQL query
> executed in the function, rather than for a specific list of
> constructs, this is clearly a bug.
>
> --
> Andrew (irc:RhodiumToad)
>
> --
> Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-bugs
>
*** ./doc/src/sgml/plpgsql.sgml.orig	2008-11-13 11:44:57.0 +0100
--- ./doc/src/sgml/plpgsql.sgml	2008-11-13 11:48:39.0 +0100
***
*** 1356,1361 
--- 1356,1368 
  execution of other statements within the loop body.
 

+ 	  
+ 	
+ 	  A RETURN QUERY and RETURN QUERY 
+ 	  EXECUTE statements sets FOUND
+ 	  true if query returns least one row.
+ 	
+ 	  
   
  
   FOUND is a local variable within each
*** ./src/pl/plpgsql/src/pl_exec.c.orig	2008-11-13 10:53:37.0 +0100
--- ./src/pl/plpgsql/src/pl_exec.c	2008-11-13 11:29:24.0 +0100
***
*** 2285,2290 
--- 2285,2291 
  	   PLpgSQL_stmt_return_query *stmt)
  {
  	Portal		portal;
+ 	uint32			processed = 0;
  
  	if (!estate->retisset)
  		ereport(ERROR,
***
*** 2326,2331 
--- 2327,2333 
  			HeapTuple	tuple = SPI_tuptable->vals[i];
  
  			tuplestore_puttuple(estate->tuple_store, tuple);
+ 			processed++;
  		}
  		MemoryContextSwitchTo(old_cxt);
  
***
*** 2335,2340 
--- 2337,2345 
  	SPI_freetuptable(SPI_tuptable);
  	SPI_cursor_close(portal);
  
+ 	estate->eval_processed = processed;
+ 	exec_set_found(estate, processed != 0);
+ 
  	return PLPGSQL_RC_OK;
  }
  
*** ./src/test/regress/expected/plpgsql.out.orig	2008-11-13 11:44:34.0 +0100
--- ./src/test/regress/expected/plpgsql.out	2008-11-13 11:42:56.0 +0100
***
*** 3666,3668 
--- 3666,3700 
  (2 rows)
  
  drop function tftest(int);
+ create or replace function rttest()
+ returns setof int as $$
+ declare rc int;
+ begin
+   return query values(10),(20);
+   get diagnostics rc = row_count;
+   raise notice '% %', found, rc;
+   return query select * from (values(10),(20)) f(a) where false;
+   get diagnostics rc = row_count;
+   raise notice '% %', found, rc;
+   return query execute 'values(10),(20)';
+   get diagnostics rc = row_count;
+   raise notice '% %', found, rc;
+   return query execute 'select * from (values(10),(20)) f(a) where false';
+   get diagnostics rc = row_count;
+   raise notice '% %', found, rc;
+ end;
+ $$ language plpgsql;
+ select * from rttest();
+ NOTICE:  t 2
+ NOTICE:  f 0
+ NOTICE:  t 2
+ NOTICE:  f 0
+  rttest 
+ 
+  10
+  20
+  10
+  20
+ (4 rows)
+ 
+ drop function rttest();
*** ./src/test/regress/sql/plpgsql.sql.orig	2008-11-13 11:32:17.0 +0100
--- ./src/test/regress/sql/plpgsql.sql	2008-11-13 11:41:20.0 +0100
***
*** 2948,2950 
--- 2948,2974 
  select * from tftest(10);
  
  drop function tftest(int);
+ 
+ create or replace function rttest()
+ returns setof int as $$
+ declare rc int;
+ begin
+   return query values(10),(20);
+   get diagnostics rc = row_count;
+   raise notice '% %', found, rc;
+   return query select * from (values(10),(20)) f(a) where false;
+   get diagnostics rc = row_count;
+   raise notice '% %', found, rc;
+   return query execute 'values(10),(20)';
+   get diagnostics rc = row_count;
+   raise notice '% %', found, rc;
+   return query execute 'select * from (values(10),(20)) f(a) where false';
+   get diagnostics rc = row_count;
+   raise notice '% %', found, rc;
+ end;
+ $$ language plpgsql;
+ 
+ select * from rttest();
+ 
+ drop function rttest();
+ 

-- 
Sent via pgsql-bugs mailing list (pg

Re: [BUGS] BUG #4516: FOUND variable does not work after RETURN QUERY

2008-11-10 Thread Andrew Gierth
> "Pavel" == "Pavel Stehule" <[EMAIL PROTECTED]> writes:

 >> Well, changing the semantics of an already-released statement
 >> carries a risk of breaking existing apps that aren't expecting it
 >> to change FOUND.  So I'd want to see a pretty strong case why this
 >> is important --- not just that it didn't meet someone's
 >> didn't-read-the-manual expectation.

 Pavel> It's should do some problems, but I belive much less than
 Pavel> change of casting or tsearch2 integration. And actually it's
 Pavel> not ortogonal.  Every not dynamic statement change FOUND
 Pavel> variable.

Regardless of what you think of FOUND, a more serious problem is this:

postgres=# create function test(n integer) returns setof integer language 
plpgsql
  as $f$
declare
  rc bigint;
begin
  return query (select i from generate_series(1,n) i);
  get diagnostics rc = row_count;
  raise notice 'rc = %',rc;
end;
$f$;
CREATE FUNCTION
postgres=# select test(3);
NOTICE:  rc = 0
 test 
--
1
2
3
(3 rows)

Since GET DIAGNOSTICS is documented as working for every SQL query
executed in the function, rather than for a specific list of
constructs, this is clearly a bug.

-- 
Andrew (irc:RhodiumToad)

-- 
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs


Re: [BUGS] BUG #4516: FOUND variable does not work after RETURN QUERY

2008-11-06 Thread Pavel Stehule
2008/11/6 Tom Lane <[EMAIL PROTECTED]>:
> "Pavel Stehule" <[EMAIL PROTECTED]> writes:
>> 2008/11/6 Tom Lane <[EMAIL PROTECTED]>:
>>> RETURN isn't one of them.
>
>> It should be enhanced - my initial proposal of return query expected
>> so return query is last statement, that isn't now. So we could add
>> this check there.
>
> Well, changing the semantics of an already-released statement carries a
> risk of breaking existing apps that aren't expecting it to change FOUND.
> So I'd want to see a pretty strong case why this is important --- not
> just that it didn't meet someone's didn't-read-the-manual expectation.
>

It's should do some problems, but I belive much less than change of
casting or tsearch2 integration. And actually it's not ortogonal.
Every not dynamic statement change FOUND variable.

regards
Pavel Stehule


>regards, tom lane
>

-- 
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs


Re: [BUGS] BUG #4516: FOUND variable does not work after RETURN QUERY

2008-11-06 Thread Tom Lane
"Pavel Stehule" <[EMAIL PROTECTED]> writes:
> 2008/11/6 Tom Lane <[EMAIL PROTECTED]>:
>> RETURN isn't one of them.

> It should be enhanced - my initial proposal of return query expected
> so return query is last statement, that isn't now. So we could add
> this check there.

Well, changing the semantics of an already-released statement carries a
risk of breaking existing apps that aren't expecting it to change FOUND.
So I'd want to see a pretty strong case why this is important --- not
just that it didn't meet someone's didn't-read-the-manual expectation.

regards, tom lane

-- 
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs


Re: [BUGS] BUG #4516: FOUND variable does not work after RETURN QUERY

2008-11-06 Thread Pavel Stehule
Hello

2008/11/6 Tom Lane <[EMAIL PROTECTED]>:
> "Michal szymanski" <[EMAIL PROTECTED]> writes:
>> Description:FOUND variable does not work after RETURN QUERY
>
> The list of statements that set FOUND is here:
> http://www.postgresql.org/docs/8.3/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-DIAGNOSTICS
>
> RETURN isn't one of them.
>
>regards, tom lane
>

It should be enhanced - my initial proposal of return query expected
so return query is last statement, that isn't now. So we could add
this check there.

regards
Pavel Stehule

> --
> Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
> To make changes to your subscription:
> http://www.postgresql.org/mailpref/pgsql-bugs
>

-- 
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs


Re: [BUGS] BUG #4516: FOUND variable does not work after RETURN QUERY

2008-11-06 Thread Tom Lane
"Michal szymanski" <[EMAIL PROTECTED]> writes:
> Description:FOUND variable does not work after RETURN QUERY

The list of statements that set FOUND is here:
http://www.postgresql.org/docs/8.3/static/plpgsql-statements.html#PLPGSQL-STATEMENTS-DIAGNOSTICS

RETURN isn't one of them.

regards, tom lane

-- 
Sent via pgsql-bugs mailing list (pgsql-bugs@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-bugs