]> granicus.if.org Git - postgresql/commitdiff
Create a separate oid range for oids assigned by genbki.pl.
authorAndres Freund <andres@anarazel.de>
Thu, 13 Dec 2018 22:50:57 +0000 (14:50 -0800)
committerAndres Freund <andres@anarazel.de>
Thu, 13 Dec 2018 22:50:57 +0000 (14:50 -0800)
The changes I made in 578b229718e assigned oids below
FirstBootstrapObjectId to objects in include/catalog/*.dat files that
did not have an oid assigned, starting at the max oid explicitly
assigned.  Tom criticized that for mainly two reasons:
1) It's not clear which values are manually and which explicitly
   assigned.
2) The space below FirstBootstrapObjectId gets pretty crowded, and
   some PostgreSQL forks have used oids >= 9000 for their own objects,
   to avoid conflicting.

Thus create a new range for objects not assigned explicit oids, but
assigned by genbki.pl. For now 1-9999 is for explicitly assigned oids,
FirstGenbkiObjectId (10000) to FirstBootstrapObjectId (1200) -1 is for
genbki.pl assigned oids, and < FirstNormalObjectId (16384) is for oids
assigned during bootstrap.  It's possible that we'll have to adjust
these boundaries, but there's some headroom for now.

Add a note suggesting that oids in forks should be assigned in the
9000-9999 range.

Catversion bump for obvious reasons.

Per complaint from Tom Lane.

Author: Andres Freund
Discussion: https://postgr.es/m/16845.1544393682@sss.pgh.pa.us

contrib/postgres_fdw/shippable.c
src/backend/catalog/Makefile
src/backend/catalog/genbki.pl
src/backend/utils/Gen_fmgrtab.pl
src/backend/utils/fmgr/fmgr.c
src/include/access/transam.h
src/include/catalog/unused_oids
src/include/utils/fmgrtab.h
src/tools/msvc/Solution.pm

index 7f2ed0499c0639b08c3bb9d3678b221e5278d970..fb98faa5fd7af0dbe87fdd51ac72a3afa9c427bc 100644 (file)
@@ -137,7 +137,7 @@ lookup_shippable(Oid objectId, Oid classId, PgFdwRelationInfo *fpinfo)
 /*
  * Return true if given object is one of PostgreSQL's built-in objects.
  *
- * We use FirstBootstrapObjectId as the cutoff, so that we only consider
+ * We use FirstGenbkiObjectId as the cutoff, so that we only consider
  * objects with hand-assigned OIDs to be "built in", not for instance any
  * function or type defined in the information_schema.
  *
@@ -154,7 +154,7 @@ lookup_shippable(Oid objectId, Oid classId, PgFdwRelationInfo *fpinfo)
 bool
 is_builtin(Oid objectId)
 {
-       return (objectId < FirstBootstrapObjectId);
+       return (objectId < FirstGenbkiObjectId);
 }
 
 /*
index 0865240f11fcecb6d8ba3c832d265c3b9802bb05..aaa3af7e5a1ae1340b81a77033469e71cb4d02c6 100644 (file)
@@ -88,7 +88,9 @@ generated-header-symlinks: $(top_builddir)/src/include/catalog/header-stamp
 # instead is cheating a bit, but it will achieve the goal of updating the
 # version number when it changes.
 bki-stamp: genbki.pl Catalog.pm $(POSTGRES_BKI_SRCS) $(POSTGRES_BKI_DATA) $(top_srcdir)/configure.in
-       $(PERL) -I $(catalogdir) $< --set-version=$(MAJORVERSION) $(POSTGRES_BKI_SRCS)
+       $(PERL) -I $(catalogdir) $< \
+               -I $(top_srcdir)/src/include/ --set-version=$(MAJORVERSION) \
+               $(POSTGRES_BKI_SRCS)
        touch $@
 
 # The generated headers must all be symlinked into builddir/src/include/,
index edc8ea9f53393166033f8513f66debdf5c6b59fc..8e2a2480be60d8409a35a9563c2520b4487c706b 100644 (file)
@@ -22,6 +22,7 @@ use warnings;
 my @input_files;
 my $output_path = '';
 my $major_version;
+my $include_path;
 
 # Process command line switches.
 while (@ARGV)
@@ -31,6 +32,10 @@ while (@ARGV)
        {
                push @input_files, $arg;
        }
+       elsif ($arg =~ /^-I/)
+       {
+               $include_path = length($arg) > 2 ? substr($arg, 2) : shift @ARGV;
+       }
        elsif ($arg =~ /^-o/)
        {
                $output_path = length($arg) > 2 ? substr($arg, 2) : shift @ARGV;
@@ -50,6 +55,7 @@ while (@ARGV)
 # Sanity check arguments.
 die "No input files.\n" if !@input_files;
 die "--set-version must be specified.\n" if !defined $major_version;
+die "-I, the header include path, must be specified.\n" if !$include_path;
 
 # Make sure output_path ends in a slash.
 if ($output_path ne '' && substr($output_path, -1) ne '/')
@@ -133,17 +139,9 @@ foreach my $header (@input_files)
 # While duplicate OIDs would only cause a failure if they appear in
 # the same catalog, our project policy is that manually assigned OIDs
 # should be globally unique, to avoid confusion.
-#
-# Also use the loop to determine the maximum explicitly assigned oid
-# found in the data file, we'll use that for default oid assignments.
 my $found = 0;
-my $maxoid = 0;
 foreach my $oid (keys %oidcounts)
 {
-       if ($oid > $maxoid)
-       {
-               $maxoid = $oid;
-       }
        next unless $oidcounts{$oid} > 1;
        print STDERR "Duplicate OIDs detected:\n" if !$found;
        print STDERR "$oid\n";
@@ -151,6 +149,15 @@ foreach my $oid (keys %oidcounts)
 }
 die "found $found duplicate OID(s) in catalog data\n" if $found;
 
+
+# Oids not specified in the input files are automatically assigned,
+# starting at FirstGenbkiObjectId.
+my $FirstGenbkiObjectId =
+  Catalog::FindDefinedSymbol('access/transam.h', $include_path,
+       'FirstGenbkiObjectId');
+my $GenbkiNextOid = $FirstGenbkiObjectId;
+
+
 # Fetch some special data that we will substitute into the output file.
 # CAUTION: be wary about what symbols you substitute into the .bki file here!
 # It's okay to substitute things that are expected to be really constant
@@ -418,8 +425,8 @@ EOM
                        # Assign oid if oid column exists and no explicit assignment in row
                        if ($attname eq "oid" and not defined $bki_values{$attname})
                        {
-                               $bki_values{$attname} = $maxoid;
-                               $maxoid++;
+                               $bki_values{$attname} = $GenbkiNextOid;
+                               $GenbkiNextOid++;
                        }
 
                        # Substitute constant values we acquired above.
@@ -858,6 +865,7 @@ sub usage
 Usage: genbki.pl [options] header...
 
 Options:
+    -I               include path
     -o               output path
     --set-version    PostgreSQL version number for initdb cross-check
 
index ca282913552ff53ae683ebbb31c5b61f337bd64c..ed16737a6a1fb5001b548258297185b8dc5b73db 100644 (file)
@@ -79,9 +79,9 @@ foreach my $datfile (@input_files)
 }
 
 # Fetch some values for later.
-my $FirstBootstrapObjectId =
+my $FirstGenbkiObjectId =
   Catalog::FindDefinedSymbol('access/transam.h', $include_path,
-       'FirstBootstrapObjectId');
+       'FirstGenbkiObjectId');
 my $INTERNALlanguageId =
   Catalog::FindDefinedSymbolFromData($catalog_data{pg_language},
        'INTERNALlanguageId');
@@ -252,13 +252,13 @@ const int fmgr_nbuiltins = (sizeof(fmgr_builtins) / sizeof(FmgrBuiltin));
 
 # Create fmgr_builtins_oid_index table.
 #
-# Note that the array has to be filled up to FirstBootstrapObjectId,
+# 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[FirstBootstrapObjectId] = {
+const uint16 fmgr_builtin_oid_index[FirstGenbkiObjectId] = {
 |;
 
-for (my $i = 0; $i < $FirstBootstrapObjectId; $i++)
+for (my $i = 0; $i < $FirstGenbkiObjectId; $i++)
 {
        my $oid = $fmgr_builtin_oid_index[$i];
 
@@ -269,7 +269,7 @@ for (my $i = 0; $i < $FirstBootstrapObjectId; $i++)
                $oid = 'InvalidOidBuiltinMapping';
        }
 
-       if ($i + 1 == $FirstBootstrapObjectId)
+       if ($i + 1 == $FirstGenbkiObjectId)
        {
                print $tfh "  $oid\n";
        }
index 73ff48c1963f45e91b2c28667158796f49275db4..231bf88598973c57a93e1f6cdaf48b07031a63e4 100644 (file)
@@ -75,7 +75,7 @@ fmgr_isbuiltin(Oid id)
        uint16          index;
 
        /* fast lookup only possible if original oid still assigned */
