diff --git a/src/backend/commands/copy.c b/src/backend/commands/copy.c
index c39218f8dbb..6ffc3a62f67 100644
--- a/src/backend/commands/copy.c
+++ b/src/backend/commands/copy.c
@@ -2793,7 +2793,7 @@ CopyFrom(CopyState cstate)
 		{
 			ereport(ERROR,
 					(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-					 errmsg("cannot perform FREEZE on a partitioned table")));
+					 errmsg("cannot perform COPY FREEZE on a partitioned table")));
 		}
 
 		/*
@@ -2808,13 +2808,13 @@ CopyFrom(CopyState cstate)
 		if (!ThereAreNoPriorRegisteredSnapshots() || !ThereAreNoReadyPortals())
 			ereport(ERROR,
 					(errcode(ERRCODE_INVALID_TRANSACTION_STATE),
-					 errmsg("cannot perform FREEZE because of prior transaction activity")));
+					 errmsg("cannot perform COPY FREEZE because of prior transaction activity")));
 
 		if (cstate->rel->rd_createSubid != GetCurrentSubTransactionId() &&
 			cstate->rel->rd_newRelfilenodeSubid != GetCurrentSubTransactionId())
 			ereport(ERROR,
 					(errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE),
-					 errmsg("cannot perform FREEZE because the table was not created or truncated in the current subtransaction")));
+					 errmsg("cannot perform COPY FREEZE because the table was not created or truncated in the current subtransaction")));
 
 		ti_options |= TABLE_INSERT_FROZEN;
 	}
diff --git a/src/backend/commands/publicationcmds.c b/src/backend/commands/publicationcmds.c
index 4d48be0b92e..0d32f2d6e34 100644
--- a/src/backend/commands/publicationcmds.c
+++ b/src/backend/commands/publicationcmds.c
@@ -129,7 +129,7 @@ parse_publication_options(List *options,
 		else
 			ereport(ERROR,
 					(errcode(ERRCODE_SYNTAX_ERROR),
-					 errmsg("unrecognized publication parameter: %s", defel->defname)));
+					 errmsg("unrecognized publication parameter: \"%s\"", defel->defname)));
 	}
 }
 
diff --git a/src/backend/commands/subscriptioncmds.c b/src/backend/commands/subscriptioncmds.c
index a60a15193a4..b1793b196f2 100644
--- a/src/backend/commands/subscriptioncmds.c
+++ b/src/backend/commands/subscriptioncmds.c
@@ -185,7 +185,7 @@ parse_subscription_options(List *options, bool *connect, bool *enabled_given,
 		else
 			ereport(ERROR,
 					(errcode(ERRCODE_SYNTAX_ERROR),
-					 errmsg("unrecognized subscription parameter: %s", defel->defname)));
+					 errmsg("unrecognized subscription parameter: \"%s\"", defel->defname)));
 	}
 
 	/*
@@ -198,17 +198,20 @@ parse_subscription_options(List *options, bool *connect, bool *enabled_given,
 		if (enabled && *enabled_given && *enabled)
 			ereport(ERROR,
 					(errcode(ERRCODE_SYNTAX_ERROR),
-					 errmsg("connect = false and enabled = true are mutually exclusive options")));
+					 errmsg("%s and %s are mutually exclusive options",
+							"connect = false", "enabled = true")));
 
 		if (create_slot && create_slot_given && *create_slot)
 			ereport(ERROR,
 					(errcode(ERRCODE_SYNTAX_ERROR),
-					 errmsg("connect = false and create_slot = true are mutually exclusive options")));
+					 errmsg("%s and %s are mutually exclusive options",
+							"connect = false", "create_slot = true")));
 
 		if (copy_data && copy_data_given && *copy_data)
 			ereport(ERROR,
 					(errcode(ERRCODE_SYNTAX_ERROR),
-					 errmsg("connect = false and copy_data = true are mutually exclusive options")));
+					 errmsg("%s and %s are mutually exclusive options",
+							"connect = false", "copy_data = true")));
 
 		/* Change the defaults of other options. */
 		*enabled = false;
