summaryrefslogtreecommitdiff
path: root/src/backend/commands/tablecmds.c
diff options
context:
space:
mode:
authorAndrew Dunstan <andrew@dunslane.net>2009-10-12 19:49:24 +0000
committerAndrew Dunstan <andrew@dunslane.net>2009-10-12 19:49:24 +0000
commitfaa1afc6c16631424579548a6e2fafb130f834f4 (patch)
treec41b0585535ab283ba0a1cc407b58e7be4548a33 /src/backend/commands/tablecmds.c
parent0adaf4cb312fe3eff83e786d6a0b53ae2cdc9302 (diff)
CREATE LIKE INCLUDING COMMENTS and STORAGE, and INCLUDING ALL shortcut. Itagaki Takahiro.
Diffstat (limited to 'src/backend/commands/tablecmds.c')
-rw-r--r--src/backend/commands/tablecmds.c63
1 files changed, 62 insertions, 1 deletions
diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c
index 2d728991b67..a0d3f41886e 100644
--- a/src/backend/commands/tablecmds.c
+++ b/src/backend/commands/tablecmds.c
@@ -8,7 +8,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.301 2009/10/06 00:55:26 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.302 2009/10/12 19:49:24 adunstan Exp $
*
*-------------------------------------------------------------------------
*/
@@ -39,6 +39,7 @@
#include "catalog/storage.h"
#include "catalog/toasting.h"
#include "commands/cluster.h"
+#include "commands/comment.h"
#include "commands/defrem.h"
#include "commands/sequence.h"
#include "commands/tablecmds.h"
@@ -332,6 +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);
/* ----------------------------------------------------------------
@@ -1100,6 +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
+ */
+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 "???";
+ }
+}
+
/*----------
* MergeAttributes
* Returns new schema given initial schema and superclasses.
@@ -1168,6 +1189,7 @@ 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 */
@@ -1323,6 +1345,18 @@ MergeAttributes(List *schema, List *supers, bool istemp,
errdetail("%s versus %s",
TypeNameToString(def->typeName),
format_type_be(attribute->atttypid))));
+
+ /* Copy storage parameter */
+ if (def->storage == 0)
+ def->storage = attribute->attstorage;
+ else if (def->storage != attribute->attstorage)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("inherited column \"%s\" has a storage parameter conflict",
+ attributeName),
+ errdetail("%s versus %s", storage_name(def->storage),
+ storage_name(attribute->attstorage))));
+
def->inhcount++;
/* Merge of NOT NULL constraints = OR 'em together */
def->is_not_null |= attribute->attnotnull;
@@ -1344,6 +1378,7 @@ MergeAttributes(List *schema, List *supers, bool istemp,
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;
}
@@ -1481,6 +1516,18 @@ MergeAttributes(List *schema, List *supers, bool istemp,
errdetail("%s versus %s",
TypeNameToString(def->typeName),
TypeNameToString(newdef->typeName))));
+
+ /* Copy storage parameter */
+ if (def->storage == 0)
+ def->storage = newdef->storage;
+ else if (newdef->storage != 0 && def->storage != newdef->storage)
+ ereport(ERROR,
+ (errcode(ERRCODE_DATATYPE_MISMATCH),
+ errmsg("column \"%s\" has a storage parameter conflict",
+ attributeName),
+ errdetail("%s versus %s", storage_name(def->storage),
+ storage_name(newdef->storage))));
+
/* Mark the column as locally defined */
def->is_local = true;
/* Merge of NOT NULL constraints = OR 'em together */
@@ -1533,6 +1580,20 @@ 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;