Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit306ada8

Browse files
committed
Removed alter table drop column.
1 parentca5771d commit306ada8

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(constchar*relationName,
686678
boolinh,constchar*colName,
687679
intbehavior)
688680
{
689-
Relationoldrel,newrel,defrel;
690-
HeapTupletuple;
691-
TupleDescolddesc,newdesc,defdsc;
692-
int16dropattnum,oldnumatts;
693-
Oidoldrel_oid,newrel_oid;
694-
chartmpname[NAMEDATALEN];
695-
int16i;
696-
HeapScanDescscan;
697-
ScanKeyDatascankey;
698-
699-
if (!allowSystemTableMods&&IsSystemRelationName(relationName))
700-
elog(ERROR,"ALTER TABLE: relation \"%s\" is a system catalog",
701-
relationName);
702-
#ifndefNO_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_attributeatt=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_attributeatt=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-
boolisnull;
795-
Datum*new_record;
796-
bool*new_record_nulls;
797-
HeapTuplenew_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-
HeapTuplenewtuple;
840-
int2attrnum;
841-
Relationirelations[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)

[8]ページ先頭

©2009-2025 Movatter.jp