@@ -225,22 +228,27 @@ parse_subscription_options(List *options, bool *connect, bool *enabled_given,
 		if (enabled && *enabled_given && *enabled)
 			ereport(ERROR,
 					(errcode(ERRCODE_SYNTAX_ERROR),
-					 errmsg("slot_name = NONE and enabled = true are mutually exclusive options")));
+					 errmsg("%s and %s are mutually exclusive options",
+							"slot_name = NONE", "enable = true")));
 
 		if (create_slot && create_slot_given && *create_slot)
 			ereport(ERROR,
 					(errcode(ERRCODE_SYNTAX_ERROR),
-					 errmsg("slot_name = NONE and create_slot = true are mutually exclusive options")));
+					 errmsg("%s and %s are mutually exclusive options",
+							"slot_name = NONE", "create_slot = true")));
 
 		if (enabled && !*enabled_given && *enabled)
 			ereport(ERROR,
 					(errcode(ERRCODE_SYNTAX_ERROR),
-					 errmsg("subscription with slot_name = NONE must also set enabled = false")));
+					 errmsg("subscription with %s must also set %s",
+							"slot_name = NONE", "enabled = false")));
 
 		if (create_slot && !create_slot_given && *create_slot)
 			ereport(ERROR,
 					(errcode(ERRCODE_SYNTAX_ERROR),
-					 errmsg("subscription with slot_name = NONE must also set create_slot = false")));
+					 errmsg("subscription with %s must also set %s",
+							"slot_name = NONE", "create_slot = false"
+							)));
 	}
 }
 
@@ -487,9 +495,8 @@ CreateSubscription(CreateSubscriptionStmt *stmt, bool isTopLevel)
 	}
 	else
 		ereport(WARNING,
-				(errmsg("tables were not subscribed, you will have to run "
-						"ALTER SUBSCRIPTION ... REFRESH PUBLICATION to "
-						"subscribe the tables")));
+				(errmsg("tables were not subscribed, you will have to run %s to subscribe the tables",
+						"ALTER SUBSCRIPTION ... REFRESH PUBLICATION")));
 
 	table_close(rel, RowExclusiveLock);
 
@@ -673,7 +680,8 @@ AlterSubscription(AlterSubscriptionStmt *stmt)
 					if (sub->enabled && !slotname)
 						ereport(ERROR,
 								(errcode(ERRCODE_SYNTAX_ERROR),
-								 errmsg("cannot set slot_name = NONE for enabled subscription")));
+								 errmsg("cannot set %s for enabled subscription",
+										"slot_name = NONE")));
 
 					if (slotname)
 						values[Anum_pg_subscription_subslotname - 1] =
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index baeb13e6a0c..85210f13d8d 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -10231,6 +10231,7 @@ ATPrepAlterColumnType(List **wqueue,
 		if (!is_expr)
 			ereport(ERROR,
 					(errcode(ERRCODE_INVALID_TABLE_DEFINITION),
+					 /* XXX "named" ?? */
 					 errmsg("cannot alter type of column named in partition key")));
 		else
 			ereport(ERROR,
@@ -15116,14 +15117,14 @@ ComputePartitionAttrs(ParseState *pstate, Relation rel, List *partParams, AttrNu
 				if (strategy == PARTITION_STRATEGY_HASH)
 					ereport(ERROR,
 							(errcode(ERRCODE_UNDEFINED_OBJECT),
-							 errmsg("data type %s has no default hash operator class",
-									format_type_be(atttype)),
+							 errmsg("data type %s has no default operator class for access method \"%s\"",
+									format_type_be(atttype), "hash"),
 							 errhint("You must specify a hash operator class or define a default hash operator class for the data type.")));
 				else
 					ereport(ERROR,
 							(errcode(ERRCODE_UNDEFINED_OBJECT),
-							 errmsg("data type %s has no default btree operator class",
-									format_type_be(atttype)),
+							 errmsg("data type %s has no default operator class for access method \"%s\"",
+									format_type_be(atttype), "btree"),
 							 errhint("You must specify a btree operator class or define a default btree operator class for the data type.")));
 
 			}
diff --git a/src/backend/parser/analyze.c b/src/backend/parser/analyze.c
index 400558b552b..bd6f3c80445 100644
--- a/src/backend/parser/analyze.c
+++ b/src/backend/parser/analyze.c
@@ -2599,7 +2599,7 @@ transformCreateTableAsStmt(ParseState *pstate, CreateTableAsStmt *stmt)
 		if (stmt->into->rel->relpersistence == RELPERSISTENCE_UNLOGGED)
 			ereport(ERROR,
 					(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-					 errmsg("materialized views cannot be UNLOGGED")));
+					 errmsg("materialized views cannot be unlogged")));
 
 		/*
 		 * At runtime, we'll need a copy of the parsed-but-not-rewritten Query
diff --git a/src/backend/parser/parse_oper.c b/src/backend/parser/parse_oper.c
index 24f0d5c08c5..2d79c972d7a 100644
--- a/src/backend/parser/parse_oper.c
+++ b/src/backend/parser/parse_oper.c
@@ -724,6 +724,7 @@ op_error(ParseState *pstate, List *op, char oprkind,
 				 errmsg("operator does not exist: %s",
 						op_signature_string(op, oprkind, arg1, arg2)),
 				 (!arg1 || !arg2) ?
+				 /* XXX errhint_plural? */
 				 errhint("No operator matches the given name and argument type. "
 						 "You might need to add an explicit type cast.") :
 				 errhint("No operator matches the given name and argument types. "
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index 71ffb1345b6..aee506cc6f7 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -2028,7 +2028,7 @@ retry1:
 				continue;
 			ereport(COMMERROR,
 					(errcode_for_socket_access(),
-					 errmsg("failed to send GSSAPI negotiation response: %m)")));
+					 errmsg("failed to send GSSAPI negotiation response: %m")));
 			return STATUS_ERROR;	/* close the connection */
 		}
 
