=?iso-8859-2?Q?=22Z=EDka_Ale=B9=2C_Ing=2E=22?= <[EMAIL PROTECTED]> 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); } ---------------------------(end of broadcast)--------------------------- TIP 2: you can get off all lists at once with the unregister command (send "unregister YourEmailAddressHere" to [EMAIL PROTECTED])