aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndres Freund <andres@anarazel.de>2018-12-13 14:50:57 -0800
committerAndres Freund <andres@anarazel.de>2018-12-13 14:50:57 -0800
commit09568ec3d31bbd4854b857e8d23c197ad5b25c77 (patch)
treea0a92a9e15aa980a0e168a42361624b315e3209d /src
parent84d514887f9ca673ae688d00f8b544e70f1ab270 (diff)
downloadpostgresql-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/Makefile4
-rw-r--r--src/backend/catalog/genbki.pl28
-rw-r--r--src/backend/utils/Gen_fmgrtab.pl12
-rw-r--r--src/backend/utils/fmgr/fmgr.c2
-rw-r--r--src/include/access/transam.h18
-rwxr-xr-xsrc/include/catalog/unused_oids8
-rw-r--r--src/include/utils/fmgrtab.h2
-rw-r--r--src/tools/msvc/Solution.pm2
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);