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 */