diff options
author | Andres Freund <andres@anarazel.de> | 2018-12-13 14:50:57 -0800 |
---|---|---|
committer | Andres Freund <andres@anarazel.de> | 2018-12-13 14:50:57 -0800 |
commit | 09568ec3d31bbd4854b857e8d23c197ad5b25c77 (patch) | |
tree | a0a92a9e15aa980a0e168a42361624b315e3209d /src | |
parent | 84d514887f9ca673ae688d00f8b544e70f1ab270 (diff) | |
download | postgresql-09568ec3d31bbd4854b857e8d23c197ad5b25c77.tar.gz postgresql-09568ec3d31bbd4854b857e8d23c197ad5b25c77.zip |
Create a separate oid range for oids assigned by genbki.pl.
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
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/catalog/Makefile | 4 | ||||
-rw-r--r-- | src/backend/catalog/genbki.pl | 28 | ||||
-rw-r--r-- | src/backend/utils/Gen_fmgrtab.pl | 12 | ||||
-rw-r--r-- | src/backend/utils/fmgr/fmgr.c | 2 | ||||
-rw-r--r-- | src/include/access/transam.h | 18 | ||||
-rwxr-xr-x | src/include/catalog/unused_oids | 8 | ||||
-rw-r--r-- | src/include/utils/fmgrtab.h | 2 | ||||
-rw-r--r-- | src/tools/msvc/Solution.pm | 2 |
8 files changed, 45 insertions, 31 deletions
diff --git a/src/backend/catalog/Makefile b/src/backend/catalog/Makefile index 0865240f11f..aaa3af7e5a1 100644 --- a/src/backend/catalog/Makefile +++ b/src/backend/catalog/Makefile @@ -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/, diff --git a/src/backend/catalog/genbki.pl b/src/backend/catalog/genbki.pl index edc8ea9f533..8e2a2480be6 100644 --- a/src/backend/catalog/genbki.pl +++ b/src/backend/catalog/genbki.pl @@ -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 diff --git a/src/backend/utils/Gen_fmgrtab.pl b/src/backend/utils/Gen_fmgrtab.pl index ca282913552..ed16737a6a1 100644 --- a/src/backend/utils/Gen_fmgrtab.pl +++ b/src/backend/utils/Gen_fmgrtab.pl @@ -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"; } diff --git a/src/backend/utils/fmgr/fmgr.c b/src/backend/utils/fmgr/fmgr.c index 73ff48c1963..231bf885989 100644 --- a/src/backend/utils/fmgr/fmgr.c +++ b/src/backend/utils/fmgr/fmgr.c @@ -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; /* diff --git a/src/include/access/transam.h b/src/include/access/transam.h index 83ec3f19797..f979a065f9f 100644 --- a/src/include/access/transam.h +++ b/src/include/access/transam.h @@ -71,18 +71,21 @@ /* ---------- * 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 /* diff --git a/src/include/catalog/unused_oids b/src/include/catalog/unused_oids index c5fc378ae34..b5cafe0f3d3 100755 --- a/src/include/catalog/unused_oids +++ b/src/include/catalog/unused_oids @@ -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}) diff --git a/src/include/utils/fmgrtab.h b/src/include/utils/fmgrtab.h index 6122ed3e978..72671c38296 100644 --- a/src/include/utils/fmgrtab.h +++ b/src/include/utils/fmgrtab.h @@ -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 */ diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm index 68cf812f01d..0b7cdf8dd58 100644 --- a/src/tools/msvc/Solution.pm +++ b/src/tools/msvc/Solution.pm @@ -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); |