Skip to content
Snippets Groups Projects
Commit 630a8af5 authored by Tom Lane's avatar Tom Lane
Browse files

Fix handling of OID wraparound while in standalone mode.

If OID wraparound should occur while in standalone mode (unlikely but
possible), we want to advance the counter to FirstNormalObjectId not
FirstBootstrapObjectId.  Otherwise, user objects might be created with OIDs
in the system-reserved range.  That isn't immediately harmful but it poses
a risk of conflicts during future pg_upgrade operations.

Noted by Andres Freund.  Back-patch to all supported branches, since all of
them are supported sources for pg_upgrade operations.
parent 4a3613f9
No related branches found
No related tags found
No related merge requests found
...@@ -449,18 +449,18 @@ GetNewObjectId(void) ...@@ -449,18 +449,18 @@ GetNewObjectId(void)
* iterations in GetNewOid.) Note we are relying on unsigned comparison. * iterations in GetNewOid.) Note we are relying on unsigned comparison.
* *
* During initdb, we start the OID generator at FirstBootstrapObjectId, so * During initdb, we start the OID generator at FirstBootstrapObjectId, so
* we only enforce wrapping to that point when in bootstrap or standalone * we only wrap if before that point when in bootstrap or standalone mode.
* mode. The first time through this routine after normal postmaster * The first time through this routine after normal postmaster start, the
* start, the counter will be forced up to FirstNormalObjectId. This * counter will be forced up to FirstNormalObjectId. This mechanism
* mechanism leaves the OIDs between FirstBootstrapObjectId and * leaves the OIDs between FirstBootstrapObjectId and FirstNormalObjectId
* FirstNormalObjectId available for automatic assignment during initdb, * available for automatic assignment during initdb, while ensuring they
* while ensuring they will never conflict with user-assigned OIDs. * will never conflict with user-assigned OIDs.
*/ */
if (ShmemVariableCache->nextOid < ((Oid) FirstNormalObjectId)) if (ShmemVariableCache->nextOid < ((Oid) FirstNormalObjectId))
{ {
if (IsPostmasterEnvironment) if (IsPostmasterEnvironment)
{ {
/* wraparound in normal environment */ /* wraparound, or first post-initdb assignment, in normal mode */
ShmemVariableCache->nextOid = FirstNormalObjectId; ShmemVariableCache->nextOid = FirstNormalObjectId;
ShmemVariableCache->oidCount = 0; ShmemVariableCache->oidCount = 0;
} }
...@@ -469,8 +469,8 @@ GetNewObjectId(void) ...@@ -469,8 +469,8 @@ GetNewObjectId(void)
/* we may be bootstrapping, so don't enforce the full range */ /* we may be bootstrapping, so don't enforce the full range */
if (ShmemVariableCache->nextOid < ((Oid) FirstBootstrapObjectId)) if (ShmemVariableCache->nextOid < ((Oid) FirstBootstrapObjectId))
{ {
/* wraparound in standalone environment? */ /* wraparound in standalone mode (unlikely but possible) */
ShmemVariableCache->nextOid = FirstBootstrapObjectId; ShmemVariableCache->nextOid = FirstNormalObjectId;
ShmemVariableCache->oidCount = 0; ShmemVariableCache->oidCount = 0;
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment