Add comments warning against generalizing default_with_oids.
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 26 Apr 2015 01:37:39 +0000 (21:37 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 26 Apr 2015 01:38:06 +0000 (21:38 -0400)
pg_dump has historically assumed that default_with_oids affects only plain
tables and not other relkinds.  Conceivably we could make it apply to some
newly invented relkind if we did so from the get-go, but changing the
behavior for existing object types will break existing dump scripts.
Add code comments warning about this interaction.

Also, make sure that default_with_oids doesn't cause parse_utilcmd.c to
think that CREATE FOREIGN TABLE will create an OID column.  I think this is
only a latent bug right now, since we don't allow UNIQUE/PKEY constraints
in CREATE FOREIGN TABLE, but it's better to be consistent and future-proof.

src/backend/commands/tablecmds.c
src/backend/parser/parse_utilcmd.c

index 06e4332d2ac02b1ad382f489cda7021f219195ab..bedd8aeb782fa1c6b71e7e6e45773fe82c77f164 100644 (file)
@@ -579,6 +579,14 @@ DefineRelation(CreateStmt *stmt, char relkind, Oid ownerId,
         */
        descriptor = BuildDescForRelation(schema);
 
+       /*
+        * Notice that we allow OIDs here only for plain tables, even though some
+        * other relkinds can support them.  This is necessary because the
+        * default_with_oids GUC must apply only to plain tables and not any other
+        * relkind; doing otherwise would break existing pg_dump files.  We could
+        * allow explicit "WITH OIDS" while not allowing default_with_oids to
+        * affect other relkinds, but it would complicate interpretOidsOption().
+        */
        localHasOids = interpretOidsOption(stmt->options,
                                                                           (relkind == RELKIND_RELATION));
        descriptor->tdhasoid = (localHasOids || parentOidCount > 0);
index 1fc8c2cbe1eac77eb05094784867f1a4272a67a0..73924ae12e6338d87a670be005560f8f2933e94b 100644 (file)
@@ -222,7 +222,18 @@ transformCreateStmt(CreateStmt *stmt, const char *queryString)
        cxt.blist = NIL;
        cxt.alist = NIL;
        cxt.pkey = NULL;
-       cxt.hasoids = interpretOidsOption(stmt->options, true);
+
+       /*
+        * Notice that we allow OIDs here only for plain tables, even though
+        * foreign tables also support them.  This is necessary because the
+        * default_with_oids GUC must apply only to plain tables and not any other
+        * relkind; doing otherwise would break existing pg_dump files.  We could
+        * allow explicit "WITH OIDS" while not allowing default_with_oids to
+        * affect other relkinds, but it would complicate interpretOidsOption(),
+        * and right now there's no WITH OIDS option in CREATE FOREIGN TABLE
+        * anyway.
+        */
+       cxt.hasoids = interpretOidsOption(stmt->options, !cxt.isforeign);
 
        Assert(!stmt->ofTypename || !stmt->inhRelations);       /* grammar enforces */