Ensure that a plpgsql LOOP with an empty body still executes at least

one CHECK_FOR_INTERRUPTS() call, so that you can control-C out of the
loop.  Reported by Merlin Moncure.
This commit is contained in:
Tom Lane 2005-10-24 15:10:22 +00:00
parent 7d3ab8ac55
commit 18feafcc59
1 changed files with 12 additions and 1 deletions

View File

@ -3,7 +3,7 @@
* procedural language * procedural language
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.153 2005/10/15 02:49:49 momjian Exp $ * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.154 2005/10/24 15:10:22 tgl Exp $
* *
* This software is copyrighted by Jan Wieck - Hamburg. * This software is copyrighted by Jan Wieck - Hamburg.
* *
@ -974,6 +974,17 @@ exec_stmts(PLpgSQL_execstate * estate, List *stmts)
{ {
ListCell *s; ListCell *s;
if (stmts == NIL)
{
/*
* Ensure we do a CHECK_FOR_INTERRUPTS() even though there is no
* statement. This prevents hangup in a tight loop if, for instance,
* there is a LOOP construct with an empty body.
*/
CHECK_FOR_INTERRUPTS();
return PLPGSQL_RC_OK;
}
foreach(s, stmts) foreach(s, stmts)
{ {
PLpgSQL_stmt *stmt = (PLpgSQL_stmt *) lfirst(s); PLpgSQL_stmt *stmt = (PLpgSQL_stmt *) lfirst(s);