diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2009-05-02 17:27:57 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2009-05-02 17:27:57 +0000 |
commit | c91bf01bc564bf938934c42867a8fd0e87ad0703 (patch) | |
tree | c92cef624643fa0062537dfbf3533b38cb17abe1 /src | |
parent | ccc6759dbb4140de5df7ba23c0623772c54c9d54 (diff) | |
download | postgresql-c91bf01bc564bf938934c42867a8fd0e87ad0703.tar.gz postgresql-c91bf01bc564bf938934c42867a8fd0e87ad0703.zip |
Fix plpgsql's EXIT so that an EXIT without a label only matches a loop,
never a BEGIN block. This is required for Oracle compatibility and is
also plainly stated to be the behavior by our original documentation
(up until 8.1, in which the docs were adjusted to match the code's behavior;
but actually the old docs said the correct thing and the code was wrong).
Not back-patched because this introduces an incompatibility that could
break working applications. Requires release note.
Diffstat (limited to 'src')
-rw-r--r-- | src/pl/plpgsql/src/pl_exec.c | 12 |
1 files changed, 8 insertions, 4 deletions
diff --git a/src/pl/plpgsql/src/pl_exec.c b/src/pl/plpgsql/src/pl_exec.c index d440d38e567..e436e053b1b 100644 --- a/src/pl/plpgsql/src/pl_exec.c +++ b/src/pl/plpgsql/src/pl_exec.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.240 2009/04/09 02:57:53 tgl Exp $ + * $PostgreSQL: pgsql/src/pl/plpgsql/src/pl_exec.c,v 1.241 2009/05/02 17:27:57 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -1145,11 +1145,15 @@ exec_stmt_block(PLpgSQL_execstate *estate, PLpgSQL_stmt_block *block) return rc; case PLPGSQL_RC_EXIT: + /* + * This is intentionally different from the handling of RC_EXIT + * for loops: to match a block, we require a match by label. + */ if (estate->exitlabel == NULL) - return PLPGSQL_RC_OK; + return PLPGSQL_RC_EXIT; if (block->label == NULL) return PLPGSQL_RC_EXIT; - if (strcmp(block->label, estate->exitlabel)) + if (strcmp(block->label, estate->exitlabel) != 0) return PLPGSQL_RC_EXIT; estate->exitlabel = NULL; return PLPGSQL_RC_OK; @@ -1604,7 +1608,7 @@ exec_stmt_while(PLpgSQL_execstate *estate, PLpgSQL_stmt_while *stmt) return PLPGSQL_RC_OK; if (stmt->label == NULL) return PLPGSQL_RC_EXIT; - if (strcmp(stmt->label, estate->exitlabel)) + if (strcmp(stmt->label, estate->exitlabel) != 0) return PLPGSQL_RC_EXIT; estate->exitlabel = NULL; return PLPGSQL_RC_OK; |