@@ -2651,11 +2651,12 @@ SIGHUP_handler(SIGNAL_ARGS)
 		/* Reload authentication config files too */
 		if (!load_hba())
 			ereport(LOG,
-					(errmsg("pg_hba.conf was not reloaded")));
+					/* translator: %s is a configuration file */
+					(errmsg("%s was not reloaded", "pg_hba.conf")));
 
 		if (!load_ident())
 			ereport(LOG,
-					(errmsg("pg_ident.conf was not reloaded")));
+					(errmsg("%s was not reloaded", "pg_ident.conf")));
 
 #ifdef USE_SSL
 		/* Reload SSL configuration as well */
diff --git a/src/backend/replication/basebackup.c b/src/backend/replication/basebackup.c
index 36dcb287540..03169577e54 100644
--- a/src/backend/replication/basebackup.c
+++ b/src/backend/replication/basebackup.c
@@ -1439,6 +1439,7 @@ sendFile(const char *readfilename, const char *tarfilename, struct stat *statbuf
 
 		if (verify_checksum && (cnt % BLCKSZ != 0))
 		{
+			/* XXX is it okay to use %d for BlockNumber everywhere? */
 			ereport(WARNING,
 					(errmsg("cannot verify checksum in file \"%s\", block "
 							"%d: read buffer size %d and page size %d "
@@ -1516,16 +1517,13 @@ sendFile(const char *readfilename, const char *tarfilename, struct stat *statbuf
 
 						if (checksum_failures <= 5)
 							ereport(WARNING,
-									(errmsg("checksum verification failed in "
-											"file \"%s\", block %d: calculated "
-											"%X but expected %X",
+									(errmsg("checksum verification failed in file \"%s\", block %d: calculated %X but expected %X",
 											readfilename, blkno, checksum,
 											phdr->pd_checksum)));
 						if (checksum_failures == 5)
 							ereport(WARNING,
-									(errmsg("further checksum verification "
-											"failures in file \"%s\" will not "
-											"be reported", readfilename)));
+									(errmsg("further checksum verification failures in file \"%s\" will not be reported",
+											readfilename)));
 					}
 				}
 				block_retry = false;
@@ -1581,8 +1579,8 @@ sendFile(const char *readfilename, const char *tarfilename, struct stat *statbuf
 	if (checksum_failures > 1)
 	{
 		ereport(WARNING,
-				(errmsg("file \"%s\" has a total of %d checksum verification "
-						"failures", readfilename, checksum_failures)));
+				(errmsg("file \"%s\" has a total of %d checksum verification failures",
+						readfilename, checksum_failures)));
 
 		pgstat_report_checksum_failures_in_db(dboid, checksum_failures);
 	}
@@ -1617,8 +1615,7 @@ _tarWriteHeader(const char *filename, const char *linktarget,
 				break;
 			case TAR_SYMLINK_TOO_LONG:
 				ereport(ERROR,
-						(errmsg("symbolic link target too long for tar format: "
-								"file name \"%s\", target \"%s\"",
+						(errmsg("symbolic link target too long for tar format: file name \"%s\", target \"%s\"",
 								filename, linktarget)));
 				break;
 			default:
diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c
index 440b6aac4bc..eb379658562 100644
--- a/src/backend/replication/walsender.c
+++ b/src/backend/replication/walsender.c
@@ -903,8 +903,8 @@ CreateReplicationSlot(CreateReplicationSlotCmd *cmd)
 		{
 			if (IsTransactionBlock())
 				ereport(ERROR,
-						(errmsg("CREATE_REPLICATION_SLOT ... EXPORT_SNAPSHOT "
-								"must not be called inside a transaction")));
+						(errmsg("%s must not be called inside a transaction",
+								"CREATE_REPLICATION_SLOT ... EXPORT_SNAPSHOT")));
 
 			need_full_snapshot = true;
 		}
@@ -912,23 +912,23 @@ CreateReplicationSlot(CreateReplicationSlotCmd *cmd)
 		{
 			if (!IsTransactionBlock())
 				ereport(ERROR,
-						(errmsg("CREATE_REPLICATION_SLOT ... USE_SNAPSHOT "
-								"must be called inside a transaction")));
+						(errmsg("%s must be called inside a transaction",
+								"CREATE_REPLICATION_SLOT ... USE_SNAPSHOT")));
 
 			if (XactIsoLevel != XACT_REPEATABLE_READ)
 				ereport(ERROR,
-						(errmsg("CREATE_REPLICATION_SLOT ... USE_SNAPSHOT "
-								"must be called in REPEATABLE READ isolation mode transaction")));
+						(errmsg("%s must be called in REPEATABLE READ isolation mode transaction",
+								"CREATE_REPLICATION_SLOT ... USE_SNAPSHOT")));
 
 			if (FirstSnapshotSet)
 				ereport(ERROR,
-						(errmsg("CREATE_REPLICATION_SLOT ... USE_SNAPSHOT "
-								"must be called before any query")));
+						(errmsg("%s must be called before any query",
+								"CREATE_REPLICATION_SLOT ... USE_SNAPSHOT")));
 
 			if (IsSubTransaction())
 				ereport(ERROR,
-						(errmsg("CREATE_REPLICATION_SLOT ... USE_SNAPSHOT "
-								"must not be called in a subtransaction")));
+						(errmsg("%s must not be called in a subtransaction",
+								"CREATE_REPLICATION_SLOT ... USE_SNAPSHOT")));
 
 			need_full_snapshot = true;
 		}
diff --git a/src/backend/rewrite/rewriteHandler.c b/src/backend/rewrite/rewriteHandler.c
index 39080776b04..6a8679c6c3f 100644
--- a/src/backend/rewrite/rewriteHandler.c
+++ b/src/backend/rewrite/rewriteHandler.c
@@ -3741,23 +3741,30 @@ RewriteQuery(Query *parsetree, List *rewrite_events)
 				case CMD_INSERT:
 					ereport(ERROR,
 							(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-							 errmsg("cannot perform INSERT RETURNING on relation \"%s\"",
+							 errmsg("cannot perform %s on relation \"%s\"",
+									"INSERT RETURNING",
 									RelationGetRelationName(rt_entry_relation)),
-							 errhint("You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause.")));
+					/*- translator: %s is SQL such as ON INSERT DO INSTEAD */
+							 errhint("You need an unconditional %s rule with a RETURNING clause.",
+									 "ON INSERT DO INSTEAD")));
 					break;
 				case CMD_UPDATE:
 					ereport(ERROR,
 							(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-							 errmsg("cannot perform UPDATE RETURNING on relation \"%s\"",
+							 errmsg("cannot perform %s on relation \"%s\"",
+									"UPDATE RETURNING",
 									RelationGetRelationName(rt_entry_relation)),
-							 errhint("You need an unconditional ON UPDATE DO INSTEAD rule with a RETURNING clause.")));
+							 errhint("You need an unconditional %s rule with a RETURNING clause.",
+									 "ON UPDATE DO INSTEAD")));
 					break;
 				case CMD_DELETE:
 					ereport(ERROR,
 							(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
-							 errmsg("cannot perform DELETE RETURNING on relation \"%s\"",
+							 errmsg("cannot perform %s on relation \"%s\"",
+									"DELETE RETURNING",
 									RelationGetRelationName(rt_entry_relation)),
-							 errhint("You need an unconditional ON DELETE DO INSTEAD rule with a RETURNING clause.")));
+							 errhint("You need an unconditional %s rule with a RETURNING clause.",
+									 "ON DELETE DO INSTEAD")));
 					break;
 				default:
 					elog(ERROR, "unrecognized commandType: %d",
diff --git a/src/backend/utils/adt/jsonpath.c b/src/backend/utils/adt/jsonpath.c
index d53d6d33113..b7f0b4a35e3 100644
--- a/src/backend/utils/adt/jsonpath.c
+++ b/src/backend/utils/adt/jsonpath.c
@@ -179,7 +179,8 @@ jsonPathFromCstring(char *in, int len)
 	if (!jsonpath)
 		ereport(ERROR,
 				(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
-				 errmsg("invalid input syntax for jsonpath: \"%s\"", in)));
+				 errmsg("invalid input syntax for type %s: \"%s\"", "jsonpath",
+						in)));
 
 	flattenJsonPathParseItem(&buf, jsonpath->expr, 0, false);
 