-       if (id >= FirstBootstrapObjectId)
+       if (id >= FirstGenbkiObjectId)
                return NULL;
 
        /*
index 83ec3f19797b3aaade03cda841af909dbaa596b6..f979a065f9f72065f565c90c2513a0eafa427fc7 100644 (file)
 /* ----------
  *             Object ID (OID) zero is InvalidOid.
  *
- *             OIDs 1-9999 are reserved for manual assignment (see the files
- *             in src/include/catalog/).
+ *             OIDs 1-9999 are reserved for manual assignment (see .dat files in
+ *             src/include/catalog/), with 9000-9999 tentatively reserved for forks.
  *
- *             OIDS 10000-16383 are reserved for assignment during initdb
- *             using the OID generator.  (We start the generator at 10000.)
+ *             OIDs 10000-12000 are reserved for assignment by genbki.pl, when the
+ *             .dat files in src/include/catalog/ do not specify oids.
+ *
+ *             OIDS 12000-16383 are reserved for assignment during initdb
+ *             using the OID generator.  (We start the generator at 12000.)
  *
  *             OIDs beginning at 16384 are assigned from the OID generator
  *             during normal multiuser operation.  (We force the generator up to
  *             16384 as soon as we are in normal operation.)
  *
- * The choices of 10000 and 16384 are completely arbitrary, and can be moved
- * if we run low on OIDs in either category.  Changing the macros below
+ * The choices of 10000, 12000 and 16384 are completely arbitrary, and can be
+ * moved if we run low on OIDs in either category.  Changing the macros below
  * should be sufficient to do this.
  *
  * NOTE: if the OID generator wraps around, we skip over OIDs 0-16383
@@ -90,7 +93,8 @@
  * reassigning OIDs that might have been assigned during initdb.
  * ----------
  */
