From 18391a8f0649f40bb841e6492895551fd873f79b Mon Sep 17 00:00:00 2001 From: Tom Lane <tgl@sss.pgh.pa.us> Date: Sun, 23 Aug 2015 17:34:47 -0400 Subject: [PATCH] Tweak wording of syntax error messages about bad CONTINUE/EXIT statements. Try to avoid any possible confusion about what these messages mean. --- src/pl/plpgsql/src/pl_gram.y | 10 +++++----- src/test/regress/expected/plpgsql.out | 8 ++++---- src/test/regress/sql/plpgsql.sql | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/pl/plpgsql/src/pl_gram.y b/src/pl/plpgsql/src/pl_gram.y index 225c62ab36f..a1ae1bbf2cd 100644 --- a/src/pl/plpgsql/src/pl_gram.y +++ b/src/pl/plpgsql/src/pl_gram.y @@ -1676,11 +1676,11 @@ stmt_exit : exit_type opt_label opt_exitcond if (label == NULL) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), - errmsg("label \"%s\" does not exist", + errmsg("there is no label \"%s\" surrounding this statement", $2), parser_errposition(@2))); /* CONTINUE only allows loop labels */ - if (label->itemno != PLPGSQL_LABEL_LOOP && !$1) + if (label->itemno != PLPGSQL_LABEL_LOOP && !new->is_exit) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), errmsg("block label \"%s\" cannot be used in CONTINUE", @@ -1697,9 +1697,9 @@ stmt_exit : exit_type opt_label opt_exitcond if (plpgsql_ns_find_nearest_loop(plpgsql_ns_top()) == NULL) ereport(ERROR, (errcode(ERRCODE_SYNTAX_ERROR), - /* translator: %s is EXIT or CONTINUE */ - errmsg("%s cannot be used outside a loop", - plpgsql_stmt_typename((PLpgSQL_stmt *) new)), + new->is_exit ? + errmsg("EXIT cannot be used outside a loop, unless it has a label") : + errmsg("CONTINUE cannot be used outside a loop"), parser_errposition(@1))); } diff --git a/src/test/regress/expected/plpgsql.out b/src/test/regress/expected/plpgsql.out index b10157bb170..c1822aadf0a 100644 --- a/src/test/regress/expected/plpgsql.out +++ b/src/test/regress/expected/plpgsql.out @@ -2843,7 +2843,7 @@ $$ language plpgsql; ERROR: CONTINUE cannot be used outside a loop LINE 4: continue; ^ --- should fail: EXIT is only legal inside a loop +-- should fail: unlabeled EXIT is only legal inside a loop create function exit_error1() returns void as $$ begin begin @@ -2851,7 +2851,7 @@ begin end; end; $$ language plpgsql; -ERROR: EXIT cannot be used outside a loop +ERROR: EXIT cannot be used outside a loop, unless it has a label LINE 4: exit; ^ -- should fail: no such label @@ -2864,7 +2864,7 @@ begin end; end; $$ language plpgsql; -ERROR: label "no_such_label" does not exist +ERROR: there is no label "no_such_label" surrounding this statement LINE 5: continue no_such_label; ^ -- should fail: no such label @@ -2877,7 +2877,7 @@ begin end; end; $$ language plpgsql; -ERROR: label "no_such_label" does not exist +ERROR: there is no label "no_such_label" surrounding this statement LINE 5: exit no_such_label; ^ -- should fail: CONTINUE can't reference the label of a named block diff --git a/src/test/regress/sql/plpgsql.sql b/src/test/regress/sql/plpgsql.sql index 7b4191ecf97..f883e7e0a21 100644 --- a/src/test/regress/sql/plpgsql.sql +++ b/src/test/regress/sql/plpgsql.sql @@ -2373,7 +2373,7 @@ begin end; $$ language plpgsql; --- should fail: EXIT is only legal inside a loop +-- should fail: unlabeled EXIT is only legal inside a loop create function exit_error1() returns void as $$ begin begin -- GitLab