Reduce the size of the fmgr_builtin_oid_index[] array.
authorTom Lane <[email protected]>
Wed, 9 Jan 2019 20:22:43 +0000 (15:22 -0500)
committerTom Lane <[email protected]>
Wed, 9 Jan 2019 20:22:43 +0000 (15:22 -0500)
This index array was originally defined to have 10000 entries (ranging
up to FirstGenbkiObjectId), but we really only need entries up to the
last existing builtin function OID, currently 6121.  That saves close
to 8K of never-accessed space in the server executable, at the small
price of one more fetch in fmgr_isbuiltin().

We could reduce the array size still further by renumbering a few of
the highest-numbered builtin functions; but there's a small risk of
breaking clients that have chosen to hardwire those function OIDs,
so it's not clear if it'd be worth the trouble.  (We should, however,
discourage future patches from choosing function OIDs above 6K as long
as there's still lots of space below that.)

Discussion: https://postgr.es/m/12359.1547063064@sss.pgh.pa.us

src/backend/utils/Gen_fmgrtab.pl
src/backend/utils/fmgr/fmgr.c
src/include/utils/fmgrtab.h

index cafe40806fd3f30a7a7c8a27a381dce1271593db..f9709405e75b1ef1396d89eb7c69030944f2394a 100644 (file)
@@ -80,11 +80,6 @@ foreach my $datfile (@input_files)
        $catalog_data{$catname} = Catalog::ParseData($datfile, $schema, 0);
 }
 
-# Fetch some values for later.
-my $FirstGenbkiObjectId =
-  Catalog::FindDefinedSymbol('access/transam.h', $include_path,
-       'FirstGenbkiObjectId');
-
 # Collect certain fields from pg_proc.dat.
 my @fmgr = ();
 
@@ -225,6 +220,7 @@ my %bmap;
 $bmap{'t'} = 'true';
 $bmap{'f'} = 'false';
 my @fmgr_builtin_oid_index;
+my $last_builtin_oid = 0;
 my $fmgr_count = 0;
 foreach my $s (sort { $a->{oid} <=> $b->{oid} } @fmgr)
 {
@@ -232,6 +228,7 @@ foreach my $s (sort { $a->{oid} <=> $b->{oid} } @fmgr)
          "  { $s->{oid}, $s->{nargs}, $bmap{$s->{strict}}, $bmap{$s->{retset}}, \"$s->{prosrc}\", $s->{prosrc} }";
 
        $fmgr_builtin_oid_index[ $s->{oid} ] = $fmgr_count++;
+       $last_builtin_oid = $s->{oid};
 
        if ($fmgr_count <= $#fmgr)
        {
@@ -244,31 +241,30 @@ foreach my $s (sort { $a->{oid} <=> $b->{oid} } @fmgr)
 }
 print $tfh "};\n";
 
-print $tfh qq|
+printf $tfh qq|
 const int fmgr_nbuiltins = (sizeof(fmgr_builtins) / sizeof(FmgrBuiltin));
-|;
+
+const Oid fmgr_last_builtin_oid = %u;
+|, $last_builtin_oid;
 
 
 # Create fmgr_builtins_oid_index table.
-#
-# Note that the array has to be filled up to FirstGenbkiObjectId,
-# as we can't rely on zero initialization as 0 is a valid mapping.
-print $tfh qq|
-const uint16 fmgr_builtin_oid_index[FirstGenbkiObjectId] = {
-|;
+printf $tfh qq|
+const uint16 fmgr_builtin_oid_index[%u] = {
+|, $last_builtin_oid + 1;
 
-for (my $i = 0; $i < $FirstGenbkiObjectId; $i++)
+for (my $i = 0; $i <= $last_builtin_oid; $i++)
 {
        my $oid = $fmgr_builtin_oid_index[$i];
 
-       # fmgr_builtin_oid_index is sparse, map nonexistant functions to
+       # fmgr_builtin_oid_index is sparse, map nonexistent functions to
        # InvalidOidBuiltinMapping
        if (not defined $oid)
        {
                $oid = 'InvalidOidBuiltinMapping';
        }
 
-       if ($i + 1 == $FirstGenbkiObjectId)
+       if ($i == $last_builtin_oid)
        {
                print $tfh "  $oid\n";
        }
index b41649fb0f02ac224bdf0c47a5f648f1984d783b..506eeef01c305be3f5140daea05de4f717bfcee1 100644 (file)
@@ -75,12 +75,12 @@ fmgr_isbuiltin(Oid id)
        uint16          index;
 
        /* fast lookup only possible if original oid still assigned */
-       if (id >= FirstGenbkiObjectId)
+       if (id > fmgr_last_builtin_oid)
                return NULL;
 
        /*
         * Lookup function data. If there's a miss in that range it's likely a
-        * nonexistant function, returning NULL here will trigger an ERROR later.
+        * nonexistent function, returning NULL here will trigger an ERROR later.
         */
        index = fmgr_builtin_oid_index[id];
        if (index == InvalidOidBuiltinMapping)
index a778f880a6aed88c71e082d44fdc448c5a41e418..e981f34934733b905334ee9038deb368aabc6a64 100644 (file)
@@ -36,11 +36,13 @@ extern const FmgrBuiltin fmgr_builtins[];
 
 extern const int fmgr_nbuiltins;       /* number of entries in table */
 
+extern const Oid fmgr_last_builtin_oid; /* highest function OID in table */
+
 /*
- * Mapping from a builtin function's oid to the index in the fmgr_builtins
- * array.
+ * Mapping from a builtin function's OID to its index in the fmgr_builtins
+ * array.  This is indexed from 0 through fmgr_last_builtin_oid.
  */
 #define InvalidOidBuiltinMapping PG_UINT16_MAX
-extern const uint16 fmgr_builtin_oid_index[FirstGenbkiObjectId];
+extern const uint16 fmgr_builtin_oid_index[];
 
 #endif                                                 /* FMGRTAB_H */