OSDN Git Service

Code review for LIKE INCLUDING patch --- clean up some cosmetic and not
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 13 Oct 2009 00:53:08 +0000 (00:53 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 13 Oct 2009 00:53:08 +0000 (00:53 +0000)
so cosmetic stuff.

doc/src/sgml/ref/create_table.sgml
src/backend/access/common/tupdesc.c
src/backend/catalog/pg_constraint.c
src/backend/commands/sequence.c
src/backend/commands/tablecmds.c
src/backend/commands/view.c
src/backend/nodes/copyfuncs.c
src/backend/nodes/equalfuncs.c
src/backend/nodes/outfuncs.c
src/backend/parser/parse_utilcmd.c
src/include/nodes/parsenodes.h

index a63333c..5768c4c 100644 (file)
@@ -1,5 +1,5 @@
 <!--
-$PostgreSQL: pgsql/doc/src/sgml/ref/create_table.sgml,v 1.117 2009/10/12 19:49:24 adunstan Exp $
+$PostgreSQL: pgsql/doc/src/sgml/ref/create_table.sgml,v 1.118 2009/10/13 00:53:07 tgl Exp $
 PostgreSQL documentation
 -->
 
@@ -231,7 +231,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE <replaceable class="PAR
      </para>
 
      <para>
-      Column storage parameters are also copied from parent tables.
+      Column <literal>STORAGE</> settings are also copied from parent tables.
      </para>
 
 <!--
@@ -285,25 +285,27 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE <replaceable class="PAR
       specified.
      </para>
      <para>
-      Storage parameters for the copied column definitions will only be copied
-      if <literal>INCLUDING STORAGE</literal> is specified.  The default
-      behavior is to exclude storage parameters, resulting in the copied
-      columns in the new table having type-specific default parameters.  For
-      more on storage parameters, see <xref linkend="storage-toast">.
+      <literal>STORAGE</> settings for the copied column definitions will only
+      be copied if <literal>INCLUDING STORAGE</literal> is specified.  The
+      default behavior is to exclude <literal>STORAGE</> settings, resulting
+      in the copied columns in the new table having type-specific default
+      settings.  For more on <literal>STORAGE</> settings, see
+      <xref linkend="storage-toast">.
      </para>
      <para>
-      Comments for the copied column, constraint, index and columns of index
-         definitions will only be copied if <literal>INCLUDING COMMENTS</literal>
-         is specified. The default behavior is to exclude comments, resulting in
-         the copied columns and constraints in the new table having no comments.
+      Comments for the copied columns, constraints, and indexes
+      will only be copied if <literal>INCLUDING COMMENTS</literal>
+      is specified. The default behavior is to exclude comments, resulting in
+      the copied columns and constraints in the new table having no comments.
      </para>
      <para>
       <literal>INCLUDING ALL</literal> is an abbreviated form of
       <literal>INCLUDING DEFAULTS INCLUDING CONSTRAINTS INCLUDING INDEXES INCLUDING STORAGE INCLUDING COMMENTS</literal>.
      </para>
      <para>
-      Note also that unlike <literal>INHERITS</literal>, copied columns and
-      constraints are not merged with similarly named columns and constraints.
+      Note also that unlike <literal>INHERITS</literal>, columns and
+      constraints copied by <literal>LIKE</> are not merged with similarly
+      named columns and constraints.
       If the same name is specified explicitly or in another
       <literal>LIKE</literal> clause, an error is signalled.
      </para>
@@ -752,14 +754,14 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE <replaceable class="PAR
      <para>
      Enables or disables the autovacuum daemon on a particular table.
      If true, the autovacuum daemon will initiate a <command>VACUUM</> operation
-     on a particular table when the number of updated or deleted tuples exceeds 
-     <literal>autovacuum_vacuum_threshold</> plus 
-     <literal>autovacuum_vacuum_scale_factor</> times the number of live tuples 
+     on a particular table when the number of updated or deleted tuples exceeds
+     <literal>autovacuum_vacuum_threshold</> plus
+     <literal>autovacuum_vacuum_scale_factor</> times the number of live tuples
      currently estimated to be in the relation.
      Similarly, it will initiate an <command>ANALYZE</> operation when the
      number of inserted, updated or deleted tuples exceeds
-     <literal>autovacuum_analyze_threshold</> plus 
-     <literal>autovacuum_analyze_scale_factor</> times the number of live tuples 
+     <literal>autovacuum_analyze_threshold</> plus
+     <literal>autovacuum_analyze_scale_factor</> times the number of live tuples
      currently estimated to be in the relation.
      If false, this table will not be autovacuumed, except to prevent
      transaction Id wraparound. See <xref linkend="vacuum-for-wraparound"> for
@@ -775,7 +777,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE <replaceable class="PAR
     <listitem>
      <para>
      Minimum number of updated or deleted tuples before initiate a
-     <command>VACUUM</> operation on a particular table. 
+     <command>VACUUM</> operation on a particular table.
      </para>
     </listitem>
    </varlistentry>
@@ -834,7 +836,7 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } ] TABLE <replaceable class="PAR
      <para>
      Custom <xref linkend="guc-vacuum-freeze-min-age"> parameter. Note that
      autovacuum will ignore attempts to set a per-table