-#define FirstBootstrapObjectId 10000
+#define FirstGenbkiObjectId            10000
+#define FirstBootstrapObjectId 12000
 #define FirstNormalObjectId            16384
 
 /*
index c5fc378ae34272ac6d571ad6b2e22fa241ad99be..b5cafe0f3d38180e3f9db93b416dbee7d6c97b53 100755 (executable)
@@ -32,11 +32,11 @@ my @input_files = (glob("pg_*.h"), qw(indexing.h toasting.h));
 
 my $oids = Catalog::FindAllOidsFromHeaders(@input_files);
 
-# Also push FirstBootstrapObjectId to serve as a terminator for the last gap.
-my $FirstBootstrapObjectId =
+# Also push FirstGenbkiObjectId to serve as a terminator for the last gap.
+my $FirstGenbkiObjectId =
   Catalog::FindDefinedSymbol('access/transam.h', '..',
-       'FirstBootstrapObjectId');
-push @{$oids}, $FirstBootstrapObjectId;
+       'FirstGenbkiObjectId');
+push @{$oids}, $FirstGenbkiObjectId;
 
 my $prev_oid = 0;
 foreach my $oid (sort { $a <=> $b } @{$oids})
index 6122ed3e978f644db45ba233cc18632529f125e6..72671c38296b59734ab54606fc1709e124fe1900 100644 (file)
@@ -41,6 +41,6 @@ extern const int fmgr_nbuiltins;      /* number of entries in table */
  * array.
  */
 #define InvalidOidBuiltinMapping PG_UINT16_MAX
-extern const uint16 fmgr_builtin_oid_index[FirstBootstrapObjectId];
+extern const uint16 fmgr_builtin_oid_index[FirstGenbkiObjectId];
 
 #endif                                                 /* FMGRTAB_H */
index 68cf812f01df7e7979318752e90a1ee6ce39770a..0b7cdf8dd58bf47703a833d25640a801d173455c 100644 (file)
@@ -493,7 +493,7 @@ EOF
        {
                chdir('src/backend/catalog');
                my $bki_srcs = join(' ../../../src/include/catalog/', @bki_srcs);
-               system("perl genbki.pl --set-version=$self->{majorver} $bki_srcs");
+               system("perl genbki.pl  -I../../../src/include/ --set-version=$self->{majorver} $bki_srcs");
                open(my $f, '>', 'bki-stamp')
                  || confess "Could not touch bki-stamp";
                close($f);