diff --git a/src/backend/commands/variable.c b/src/backend/commands/variable.c
index 57da014..7772cbe 100644
--- a/src/backend/commands/variable.c
+++ b/src/backend/commands/variable.c
@@ -856,7 +856,11 @@ check_role(char **newval, void **extra, GucSource source)
 	}
 	/* Do not allow setting role to a reserved role. */
 	else if (strncmp(*newval, "pg_", 3) == 0)
+	{
+		GUC_check_errcode(ERRCODE_RESERVED_NAME);
+		GUC_check_errmsg("role \"%s\" is reserved", *newval);
 		return false;
+	}
 	else
 	{
 		if (!IsTransactionState())
diff --git a/src/test/regress/expected/rolenames.out b/src/test/regress/expected/rolenames.out
index 15a97ab..12d1e76 100644
--- a/src/test/regress/expected/rolenames.out
+++ b/src/test/regress/expected/rolenames.out
@@ -823,9 +823,9 @@ GRANT pg_abc TO pg_abcdef; -- error
 ERROR:  role "pg_abcdef" is reserved
 DETAIL:  Cannot GRANT roles to a reserved role.
 SET ROLE pg_testrole; -- error
-ERROR:  invalid value for parameter "role": "pg_testrole"
+ERROR:  role "pg_testrole" is reserved
 SET ROLE pg_signal_backend; --error
-ERROR:  invalid value for parameter "role": "pg_signal_backend"
+ERROR:  role "pg_signal_backend" is reserved
 CREATE SCHEMA test_schema AUTHORIZATION pg_signal_backend; --error
 ERROR:  role "pg_signal_backend" is reserved
 DETAIL:  Cannot specify reserved role as owner.