diff --git a/src/backend/utils/adt/jsonpath_exec.c b/src/backend/utils/adt/jsonpath_exec.c
index 2789ed2371f..b6d6a243e52 100644
--- a/src/backend/utils/adt/jsonpath_exec.c
+++ b/src/backend/utils/adt/jsonpath_exec.c
@@ -1934,7 +1934,7 @@ getJsonPathVariable(JsonPathExecContext *cxt, JsonPathItem *variable,
 	{
 		ereport(ERROR,
 				(errcode(ERRCODE_UNDEFINED_OBJECT),
-				 errmsg("cannot find jsonpath variable \"%s\"",
+				 errmsg("could not find jsonpath variable \"%s\"",
 						pnstrdup(varName, varNameLength))));
 	}
 
diff --git a/src/backend/utils/adt/jsonpath_scan.l b/src/backend/utils/adt/jsonpath_scan.l
index 6ab7c5c9c64..84d4f297a89 100644
--- a/src/backend/utils/adt/jsonpath_scan.l
+++ b/src/backend/utils/adt/jsonpath_scan.l
@@ -539,7 +539,7 @@ addUnicodeChar(int ch)
 	{
 		ereport(ERROR,
 				(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
-				 errmsg("invalid input syntax for type jsonpath"),
+				 errmsg("invalid input syntax for type %s", "jsonpath"),
 				 errdetail("Unicode escape values cannot be used for code "
 						   "point values above 007F when the server encoding "
 						   "is not UTF8.")));
@@ -555,7 +555,7 @@ addUnicode(int ch, int *hi_surrogate)
 		if (*hi_surrogate != -1)
 			ereport(ERROR,
 					(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
-					 errmsg("invalid input syntax for type jsonpath"),
+					 errmsg("invalid input syntax for type %s", "jsonpath"),
 					 errdetail("Unicode high surrogate must not follow "
 							   "a high surrogate.")));
 		*hi_surrogate = (ch & 0x3ff) << 10;
@@ -566,7 +566,7 @@ addUnicode(int ch, int *hi_surrogate)
 		if (*hi_surrogate == -1)
 			ereport(ERROR,
 					(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
-					 errmsg("invalid input syntax for type jsonpath"),
+					 errmsg("invalid input syntax for type %s", "jsonpath"),
 					 errdetail("Unicode low surrogate must follow a high "
 							   "surrogate.")));
 		ch = 0x10000 + *hi_surrogate + (ch & 0x3ff);
@@ -576,7 +576,7 @@ addUnicode(int ch, int *hi_surrogate)
 	{
 		ereport(ERROR,
 				(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
-				 errmsg("invalid input syntax for type jsonpath"),
+				 errmsg("invalid input syntax for type %s", "jsonpath"),
 				 errdetail("Unicode low surrogate must follow a high "
 						   "surrogate.")));
 	}
@@ -618,7 +618,7 @@ parseUnicode(char *s, int l)
 	{
 		ereport(ERROR,
 				(errcode(ERRCODE_INVALID_TEXT_REPRESENTATION),
-				 errmsg("invalid input syntax for type jsonpath"),
+				 errmsg("invalid input syntax for type %s", "jsonpath"),
 				 errdetail("Unicode low surrogate must follow a high "
 						   "surrogate.")));
 	}
diff --git a/src/backend/utils/adt/pg_locale.c b/src/backend/utils/adt/pg_locale.c
index da6e2cb5848..2376bda497b 100644
--- a/src/backend/utils/adt/pg_locale.c
+++ b/src/backend/utils/adt/pg_locale.c
@@ -1603,7 +1603,7 @@ icu_to_uchar(UChar **buff_uchar, const char *buff, size_t nbytes)
 							  buff, nbytes, &status);
 	if (U_FAILURE(status) && status != U_BUFFER_OVERFLOW_ERROR)
 		ereport(ERROR,
-				(errmsg("ucnv_toUChars failed: %s", u_errorName(status))));
+				(errmsg("%s failed: %s", "ucnv_toUChars", u_errorName(status))));
 
 	*buff_uchar = palloc((len_uchar + 1) * sizeof(**buff_uchar));
 
@@ -1612,7 +1612,7 @@ icu_to_uchar(UChar **buff_uchar, const char *buff, size_t nbytes)
 							  buff, nbytes, &status);
 	if (U_FAILURE(status))
 		ereport(ERROR,
-				(errmsg("ucnv_toUChars failed: %s", u_errorName(status))));
+				(errmsg("%s failed: %s", "ucnv_toUChars", u_errorName(status))));
 
 	return len_uchar;
 }
