mirror of
https://github.com/postgres/postgres.git
synced 2025-11-07 19:06:32 +03:00
ALTER TABLE DROP COLUMN works. Patch by Christopher Kings-Lynne,
code review by Tom Lane. Remaining issues: functions that take or return tuple types are likely to break if one drops (or adds!) a column in the table defining the type. Need to think about what to do here. Along the way: some code review for recent COPY changes; mark system columns attnotnull = true where appropriate, per discussion a month ago.
This commit is contained in:
@@ -15,7 +15,7 @@
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/optimizer/prep/preptlist.c,v 1.53 2002/06/20 20:29:31 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/optimizer/prep/preptlist.c,v 1.54 2002/08/02 18:15:06 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -165,6 +165,8 @@ expand_targetlist(List *tlist, int command_type,
|
||||
*
|
||||
* For UPDATE, generate a Var reference to the existing value of
|
||||
* the attribute, so that it gets copied to the new tuple.
|
||||
* But generate a NULL for dropped columns (we want to drop any
|
||||
* old values).
|
||||
*/
|
||||
Oid atttype = att_tup->atttypid;
|
||||
int32 atttypmod = att_tup->atttypmod;
|
||||
@@ -182,11 +184,21 @@ expand_targetlist(List *tlist, int command_type,
|
||||
false);
|
||||
break;
|
||||
case CMD_UPDATE:
|
||||
new_expr = (Node *) makeVar(result_relation,
|
||||
attrno,
|
||||
atttype,
|
||||
atttypmod,
|
||||
0);
|
||||
/* Insert NULLs for dropped columns */
|
||||
if (att_tup->attisdropped)
|
||||
new_expr = (Node *) makeConst(atttype,
|
||||
att_tup->attlen,
|
||||
(Datum) 0,
|
||||
true, /* isnull */
|
||||
att_tup->attbyval,
|
||||
false, /* not a set */
|
||||
false);
|
||||
else
|
||||
new_expr = (Node *) makeVar(result_relation,
|
||||
attrno,
|
||||
atttype,
|
||||
atttypmod,
|
||||
0);
|
||||
break;
|
||||
default:
|
||||
elog(ERROR, "expand_targetlist: unexpected command_type");
|
||||
@@ -210,7 +222,8 @@ expand_targetlist(List *tlist, int command_type,
|
||||
* the end of the new tlist, making sure they have resnos higher than
|
||||
* the last real attribute. (Note: although the rewriter already did
|
||||
* such renumbering, we have to do it again here in case we are doing
|
||||
* an UPDATE in an inheritance child table with more columns.)
|
||||
* an UPDATE in a table with dropped columns, or an inheritance child
|
||||
* table with extra columns.)
|
||||
*/
|
||||
while (tlist)
|
||||
{
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
*
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $Header: /cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v 1.74 2002/06/20 20:29:31 momjian Exp $
|
||||
* $Header: /cvsroot/pgsql/src/backend/optimizer/prep/prepunion.c,v 1.75 2002/08/02 18:15:06 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -797,9 +797,16 @@ adjust_inherited_attrs_mutator(Node *node,
|
||||
{
|
||||
var->varno = context->new_rt_index;
|
||||
if (var->varattno > 0)
|
||||
var->varattno = get_attnum(context->new_relid,
|
||||
get_attname(context->old_relid,
|
||||
var->varattno));
|
||||
{
|
||||
char *attname = get_attname(context->old_relid,
|
||||
var->varattno);
|
||||
|
||||
var->varattno = get_attnum(context->new_relid, attname);
|
||||
if (var->varattno == InvalidAttrNumber)
|
||||
elog(ERROR, "Relation \"%s\" has no column \"%s\"",
|
||||
get_rel_name(context->new_relid), attname);
|
||||
pfree(attname);
|
||||
}
|
||||
}
|
||||
return (Node *) var;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user