Re: Bug in SQL function with returntype void - Mailing list pgsql-bugs

From Tom Lane
Subject Re: Bug in SQL function with returntype void
Date
Msg-id 19595.1055439058@sss.pgh.pa.us
Whole thread Raw
In response to Bug in SQL function with returntype void  ("Zíka Aleš, Ing."<Ales.Zika@pel.br.ds.mfcr.cz>)
Responses Re: Bug in SQL function with returntype void
List pgsql-bugs
"Zíka Aleš, Ing." <Ales.Zika@pel.br.ds.mfcr.cz> writes:
>     I tried the example "CREATE FUNCTION clean_EMP () RETURNS void AS
> 'DELETE FROM EMP WHERE EMP.salary <= 0' LANGUAGE SQL;" in chapter 9.2.1 of
> Programmer's guide.
>     When the function was invoked, it delete only one tuple, although
> there were more tuples satisfying the WHERE condition. During secont
> invocation it deleted next tuple and so on.

Good catch.  I've applied the attached patch.
        regards, tom lane


*** src/backend/executor/functions.c.orig    Wed Sep  4 16:31:18 2002
--- src/backend/executor/functions.c    Thu Jun 12 13:26:12 2003
***************
*** 273,289 ****      if (es->qd->operation == CMD_UTILITY)     {
-         /*
-          * Process a utility command. (create, destroy...)    DZ - 30-8-1996
-          */         ProcessUtility(es->qd->parsetree->utilityStmt, es->qd->dest, NULL);
-         if (!LAST_POSTQUEL_COMMAND(es))
-             CommandCounterIncrement();         return (TupleTableSlot *) NULL;     }
!     /* If it's not the last command, just run it to completion */
!     count = (LAST_POSTQUEL_COMMAND(es)) ? 1L : 0L;      return ExecutorRun(es->qd, es->estate, ForwardScanDirection,
count);} 
--- 273,291 ----      if (es->qd->operation == CMD_UTILITY)     {
ProcessUtility(es->qd->parsetree->utilityStmt,es->qd->dest, NULL);         return (TupleTableSlot *) NULL;     }  
!     /*
!      * If it's the function's last command, and it's a SELECT, fetch one
!      * row at a time so we can return the results.  Otherwise just run it
!      * to completion.
!      */
!     if (LAST_POSTQUEL_COMMAND(es) && es->qd->operation == CMD_SELECT)
!         count = 1L;
!     else
!         count = 0L;      return ExecutorRun(es->qd, es->estate, ForwardScanDirection, count); }


pgsql-bugs by date:

Previous
From: Dmitry Tkach
Date:
Subject: Re: pg_dumpall not working in batch
Next
From: Bruce Momjian
Date:
Subject: Re: Bug in SQL function with returntype void