-     <literal>autovacuum_freeze_min_age</> larger than the half system-wide 
+     <literal>autovacuum_freeze_min_age</> larger than the half system-wide
      <xref linkend="guc-autovacuum-freeze-max-age"> setting.
      </para>
     </listitem>
index f19fc9b..d49d032 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/access/common/tupdesc.c,v 1.129 2009/10/12 19:49:24 adunstan Exp $
+ *       $PostgreSQL: pgsql/src/backend/access/common/tupdesc.c,v 1.130 2009/10/13 00:53:07 tgl Exp $
  *
  * NOTES
  *       some of the executor utility code such as "ExecTypeFromTL" should be
@@ -553,13 +553,15 @@ BuildDescForRelation(List *schema)
                TupleDescInitEntry(desc, attnum, attname,
                                                   atttypid, atttypmod, attdim);
 
+               /* Override TupleDescInitEntry's settings as requested */
+               if (entry->storage)
+                       desc->attrs[attnum - 1]->attstorage = entry->storage;
+
                /* Fill in additional stuff not handled by TupleDescInitEntry */
                desc->attrs[attnum - 1]->attnotnull = entry->is_not_null;
                has_not_null |= entry->is_not_null;
                desc->attrs[attnum - 1]->attislocal = entry->is_local;
                desc->attrs[attnum - 1]->attinhcount = entry->inhcount;
-               if (entry->storage)
-                       desc->attrs[attnum - 1]->attstorage = entry->storage;
        }
 
        if (has_not_null)
index 9aa1351..d92bbf8 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/catalog/pg_constraint.c,v 1.48 2009/10/12 19:49:24 adunstan Exp $
+ *       $PostgreSQL: pgsql/src/backend/catalog/pg_constraint.c,v 1.49 2009/10/13 00:53:07 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -705,7 +705,8 @@ AlterConstraintNamespaces(Oid ownerId, Oid oldNspId,
 
 /*
  * GetConstraintByName
- *             Find a constraint with the specified name.
+ *             Find a constraint on the specified relation with the specified name.
+ *             Returns constraint's OID.
  */
 Oid
 GetConstraintByName(Oid relid, const char *conname)
@@ -725,7 +726,8 @@ GetConstraintByName(Oid relid, const char *conname)
 
        ScanKeyInit(&skey[0],
                                Anum_pg_constraint_conrelid,
-                               BTEqualStrategyNumber, F_OIDEQ, relid);
+                               BTEqualStrategyNumber, F_OIDEQ,
+                               ObjectIdGetDatum(relid));
 
        scan = systable_beginscan(pg_constraint, ConstraintRelidIndexId, true,
                                                          SnapshotNow, 1, skey);
