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