@@ -1641,7 +1641,8 @@ icu_from_uchar(char **result, const UChar *buff_uchar, int32_t len_uchar)
 								 buff_uchar, len_uchar, &status);
 	if (U_FAILURE(status) && status != U_BUFFER_OVERFLOW_ERROR)
 		ereport(ERROR,
-				(errmsg("ucnv_fromUChars failed: %s", u_errorName(status))));
+				(errmsg("%s failed: %s", "ucnv_fromUChars",
+						u_errorName(status))));
 
 	*result = palloc(len_result + 1);
 
@@ -1650,7 +1651,8 @@ icu_from_uchar(char **result, const UChar *buff_uchar, int32_t len_uchar)
 								 buff_uchar, len_uchar, &status);
 	if (U_FAILURE(status))
 		ereport(ERROR,
-				(errmsg("ucnv_fromUChars failed: %s", u_errorName(status))));
+				(errmsg("%s failed: %s", "ucnv_fromUChars",
+						u_errorName(status))));
 
 	return len_result;
 }
diff --git a/src/backend/utils/adt/regexp.c b/src/backend/utils/adt/regexp.c
index da13a875eb0..dbc8263d486 100644
--- a/src/backend/utils/adt/regexp.c
+++ b/src/backend/utils/adt/regexp.c
@@ -423,7 +423,7 @@ parse_re_flags(pg_re_flags *flags, text *opts)
 				default:
 					ereport(ERROR,
 							(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-							 errmsg("invalid regexp option: \"%c\"",
+							 errmsg("invalid regular expression option: \"%c\"",
 									opt_p[i])));
 					break;
 			}