@@ -737,28 +739,22 @@ GetConstraintByName(Oid relid, const char *conname)
                if (strcmp(NameStr(con->conname), conname) == 0)
                {
                        if (OidIsValid(conOid))
-                       {
-                               char *relname = get_rel_name(relid);
                                ereport(ERROR,
                                                (errcode(ERRCODE_DUPLICATE_OBJECT),
-                                errmsg("table \"%s\" has multiple constraints named \"%s\"",
-                                       (relname ? relname : "(unknown)"), conname)));
-                       }
+                                                errmsg("table \"%s\" has multiple constraints named \"%s\"",
+                                                               get_rel_name(relid), conname)));
                        conOid = HeapTupleGetOid(tuple);
                }
        }
 
        systable_endscan(scan);
 
-       /* If no constraint exists for the relation specified, notify user */
+       /* If no such constraint exists, complain */
        if (!OidIsValid(conOid))
-       {
-               char *relname = get_rel_name(relid);
                ereport(ERROR,
                                (errcode(ERRCODE_UNDEFINED_OBJECT),
                                 errmsg("constraint \"%s\" for table \"%s\" does not exist",
-                                               conname, (relname ? relname : "(unknown)"))));
-       }
+                                               conname, get_rel_name(relid))));
 
        heap_close(pg_constraint, AccessShareLock);
 
index 3f535ae..5f590f0 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/sequence.c,v 1.161 2009/07/16 06:33:42 petere Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/sequence.c,v 1.162 2009/10/13 00:53:07 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -132,6 +132,7 @@ DefineSequence(CreateSeqStmt *seq)
                coldef->inhcount = 0;
                coldef->is_local = true;
                coldef->is_not_null = true;
+               coldef->storage = 0;
                coldef->raw_default = NULL;
                coldef->cooked_default = NULL;
                coldef->constraints = NIL;
index a0d3f41..ce7d14c 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.302 2009/10/12 19:49:24 adunstan Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.303 2009/10/13 00:53:07 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -333,7 +333,7 @@ static void ATExecAddInherit(Relation rel, RangeVar *parent);
 static void ATExecDropInherit(Relation rel, RangeVar *parent);
 static void copy_relation_data(SMgrRelation rel, SMgrRelation dst,
                                   ForkNumber forkNum, bool istemp);
-static const char * storage_name(char c);
+static const char *storage_name(char c);
 
 
 /* ----------------------------------------------------------------
@@ -1102,22 +1102,25 @@ truncate_check_rel(Relation rel)
        CheckTableNotInUse(rel, "TRUNCATE");
 }
 
-
-/*----------------
+/*
  * storage_name
- *    returns a name corresponding to a storage enum value
- * For use in error messages
+ *    returns the name corresponding to a typstorage/attstorage enum value
  */
 static const char *
 storage_name(char c)
 {
        switch (c)
        {
-               case 'p': return "PLAIN";
-               case 'm': return "MAIN";
-               case 'x': return "EXTENDED";
-               case 'e': return "EXTERNAL";
-               default: return "???";
+               case 'p':
+                       return "PLAIN";
+               case 'm':
+                       return "MAIN";
+               case 'x':
+                       return "EXTENDED";
+               case 'e':
+                       return "EXTERNAL";
+               default:
+                       return "???";
        }
 }
 
