From 306ada82c2d73cc09a42ef2ac2934722c0674b80 Mon Sep 17 00:00:00 2001 From: Peter Eisentraut <peter_e@gmx.net> Date: Mon, 24 Jan 2000 23:40:35 +0000 Subject: [PATCH] Removed alter table drop column. --- src/backend/commands/command.c | 200 +-------------------------------- 1 file changed, 2 insertions(+), 198 deletions(-) diff --git a/src/backend/commands/command.c b/src/backend/commands/command.c index 5c29dd692ac..ac7226c959a 100644 --- a/src/backend/commands/command.c +++ b/src/backend/commands/command.c @@ -7,7 +7,7 @@ * * * IDENTIFICATION - * $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.64 2000/01/22 14:20:45 petere Exp $ + * $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.65 2000/01/24 23:40:35 petere Exp $ * * NOTES * The PortalExecutorHeapMemory crap needs to be eliminated @@ -672,209 +672,13 @@ drop_default(Oid relid, int16 attnum) /* * ALTER TABLE DROP COLUMN - * - * Strategy: - * - permission/sanity checks - * - create a new table _ATDC<name> with all attributes minus the desired one - * - copy over all the data - * - make the column defaults point to the new table - * - kill the old table - * - rename the intermediate table back */ void AlterTableDropColumn(const char *relationName, bool inh, const char *colName, int behavior) { - Relation oldrel, newrel, defrel; - HeapTuple tuple; - TupleDesc olddesc, newdesc, defdsc; - int16 dropattnum, oldnumatts; - Oid oldrel_oid, newrel_oid; - char tmpname[NAMEDATALEN]; - int16 i; - HeapScanDesc scan; - ScanKeyData scankey; - - if (!allowSystemTableMods && IsSystemRelationName(relationName)) - elog(ERROR, "ALTER TABLE: relation \"%s\" is a system catalog", - relationName); -#ifndef NO_SECURITY - if (!pg_ownercheck(UserName, relationName, RELNAME)) - elog(ERROR, "ALTER TABLE: permission denied"); -#endif - - oldrel = heap_openr(relationName, AccessExclusiveLock); - if (oldrel->rd_rel->relkind != RELKIND_RELATION) - { - heap_close(oldrel, AccessExclusiveLock); - elog(ERROR, "ALTER TABLE: relation %s is not a table", relationName); - } - - oldrel_oid = ObjectIdGetDatum(RelationGetRelid(oldrel)); - oldnumatts = RelationGetNumberOfAttributes(oldrel); - - if (oldnumatts==1) - { - heap_close(oldrel, AccessExclusiveLock); - elog(ERROR, "ALTER TABLE: relation %s only has one column", relationName); - } - -/* What to do here? */ -/* - if (length(find_all_inheritors(RelationGetRelid(oldrel)))>0) - elog(ERROR, "ALTER TABLE: cannot drop a column on table that is inherited from"); -*/ - /* - * get the number of the attribute - */ - tuple = SearchSysCacheTuple(ATTNAME, oldrel_oid, NameGetDatum(namein(colName)), 0, 0); - if (!HeapTupleIsValid(tuple)) - { - heap_close(oldrel, AccessExclusiveLock); - elog(ERROR, "ALTER TABLE: relation \"%s\" has no column \"%s\"", - relationName, colName); - } - - dropattnum = ((Form_pg_attribute) GETSTRUCT(tuple))->attnum; - - if (snprintf(tmpname, NAMEDATALEN, "_ATDC%s", relationName)==-1) - { - heap_close(oldrel, AccessExclusiveLock); - elog(ERROR, "AlterTableDropColumn: relation name too long"); - } - - /* - * Build descriptor for new relation - */ - olddesc = RelationGetDescr(oldrel); - - newdesc = CreateTemplateTupleDesc(oldnumatts-1); - for(i = 1; i < dropattnum; i++) - { - Form_pg_attribute att = olddesc->attrs[i-1]; - TupleDescInitEntry(newdesc, i, nameout(&(att->attname)), - att->atttypid, att->atttypmod, - att->attnelems, att->attisset); - /* the above function doesn't take care of these two */ - newdesc->attrs[i-1]->attnotnull = att->attnotnull; - newdesc->attrs[i-1]->atthasdef = att->atthasdef; - } - - for(i = dropattnum; i <= oldnumatts-1; i++) - { - Form_pg_attribute att = olddesc->attrs[i]; - TupleDescInitEntry(newdesc, i, nameout(&(att->attname)), - att->atttypid, att->atttypmod, - att->attnelems, att->attisset); - /* the above function doesn't take care of these two */ - newdesc->attrs[i-1]->attnotnull = att->attnotnull; - newdesc->attrs[i-1]->atthasdef = att->atthasdef; - } - - /* Create the new table */ - newrel_oid = heap_create_with_catalog(tmpname, newdesc, RELKIND_RELATION, false); - if (newrel_oid == InvalidOid) - { - heap_close(oldrel, AccessExclusiveLock); - elog(ERROR, "ALTER TABLE: something went wrong"); - } - - /* Make the new table visible */ - CommandCounterIncrement(); - - /* - * Copy over the data - */ - newrel = heap_open(newrel_oid, AccessExclusiveLock); - - scan = heap_beginscan(oldrel, false, SnapshotNow, 0, NULL); - while (HeapTupleIsValid(tuple = heap_getnext(scan, 0))) - { - bool isnull; - Datum *new_record; - bool *new_record_nulls; - HeapTuple new_tuple; - - new_record = palloc((oldnumatts-1) * sizeof(*new_record)); - new_record_nulls = palloc((oldnumatts-1) * sizeof(*new_record_nulls)); - - for(i = 1; i < dropattnum; i++) - { - new_record[i-1] = heap_getattr(tuple, i, olddesc, &isnull); - new_record_nulls[i-1] = isnull ? 'n' : ' '; - } - for(i = dropattnum+1; i <= oldnumatts; i++) - { - new_record[i-2] = heap_getattr(tuple, i, olddesc, &isnull); - new_record_nulls[i-2] = isnull ? 'n' : ' '; - } - - new_tuple = heap_formtuple(newdesc, new_record, new_record_nulls); - Assert(new_tuple); - - if (heap_insert(newrel, new_tuple) == InvalidOid) - elog(ERROR, "AlterTableDropColumn: heap_insert failed"); - - pfree(new_record); - pfree(new_record_nulls); - } - heap_endscan(scan); - - heap_close(newrel, NoLock); - heap_close(oldrel, NoLock); - - /* - * Move defaults over to the new table - */ - defrel = heap_openr(AttrDefaultRelationName, AccessExclusiveLock); - defdsc = RelationGetDescr(defrel); - - /* look for all entries referencing the old table */ - ScanKeyEntryInitialize(&scankey, 0x0, Anum_pg_attrdef_adrelid, F_OIDEQ, - ObjectIdGetDatum(oldrel_oid)); - scan = heap_beginscan(defrel, false, SnapshotNow, 1, &scankey); - while(HeapTupleIsValid(tuple = heap_getnext(scan, false))) - { - HeapTuple newtuple; - int2 attrnum; - Relation irelations[Num_pg_attrdef_indices]; - - attrnum = ((Form_pg_attrdef) GETSTRUCT(tuple))->adnum; - - /* remove the entry about the dropped column */ - if (attrnum == dropattnum) - { - heap_delete(defrel, &tuple->t_self, NULL); - continue; - } - - newtuple = heap_copytuple(tuple); - - if (attrnum > dropattnum) - ((Form_pg_attrdef) GETSTRUCT(newtuple))->adnum--; - - /* make it point to the new table */ - ((Form_pg_attrdef) GETSTRUCT(newtuple))->adrelid = newrel_oid; - heap_update(defrel, &tuple->t_self, newtuple, NULL); - - /* keep the system catalog indices current */ - CatalogOpenIndices(Num_pg_attrdef_indices, Name_pg_attrdef_indices, irelations); - CatalogIndexInsert(irelations, Num_pg_attrdef_indices, defrel, newtuple); - CatalogCloseIndices(Num_pg_attrdef_indices, irelations); - } - heap_endscan(scan); - heap_close(defrel, NoLock); - - CommandCounterIncrement(); - - /* make the old table disappear */ - heap_drop_with_catalog(relationName); - CommandCounterIncrement(); - - /* set back original name */ - TypeRename(tmpname, relationName); - renamerel(tmpname, relationName); + elog(ERROR, "ALTER TABLE / DROP COLUMN is not implemented"); } -- GitLab