]> granicus.if.org Git - postgresql/commitdiff
Honor OID status of CREATE LIKE'd tables
authorBruce Momjian <bruce@momjian.us>
Mon, 20 Apr 2015 20:11:25 +0000 (16:11 -0400)
committerBruce Momjian <bruce@momjian.us>
Mon, 20 Apr 2015 20:11:25 +0000 (16:11 -0400)
Previously, tables created by CREATE LIKE never had OIDs.

Report by Tom Lane

src/backend/parser/parse_utilcmd.c

index 1fc8c2cbe1eac77eb05094784867f1a4272a67a0..f66af41b1a35c293da414da96b4000b28f15f79a 100644 (file)
@@ -56,6 +56,7 @@
 #include "rewrite/rewriteManip.h"
 #include "utils/acl.h"
 #include "utils/builtins.h"
+#include "utils/guc.h"
 #include "utils/lsyscache.h"
 #include "utils/rel.h"
 #include "utils/syscache.h"
@@ -222,7 +223,7 @@ transformCreateStmt(CreateStmt *stmt, const char *queryString)
        cxt.blist = NIL;
        cxt.alist = NIL;
        cxt.pkey = NULL;
-       cxt.hasoids = interpretOidsOption(stmt->options, true);
+       cxt.hasoids = default_with_oids;
 
        Assert(!stmt->ofTypename || !stmt->inhRelations);       /* grammar enforces */
 
@@ -281,6 +282,17 @@ transformCreateStmt(CreateStmt *stmt, const char *queryString)
         * Output results.
         */
        stmt->tableElts = cxt.columns;
+       /*
+        * Add WITH/WITHOUT OIDS, if necessary.  A literal statement-specified
+        * WITH/WITHOUT OIDS will still take precedence because the first
+        * matching "oids" in "options" is used.
+        */
+       if (cxt.hasoids && !interpretOidsOption(stmt->options, true))
+               stmt->options = lappend(stmt->options, makeDefElem("oids",
+                                                               (Node *)makeInteger(TRUE)));
+       else if (!cxt.hasoids && interpretOidsOption(stmt->options, true))
+               stmt->options = lappend(stmt->options, makeDefElem("oids",
+                                                               (Node *)makeInteger(FALSE)));
        stmt->constraints = cxt.ckconstraints;
 
        result = lappend(cxt.blist, stmt);
@@ -849,6 +861,8 @@ transformTableLikeClause(CreateStmtContext *cxt, TableLikeClause *table_like_cla
                }
        }
 
+       cxt->hasoids = relation->rd_rel->relhasoids;
+
        /*
         * Copy CHECK constraints if requested, being careful to adjust attribute
         * numbers so they match the child.