Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 306ada8

Browse files
committed
Removed alter table drop column.
1 parent ca5771d commit 306ada8

File tree

1 file changed

+2
-198
lines changed

1 file changed

+2
-198
lines changed

src/backend/commands/command.c

Lines changed: 2 additions & 198 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
*
88
*
99
* IDENTIFICATION
10-
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.64 2000/01/22 14:20:45 petere Exp $
10+
* $Header: /cvsroot/pgsql/src/backend/commands/Attic/command.c,v 1.65 2000/01/24 23:40:35 petere Exp $
1111
*
1212
* NOTES
1313
* The PortalExecutorHeapMemory crap needs to be eliminated
@@ -672,209 +672,13 @@ drop_default(Oid relid, int16 attnum)
672672

673673
/*
674674
* ALTER TABLE DROP COLUMN
675-
*
676-
* Strategy:
677-
* - permission/sanity checks
678-
* - create a new table _ATDC<name> with all attributes minus the desired one
679-
* - copy over all the data
680-
* - make the column defaults point to the new table
681-
* - kill the old table
682-
* - rename the intermediate table back
683675
*/
684676
void
685677
AlterTableDropColumn(const char *relationName,
686678
bool inh, const char *colName,
687679
int behavior)
688680
{
689-
Relation oldrel, newrel, defrel;
690-
HeapTuple tuple;
691-
TupleDesc olddesc, newdesc, defdsc;
692-
int16 dropattnum, oldnumatts;
693-
Oid oldrel_oid, newrel_oid;
694-
char tmpname[NAMEDATALEN];
695-
int16 i;
696-
HeapScanDesc scan;
697-
ScanKeyData scankey;
698-
699-
if (!allowSystemTableMods && IsSystemRelationName(relationName))
700-
elog(ERROR, "ALTER TABLE: relation \"%s\" is a system catalog",
701-
relationName);
702-
#ifndef NO_SECURITY
703-
if (!pg_ownercheck(UserName, relationName, RELNAME))
704-
elog(ERROR, "ALTER TABLE: permission denied");
705-
#endif
706-
707-
oldrel = heap_openr(relationName, AccessExclusiveLock);
708-
if (oldrel->rd_rel->relkind != RELKIND_RELATION)
709-
{
710-
heap_close(oldrel, AccessExclusiveLock);
711-
elog(ERROR, "ALTER TABLE: relation %s is not a table", relationName);
712-
}
713-
714-
oldrel_oid = ObjectIdGetDatum(RelationGetRelid(oldrel));
715-
oldnumatts = RelationGetNumberOfAttributes(oldrel);
716-
717-
if (oldnumatts==1)
718-
{
719-
heap_close(oldrel, AccessExclusiveLock);
720-
elog(ERROR, "ALTER TABLE: relation %s only has one column", relationName);
721-
}
722-
723-
/* What to do here? */
724-
/*
725-
if (length(find_all_inheritors(RelationGetRelid(oldrel)))>0)
726-
elog(ERROR, "ALTER TABLE: cannot drop a column on table that is inherited from");
727-
*/
728-
/*
729-
* get the number of the attribute
730-
*/
731-
tuple = SearchSysCacheTuple(ATTNAME, oldrel_oid, NameGetDatum(namein(colName)), 0, 0);
732-
if (!HeapTupleIsValid(tuple))
733-
{
734-
heap_close(oldrel, AccessExclusiveLock);
735-
elog(ERROR, "ALTER TABLE: relation \"%s\" has no column \"%s\"",
736-
relationName, colName);
737-
}
738-
739-
dropattnum = ((Form_pg_attribute) GETSTRUCT(tuple))->attnum;
740-
741-
if (snprintf(tmpname, NAMEDATALEN, "_ATDC%s", relationName)==-1)
742-
{
743-
heap_close(oldrel, AccessExclusiveLock);
744-
elog(ERROR, "AlterTableDropColumn: relation name too long");
745-
}
746-
747-
/*
748-
* Build descriptor for new relation
749-
*/
750-
olddesc = RelationGetDescr(oldrel);
751-
752-
newdesc = CreateTemplateTupleDesc(oldnumatts-1);
753-
for(i = 1; i < dropattnum; i++)
754-
{
755-
Form_pg_attribute att = olddesc->attrs[i-1];
756-
TupleDescInitEntry(newdesc, i, nameout(&(att->attname)),
757-
att->atttypid, att->atttypmod,
758-
att->attnelems, att->attisset);
759-
/* the above function doesn't take care of these two */
760-
newdesc->attrs[i-1]->attnotnull = att->attnotnull;
761-
newdesc->attrs[i-1]->atthasdef = att->atthasdef;
762-
}
763-
764-
for(i = dropattnum; i <= oldnumatts-1; i++)
765-
{
766-
Form_pg_attribute att = olddesc->attrs[i];
767-
TupleDescInitEntry(newdesc, i, nameout(&(att->attname)),
768-
att->atttypid, att->atttypmod,
769-
att->attnelems, att->attisset);
770-
/* the above function doesn't take care of these two */
771-
newdesc->attrs[i-1]->attnotnull = att->attnotnull;
772-
newdesc->attrs[i-1]->atthasdef = att->atthasdef;
773-
}
774-
775-
/* Create the new table */
776-
newrel_oid = heap_create_with_catalog(tmpname, newdesc, RELKIND_RELATION, false);
777-
if (newrel_oid == InvalidOid)
778-
{
779-
heap_close(oldrel, AccessExclusiveLock);
780-
elog(ERROR, "ALTER TABLE: something went wrong");
781-
}
782-
783-
/* Make the new table visible */
784-
CommandCounterIncrement();
785-
786-
/*
787-
* Copy over the data
788-
*/
789-
newrel = heap_open(newrel_oid, AccessExclusiveLock);
790-
791-
scan = heap_beginscan(oldrel, false, SnapshotNow, 0, NULL);
792-
while (HeapTupleIsValid(tuple = heap_getnext(scan, 0)))
793-
{
794-
bool isnull;
795-
Datum *new_record;
796-
bool *new_record_nulls;
797-
HeapTuple new_tuple;
798-
799-
new_record = palloc((oldnumatts-1) * sizeof(*new_record));
800-
new_record_nulls = palloc((oldnumatts-1) * sizeof(*new_record_nulls));
801-
802-
for(i = 1; i < dropattnum; i++)
803-
{
804-
new_record[i-1] = heap_getattr(tuple, i, olddesc, &isnull);
805-
new_record_nulls[i-1] = isnull ? 'n' : ' ';
806-
}
807-
for(i = dropattnum+1; i <= oldnumatts; i++)
808-
{
809-
new_record[i-2] = heap_getattr(tuple, i, olddesc, &isnull);
810-
new_record_nulls[i-2] = isnull ? 'n' : ' ';
811-
}
812-
813-
new_tuple = heap_formtuple(newdesc, new_record, new_record_nulls);
814-
Assert(new_tuple);
815-
816-
if (heap_insert(newrel, new_tuple) == InvalidOid)
817-
elog(ERROR, "AlterTableDropColumn: heap_insert failed");
818-
819-
pfree(new_record);
820-
pfree(new_record_nulls);
821-
}
822-
heap_endscan(scan);
823-
824-
heap_close(newrel, NoLock);
825-
heap_close(oldrel, NoLock);
826-
827-
/*
828-
* Move defaults over to the new table
829-
*/
830-
defrel = heap_openr(AttrDefaultRelationName, AccessExclusiveLock);
831-
defdsc = RelationGetDescr(defrel);
832-
833-
/* look for all entries referencing the old table */
834-
ScanKeyEntryInitialize(&scankey, 0x0, Anum_pg_attrdef_adrelid, F_OIDEQ,
835-
ObjectIdGetDatum(oldrel_oid));
836-
scan = heap_beginscan(defrel, false, SnapshotNow, 1, &scankey);
837-
while(HeapTupleIsValid(tuple = heap_getnext(scan, false)))
838-
{
839-
HeapTuple newtuple;
840-
int2 attrnum;
841-
Relation irelations[Num_pg_attrdef_indices];
842-
843-
attrnum = ((Form_pg_attrdef) GETSTRUCT(tuple))->adnum;
844-
845-
/* remove the entry about the dropped column */
846-
if (attrnum == dropattnum)
847-
{
848-
heap_delete(defrel, &tuple->t_self, NULL);
849-
continue;
850-
}
851-
852-
newtuple = heap_copytuple(tuple);
853-
854-
if (attrnum > dropattnum)
855-
((Form_pg_attrdef) GETSTRUCT(newtuple))->adnum--;
856-
857-
/* make it point to the new table */
858-
((Form_pg_attrdef) GETSTRUCT(newtuple))->adrelid = newrel_oid;
859-
heap_update(defrel, &tuple->t_self, newtuple, NULL);
860-
861-
/* keep the system catalog indices current */
862-
CatalogOpenIndices(Num_pg_attrdef_indices, Name_pg_attrdef_indices, irelations);
863-
CatalogIndexInsert(irelations, Num_pg_attrdef_indices, defrel, newtuple);
864-
CatalogCloseIndices(Num_pg_attrdef_indices, irelations);
865-
}
866-
heap_endscan(scan);
867-
heap_close(defrel, NoLock);
868-
869-
CommandCounterIncrement();
870-
871-
/* make the old table disappear */
872-
heap_drop_with_catalog(relationName);
873-
CommandCounterIncrement();
874-
875-
/* set back original name */
876-
TypeRename(tmpname, relationName);
877-
renamerel(tmpname, relationName);
681+
elog(ERROR, "ALTER TABLE / DROP COLUMN is not implemented");
878682
}
879683

880684

0 commit comments

Comments
 (0)