@@ -863,7 +863,9 @@ regexp_match(PG_FUNCTION_ARGS)
 	if (re_flags.glob)
 		ereport(ERROR,
 				(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-				 errmsg("regexp_match does not support the global option"),
+				 /* translator: %s is a SQL function name */
+				 errmsg("%s does not support the \"global\" option",
+						"regexp_match()"),
 				 errhint("Use the regexp_matches function instead.")));
 
 	matchctx = setup_regexp_matches(orig_str, pattern, &re_flags,
@@ -1241,7 +1243,9 @@ regexp_split_to_table(PG_FUNCTION_ARGS)
 		if (re_flags.glob)
 			ereport(ERROR,
 					(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-					 errmsg("regexp_split_to_table does not support the global option")));
+			/* translator: %s is a SQL function name */
+					 errmsg("%s does not support the \"global\" option",
+							"regexp_split_to_table()")));
 		/* But we find all the matches anyway */
 		re_flags.glob = true;
 
@@ -1294,7 +1298,9 @@ regexp_split_to_array(PG_FUNCTION_ARGS)
 	if (re_flags.glob)
 		ereport(ERROR,
 				(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
-				 errmsg("regexp_split_to_array does not support the global option")));
+				 /* translator: %s is a SQL function name */
+				 errmsg("%s does not support the \"global\" option",
+						"regexp_split_to_array()")));
 	/* But we find all the matches anyway */
 	re_flags.glob = true;
 
