mirror of
https://github.com/postgres/postgres.git
synced 2025-06-14 18:42:34 +03:00
Code review for CREATE OR REPLACE VIEW patch. Do things in a saner order to
result in hopefully-less-confusing error messages when the new definition isn't compatible with the old; minor other cleanup.
This commit is contained in:
@ -8,7 +8,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.273 2008/12/13 19:13:44 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/commands/tablecmds.c,v 1.274 2008/12/15 21:35:31 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -3459,9 +3459,7 @@ ATExecAddColumn(AlteredTableInfo *tab, Relation rel,
|
||||
attrdesc;
|
||||
HeapTuple reltup;
|
||||
FormData_pg_attribute attribute;
|
||||
int i;
|
||||
int minattnum,
|
||||
maxatts;
|
||||
int newattnum;
|
||||
char relkind;
|
||||
HeapTuple typeTuple;
|
||||
Oid typeOid;
|
||||
@ -3520,6 +3518,7 @@ ATExecAddColumn(AlteredTableInfo *tab, Relation rel,
|
||||
0, 0, 0);
|
||||
if (!HeapTupleIsValid(reltup))
|
||||
elog(ERROR, "cache lookup failed for relation %u", myrelid);
|
||||
relkind = ((Form_pg_class) GETSTRUCT(reltup))->relkind;
|
||||
|
||||
/*
|
||||
* this test is deliberately not attisdropped-aware, since if one tries to
|
||||
@ -3534,15 +3533,12 @@ ATExecAddColumn(AlteredTableInfo *tab, Relation rel,
|
||||
errmsg("column \"%s\" of relation \"%s\" already exists",
|
||||
colDef->colname, RelationGetRelationName(rel))));
|
||||
|
||||
minattnum = ((Form_pg_class) GETSTRUCT(reltup))->relnatts;
|
||||
relkind = ((Form_pg_class) GETSTRUCT(reltup))->relkind;
|
||||
maxatts = minattnum + 1;
|
||||
if (maxatts > MaxHeapAttributeNumber)
|
||||
newattnum = ((Form_pg_class) GETSTRUCT(reltup))->relnatts + 1;
|
||||
if (newattnum > MaxHeapAttributeNumber)
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_TOO_MANY_COLUMNS),
|
||||
errmsg("tables can have at most %d columns",
|
||||
MaxHeapAttributeNumber)));
|
||||
i = minattnum + 1;
|
||||
|
||||
typeTuple = typenameType(NULL, colDef->typename, &typmod);
|
||||
tform = (Form_pg_type) GETSTRUCT(typeTuple);
|
||||
@ -3551,6 +3547,7 @@ ATExecAddColumn(AlteredTableInfo *tab, Relation rel,
|
||||
/* make sure datatype is legal for a column */
|
||||
CheckAttributeType(colDef->colname, typeOid);
|
||||
|
||||
/* construct new attribute's pg_attribute entry */
|
||||
attribute.attrelid = myrelid;
|
||||
namestrcpy(&(attribute.attname), colDef->colname);
|
||||
attribute.atttypid = typeOid;
|
||||
@ -3558,7 +3555,7 @@ ATExecAddColumn(AlteredTableInfo *tab, Relation rel,
|
||||
attribute.attlen = tform->typlen;
|
||||
attribute.attcacheoff = -1;
|
||||
attribute.atttypmod = typmod;
|
||||
attribute.attnum = i;
|
||||
attribute.attnum = newattnum;
|
||||
attribute.attbyval = tform->typbyval;
|
||||
attribute.attndims = list_length(colDef->typename->arrayBounds);
|
||||
attribute.attstorage = tform->typstorage;
|
||||
@ -3578,7 +3575,7 @@ ATExecAddColumn(AlteredTableInfo *tab, Relation rel,
|
||||
/*
|
||||
* Update number of attributes in pg_class tuple
|
||||
*/
|
||||
((Form_pg_class) GETSTRUCT(reltup))->relnatts = maxatts;
|
||||
((Form_pg_class) GETSTRUCT(reltup))->relnatts = newattnum;
|
||||
|
||||
simple_heap_update(pgclass, &reltup->t_self, reltup);
|
||||
|
||||
@ -3635,9 +3632,13 @@ ATExecAddColumn(AlteredTableInfo *tab, Relation rel,
|
||||
* returned by AddRelationNewConstraints, so that the right thing happens
|
||||
* when a datatype's default applies.
|
||||
*
|
||||
* We skip this logic completely for views.
|
||||
* We skip this step completely for views. For a view, we can only get
|
||||
* here from CREATE OR REPLACE VIEW, which historically doesn't set up
|
||||
* defaults, not even for domain-typed columns. And in any case we mustn't
|
||||
* invoke Phase 3 on a view, since it has no storage.
|
||||
*/
|
||||
if (relkind != RELKIND_VIEW) {
|
||||
if (relkind != RELKIND_VIEW)
|
||||
{
|
||||
defval = (Expr *) build_column_default(rel, attribute.attnum);
|
||||
|
||||
if (!defval && GetDomainConstraints(typeOid) != NIL)
|
||||
@ -3680,7 +3681,7 @@ ATExecAddColumn(AlteredTableInfo *tab, Relation rel,
|
||||
/*
|
||||
* Add needed dependency entries for the new column.
|
||||
*/
|
||||
add_column_datatype_dependency(myrelid, i, attribute.atttypid);
|
||||
add_column_datatype_dependency(myrelid, newattnum, attribute.atttypid);
|
||||
}
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user