@@ -1189,7 +1192,6 @@ MergeAttributes(List *schema, List *supers, bool istemp,
        List       *constraints = NIL;
        int                     parentsWithOids = 0;
        bool            have_bogus_defaults = false;
-       bool            have_bogus_comments = false;
        int                     child_attno;
        static Node     bogus_marker = { 0 };           /* marks conflicting defaults */
 
@@ -1354,7 +1356,8 @@ MergeAttributes(List *schema, List *supers, bool istemp,
                                                        (errcode(ERRCODE_DATATYPE_MISMATCH),
                                                errmsg("inherited column \"%s\" has a storage parameter conflict",
                                                           attributeName),
-                                                          errdetail("%s versus %s", storage_name(def->storage),
+                                                          errdetail("%s versus %s",
+                                                                                storage_name(def->storage),
                                                                                 storage_name(attribute->attstorage))));
 
                                def->inhcount++;
@@ -1375,10 +1378,10 @@ MergeAttributes(List *schema, List *supers, bool istemp,
                                def->inhcount = 1;
                                def->is_local = false;
                                def->is_not_null = attribute->attnotnull;
+                               def->storage = attribute->attstorage;
                                def->raw_default = NULL;
                                def->cooked_default = NULL;
                                def->constraints = NIL;
-                               def->storage = attribute->attstorage;
                                inhSchema = lappend(inhSchema, def);
                                newattno[parent_attno - 1] = ++child_attno;
                        }
@@ -1525,7 +1528,8 @@ MergeAttributes(List *schema, List *supers, bool istemp,
                                                        (errcode(ERRCODE_DATATYPE_MISMATCH),
                                                errmsg("column \"%s\" has a storage parameter conflict",
                                                           attributeName),
-                                                          errdetail("%s versus %s", storage_name(def->storage),
+                                                          errdetail("%s versus %s",
+                                                                                storage_name(def->storage),
                                                                                 storage_name(newdef->storage))));
 
                                /* Mark the column as locally defined */
@@ -1580,20 +1584,6 @@ MergeAttributes(List *schema, List *supers, bool istemp,
                }
        }
 
-       /* Raise an error if we found conflicting comments. */
-       if (have_bogus_comments)
-       {
-               foreach(entry, schema)
-               {
-                       ColumnDef  *def = lfirst(entry);
-
-                       if (def->cooked_default == &bogus_marker)
-                               ereport(ERROR,
-                                               (errcode(ERRCODE_INVALID_COLUMN_DEFINITION),
-                                 errmsg("column \"%s\" inherits conflicting comments", def->colname)));
-               }
-       }
-
        *supOids = parentOids;
        *supconstr = constraints;
        *supOidCount = parentsWithOids;
@@ -3903,6 +3893,7 @@ ATPrepAddOids(List **wqueue, Relation rel, bool recurse, AlterTableCmd *cmd)
                cdef->inhcount = 0;
                cdef->is_local = true;
                cdef->is_not_null = true;
+               cdef->storage = 0;
                cmd->def = (Node *) cdef;
        }
        ATPrepAddColumn(wqueue, rel, recurse, cmd);
index e235e41..ab01850 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/commands/view.c,v 1.117 2009/07/16 06:33:42 petere Exp $
+ *       $PostgreSQL: pgsql/src/backend/commands/view.c,v 1.118 2009/10/13 00:53:07 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -124,6 +124,7 @@ DefineVirtualRelation(const RangeVar *relation, List *tlist, bool replace)
                        def->inhcount = 0;
                        def->is_local = true;
                        def->is_not_null = false;
+                       def->storage = 0;
                        def->raw_default = NULL;
                        def->cooked_default = NULL;
                        def->constraints = NIL;
index efbb0f5..49360e5 100644 (file)
@@ -15,7 +15,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.446 2009/10/12 20:39:39 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/nodes/copyfuncs.c,v 1.447 2009/10/13 00:53:08 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2115,6 +2115,7 @@ _copyColumnDef(ColumnDef *from)
        COPY_SCALAR_FIELD(inhcount);
        COPY_SCALAR_FIELD(is_local);
        COPY_SCALAR_FIELD(is_not_null);
+       COPY_SCALAR_FIELD(storage);
        COPY_NODE_FIELD(raw_default);
        COPY_NODE_FIELD(cooked_default);
        COPY_NODE_FIELD(constraints);
index de5497c..cfa0a40 100644 (file)
@@ -22,7 +22,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/nodes/equalfuncs.c,v 1.368 2009/10/12 20:39:40 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/nodes/equalfuncs.c,v 1.369 2009/10/13 00:53:08 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -2084,6 +2084,7 @@ _equalColumnDef(ColumnDef *a, ColumnDef *b)
        COMPARE_SCALAR_FIELD(inhcount);
        COMPARE_SCALAR_FIELD(is_local);
        COMPARE_SCALAR_FIELD(is_not_null);
+       COMPARE_SCALAR_FIELD(storage);
        COMPARE_NODE_FIELD(raw_default);
        COMPARE_NODE_FIELD(cooked_default);
        COMPARE_NODE_FIELD(constraints);
index e695273..45caaea 100644 (file)
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *       $PostgreSQL: pgsql/src/backend/nodes/outfuncs.c,v 1.368 2009/10/12 18:10:45 tgl Exp $
+ *       $PostgreSQL: pgsql/src/backend/nodes/outfuncs.c,v 1.369 2009/10/13 00:53:08 tgl Exp $
  *
  * NOTES
  *       Every node type that can appear in stored rules' parsetrees *must*
@@ -1885,6 +1885,7 @@ _outColumnDef(StringInfo str, ColumnDef *node)
        WRITE_INT_FIELD(inhcount);
        WRITE_BOOL_FIELD(is_local);
        WRITE_BOOL_FIELD(is_not_null);
+       WRITE_INT_FIELD(storage);
        WRITE_NODE_FIELD(raw_default);
        WRITE_NODE_FIELD(cooked_default);
        WRITE_NODE_FIELD(constraints);
index 7dfdd28..0398caf 100644 (file)
@@ -19,7 +19,7 @@
  * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- *     $PostgreSQL: pgsql/src/backend/parser/parse_utilcmd.c,v 2.27 2009/10/12 19:49:24 adunstan Exp $
+ *     $PostgreSQL: pgsql/src/backend/parser/parse_utilcmd.c,v 2.28 2009/10/13 00:53:08 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -642,6 +642,8 @@ transformInhRelation(ParseState *pstate, CreateStmtContext *cxt,
                /* Likewise, copy storage if requested */
                if (inhRelation->options & CREATE_TABLE_LIKE_STORAGE)
                        def->storage = attribute->attstorage;
+               else
+                       def->storage = 0;
 
                /* Likewise, copy comment if requested */
                if ((inhRelation->options & CREATE_TABLE_LIKE_COMMENTS) &&
index 7d7f6da..ba05f15 100644 (file)
@@ -13,7 +13,7 @@
  * Portions Copyright (c) 1996-2009, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.408 2009/10/12 20:39:42 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/nodes/parsenodes.h,v 1.409 2009/10/13 00:53:08 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -460,20 +460,20 @@ typedef struct ColumnDef
        int                     inhcount;               /* number of times column is inherited */
        bool            is_local;               /* column has local (non-inherited) def'n */
        bool            is_not_null;    /* NOT NULL constraint specified? */
-       char            storage;                /* storage parameter of column */
+       char            storage;                /* attstorage setting, or 0 for default */
        Node       *raw_default;        /* default value (untransformed parse tree) */
        Node       *cooked_default; /* default value (transformed expr tree) */
        List       *constraints;        /* other constraints on column */
 } ColumnDef;
 
 /*
- * inhRelation - Relations a CREATE TABLE is to inherit attributes of
+ * inhRelation - Relation a CREATE TABLE is to inherit attributes of
  */
 typedef struct InhRelation
 {
        NodeTag         type;
        RangeVar   *relation;
-       bits32          options;                /* bitmap of CreateStmtLikeOption */
+       bits32          options;                /* OR of CreateStmtLikeOption flags */
 } InhRelation;
 
 typedef enum CreateStmtLikeOption