 src/backend/utils/Gen_fmgrtab.pl | 26 +++++++++++++++++++++++++-
 src/backend/utils/fmgr/fmgr.c    |  6 ++++--
 src/include/utils/fmgrtab.h      |  7 ++++++-
 3 files changed, 35 insertions(+), 4 deletions(-)

diff --git a/src/backend/utils/Gen_fmgrtab.pl b/src/backend/utils/Gen_fmgrtab.pl
index 80e99189e4..c0c4da5b29 100644
--- a/src/backend/utils/Gen_fmgrtab.pl
+++ b/src/backend/utils/Gen_fmgrtab.pl
@@ -207,7 +207,7 @@ my $fmgr_count       = 0;
 foreach my $s (sort { $a->{oid} <=> $b->{oid} } @fmgr)
 {
 	print $tfh
-	  "  { $s->{oid}, $s->{nargs}, $bmap{$s->{strict}}, $bmap{$s->{retset}}, \"$s->{prosrc}\", $s->{prosrc} }";
+	  "  { $s->{oid}, $s->{nargs}, $bmap{$s->{strict}}, $bmap{$s->{retset}}, $s->{prosrc} }";
 
 	$fmgr_builtin_oid_index[ $s->{oid} ] = $fmgr_count++;
 	$last_builtin_oid = $s->{oid};
@@ -258,6 +258,30 @@ for (my $i = 0; $i <= $last_builtin_oid; $i++)
 print $tfh "};\n";
 
 
+# Emit the string containing all the builtin function names.
+print $tfh qq|\nconst char fmgr_builtin_name_string[] =\n|;
+foreach my $s (sort { $a->{oid} <=> $b->{oid} } @fmgr)
+{
+	print $tfh qq|  "$s->{prosrc}\\0"\n|;
+}
+print $tfh ";\n";
+
+
+# Emit an array of lengths which will be used to calculate the
+# index into the function name string.
+printf $tfh "\nconst uint8 fmgr_builtin_name_lengths[] = {\n";
+my $length = 0;
+foreach my $s (sort { $a->{oid} <=> $b->{oid} } @fmgr)
+{
+	print $tfh "  $length,\n";
+
+	# Get the length of the current function name,
+	# and add 1 for the null terminator.
+	$length = length($s->{prosrc}) + 1;
+}
+print $tfh "};\n";
+
+
 # And add the file footers.
 print $ofh "\n#endif\t\t\t\t\t\t\t/* FMGROIDS_H */\n";
 print $pfh "\n#endif\t\t\t\t\t\t\t/* FMGRPROTOS_H */\n";
diff --git a/src/backend/utils/fmgr/fmgr.c b/src/backend/utils/fmgr/fmgr.c
index 2ce7a866c9..06d2d98747 100644
--- a/src/backend/utils/fmgr/fmgr.c
+++ b/src/backend/utils/fmgr/fmgr.c
@@ -97,11 +97,13 @@ fmgr_isbuiltin(Oid id)
 static const FmgrBuiltin *
 fmgr_lookupByName(const char *name)
 {
-	int			i;
+	int			i,
+				offset = 0;
 
 	for (i = 0; i < fmgr_nbuiltins; i++)
 	{
-		if (strcmp(name, fmgr_builtins[i].funcName) == 0)
+		offset += fmgr_builtin_name_lengths[i];
+		if (strcmp(name, fmgr_builtin_name_string + offset) == 0)
 			return fmgr_builtins + i;
 	}
 	return NULL;
diff --git a/src/include/utils/fmgrtab.h b/src/include/utils/fmgrtab.h
index e981f34934..07287d6f95 100644
--- a/src/include/utils/fmgrtab.h
+++ b/src/include/utils/fmgrtab.h
@@ -28,12 +28,17 @@ typedef struct
 	short		nargs;			/* 0..FUNC_MAX_ARGS, or -1 if variable count */
 	bool		strict;			/* T if function is "strict" */
 	bool		retset;			/* T if function returns a set */
-	const char *funcName;		/* C name of the function */
 	PGFunction	func;			/* pointer to compiled function */
 } FmgrBuiltin;
 
 extern const FmgrBuiltin fmgr_builtins[];
 
+/* names of builtin functions as a single character array */
+extern const char fmgr_builtin_name_string[];
+
+/* lengths of builtin function names, for computing the offset into the name string */
+extern const uint8 fmgr_builtin_name_lengths[];
+
 extern const int fmgr_nbuiltins;	/* number of entries in table */
 
 extern const Oid fmgr_last_builtin_oid; /* highest function OID in table */
