*
*
* IDENTIFICATION
- * $Header: /cvsroot/pgsql/src/backend/commands/tablecmds.c,v 1.5 2002/04/19 23:13:54 tgl Exp $
+ * $Header: /cvsroot/pgsql/src/backend/commands/tablecmds.c,v 1.6 2002/04/22 21:46:11 tgl Exp $
*
*-------------------------------------------------------------------------
*/
{
Relation rel;
int newtarget = 1;
- char newstorage = 'x';
- char *storagemode;
+ char newstorage = 'p';
Relation attrelation;
HeapTuple tuple;
+ Form_pg_attribute attrtuple;
rel = heap_open(myrelid, AccessExclusiveLock);
else if (*flagType == 'M')
{
/* STORAGE */
- Assert(IsA(flagValue, Value));
+ char *storagemode;
+ Assert(IsA(flagValue, String));
storagemode = strVal(flagValue);
+
if (strcasecmp(storagemode, "plain") == 0)
newstorage = 'p';
else if (strcasecmp(storagemode, "external") == 0)
if (!HeapTupleIsValid(tuple))
elog(ERROR, "ALTER TABLE: relation \"%s\" has no column \"%s\"",
RelationGetRelationName(rel), colName);
+ attrtuple = (Form_pg_attribute) GETSTRUCT(tuple);
- if (((Form_pg_attribute) GETSTRUCT(tuple))->attnum < 0)
+ if (attrtuple->attnum < 0)
elog(ERROR, "ALTER TABLE: cannot change system attribute \"%s\"",
colName);
/*
* Now change the appropriate field
*/
if (*flagType == 'S')
- ((Form_pg_attribute) GETSTRUCT(tuple))->attstattarget = newtarget;
- else
+ attrtuple->attstattarget = newtarget;
+ else if (*flagType == 'M')
{
- if ((newstorage == 'p') ||
- (((Form_pg_attribute) GETSTRUCT(tuple))->attlen == -1))
- ((Form_pg_attribute) GETSTRUCT(tuple))->attstorage = newstorage;
+ /*
+ * safety check: do not allow toasted storage modes unless column
+ * datatype is TOAST-aware. We assume the datatype's typstorage
+ * will be 'p' if and only if it ain't TOAST-aware.
+ */
+ if (newstorage == 'p' || get_typstorage(attrtuple->atttypid) != 'p')
+ attrtuple->attstorage = newstorage;
else
- {
- elog(ERROR,
- "ALTER TABLE: Fixed-length columns can only have storage \"plain\"");
- }
+ elog(ERROR, "ALTER TABLE: Column datatype %s can only have storage \"plain\"",
+ format_type_be(attrtuple->atttypid));
}
+
simple_heap_update(attrelation, &tuple->t_self, tuple);
/* keep system catalog indices current */